Nginx常用功能介绍

1. 简介

Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,目前互联网主流公司360、百度、新浪、腾讯、阿里等,目前中国互联网企业 70%以上公司都在使用 Nginx 作为自己的 web 服务器。Nginx 特点是占有内存少,并发能力强。

Nginx跟Apache一样都是提供Web服务功能的软件,但却通过nginx模块提供了比Apache更多更强大的功能。它采用的是事件驱动结构,使用异步套接字来接收客户端请求,是一种非阻塞结构,不使用单独的线程处理,极大的减少了服务器内存和CPU的开销

Nginx 相对于 Apache 优点: 
1) 高并发响应性能非常好,官方 Nginx 处理静态文件并发 5w/s 
2) 反向代理性能非常强。(可用于负载均衡) 
3) 内存和 cpu 占用率低。(为 Apache 的 1/5-1/10)

2. 基本架构

一个master进程生成一个或多个worker进程,每个worker基于事件驱动(epoll机制)、消息通知机制响应N个http请求

1) 多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。 
2) 一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。 
3) 推荐设置 worker 的个数为 cpu 的核数 
4) 异步非阻塞 (非阻塞不会让出cpu导致切换浪费)

3. 下载安装(Windows)

1)下载地址http://nginx.org/en/download.html 
2)解压文件夹 
3)双击运行nginx.exe 
4)访问http://localhost/出现Welcome to nginx!则表示安装成功 
注意:Windows双击运行之后会弹出窗口后再消失,这是正常现象,不要重复运行,再打开进程查看是否有nginx进程,多个进程也是正常现象(进程个数等于worker_processes + 1个)。

4. 核心文件nginx.conf(./conf/nginx.conf)常用关键字

worker_processes  1;#nginx进程,一般设置为和cpu核数一样
#工作模式及连接数上限
events {
    worker_connections  1024;#单个进程最大连接数,最大为1024
}
http {
    #设定mime类型,类型由mime.type文件定义
    include       mime.types;
    default_type  application/octet-stream;
    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
    #对于普通应用,必须设为 on,
    #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
    #以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile        on;
    #连接超时时间
    keepalive_timeout  65;
    server {  
        #端口号
        listen       8089;  
        #本机 
        server_name  localhost; 
        charset utf-8;  
        location ~ .*\.(gif|jpg|jpeg|png|pdf|zip)$ {  
			expires 24h;  
			root C:/Juson/;#指定图片存放路径   
			#图片路径 
			access_log C:/nginx-1.13.2/logs/log_test.log; 
			proxy_store on;  
			proxy_store_access user:rw group:rw all:rw;  
			#存储承载从代理服务器接收到的数据的临时文件定义目录
			proxy_temp_path         C:/Juson/;
			proxy_redirect          off;
			proxy_set_header        Host 127.0.0.1;  
			proxy_set_header        X-Real-IP $remote_addr;  
			proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;  
			client_max_body_size    10m;  
			client_body_buffer_size 1280k;  
			proxy_connect_timeout   900;  
			proxy_send_timeout      900;  
			proxy_read_timeout      900;  
			proxy_buffer_size       40k;  
			proxy_buffers           40 320k;  
			proxy_busy_buffers_size 640k;  
			proxy_temp_file_write_size 640k; 
			if ($request_filename ~* ^.*?\.(pdf)$){
                            add_header Content-Disposition: 'attachment;';
                        }
        }  
        location / {
            root   html;
            index  index.html index.htm;
        }  
        error_page  404              /404.html;  
        error_page   500 502 503 504  /50x.html;  
        location = /50x.html {  
            root   html;  
        }  
    }  
}

5. 适用场景

1)HTTP服务器 
如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

#配合webpack打包
	server {
        listen       8989;
        server_name  localhost;
        charset utf-8;
		root   html/dist;
		index  index.html;
		location ^~ /graph_server/ {
                proxy_pass    http://10.10.60.35:8888/;
        }
		location / {
				add_header 'Access-Control-Allow-Origin' '*'; #允许来自所有的访问地址
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS'; #支持请求方式
                add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
				try_files $uri $uri/ @router;
				index index.html;
        }
		
		location @router {
			   rewrite ^.*$ /index.html last;
		}
    }

2)静态资源服务器

在公司中经常会遇到静态服务器,通常会提供一个上传的功能,其他应用如果需要静态资源就从该静态服务器中获取。

server {  
        #端口号
        listen       8089;  
        #本机 
        server_name  localhost; 
        charset utf-8;  
        location ~ .*\.(gif|jpg|jpeg|png|pdf|zip)$ {  
			expires 24h;  
			root C:/Juson/;#指定图片存放路径   
			#图片路径 
			access_log C:/nginx-1.13.2/logs/log_test.log; 
			proxy_store on;  
			proxy_store_access user:rw group:rw all:rw;  
			proxy_temp_path         C:/Juson/;
			proxy_redirect          off;
			proxy_set_header        Host 127.0.0.1;  
			proxy_set_header        X-Real-IP $remote_addr;  
			proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;  
			client_max_body_size    10m;  
			client_body_buffer_size 1280k;  
			proxy_connect_timeout   900;  
			proxy_send_timeout      900;  
			proxy_read_timeout      900;  
			proxy_buffer_size       40k;  
			proxy_buffers           40 320k;  
			proxy_busy_buffers_size 640k;  
			proxy_temp_file_write_size 640k; 
			if ($request_filename ~* ^.*?\.(pdf)$){
                            add_header Content-Disposition: 'attachment;';
                        }
        }  
        location / {
            root   html;
            index  index.html index.htm;
        }  
        error_page  404              /404.html;  
        error_page   500 502 503 504  /50x.html;  
        location = /50x.html {  
            root   html;  
        }  
    }

3)跨域 

前端js中,我们常常遇到XMLHttpRequest cannot loadhttp://www.zjblogs.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.跨域请求错误。如果用Nginx来解决,那就非常简单了。

location ^~ /liems/ {
                add_header 'Access-Control-Allow-Origin' '*'; #允许来自所有的访问地址
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS'; #支持请求方式
                add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
                proxy_pass    http://192.168.13.80:6001/Liems/;
        }

4)正向代理 

正向代理类似一个跳板机,代理访问外部资源。

正向代理的用途: 
1. 访问原来无法访问的资源,如google 
2. 可以做缓存,加速访问资源 
3. 对客户端访问授权,上网进行认证 
4. 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

server {
        listen       80;
        server_name  localhost;
        resolver 114.114.114.114 8.8.8.8; #指定DNS服务器IP地址
        location / {
            proxy_pass    http://$http_host$request_uri;
        }
    }

除此之外还要在客户端配置访问代理,IE浏览器-->工具-->Intent 选项-->连接-->局域网设置(如下图)

5)反向代理 
反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。 
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。 

反向代理的用途: 
1. 保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击 
2. 负载均衡,通过反向代理服务器来优化网站的负载

#这里的域名要和下面proxy_pass的一样
upstream  fengzp.com {   
    server    192.168.99.100:42000  weight=1; 
    server    192.168.99.100:42001  weight=2;  
}     
server {  
    listen       80; 
    server_name  192.168.99.100;  
location / {  
        proxy_pass http://fengzp.com;  
        proxy_redirect default;  
    }  
    error_page   500 502 503 504  /50x.html;  
    location = /50x.html {  
        root   html;  
    }  
}

6)代理数据库(需要1.9版本以上)

stream {
    upstream backend {
        server 127.0.0.1:3306;
    }
    server {
        listen 8081;
        proxy_connect_timeout 8s;
        proxy_timeout 24h;
        proxy_pass backend;
    }
}

7)代理 TCP/IP 协议,典型的是 socket 通信

stream {
    upstream test-server {
        server 192.168.1.249:13000;
    }
    server {
        #so_keepalive=on 保证连接持续
        listen 8191 so_keepalive=on;
        #listen 12000;
        # proxy_connect_timeout 1s;
        #   # proxy_timeout 3s;
        proxy_pass test-server;
    }
}

8)思考? 
服务器A(有公网IP 130.130.130.130,内网IP 192.168.10.2),服务器B(内网IP 192.168.10.3,部署了应用服务),现在APP需要调用内网服务,WEB应用也需要调用内网服务,资源文件也需要在外网访问,并且服务器A只能开通一个端口,怎样合理部署Nginx呢?

可以通过 Nginx 路径匹配规则,通配符来分别路由。具体可以参考https://blog.csdn.net/jy02149522/article/details/79066574

猜你喜欢

转载自blog.csdn.net/weixin_38250518/article/details/88570159