Nginx

Posted by deng liuyan on June 24, 2018

介绍nginx一些知识点,最后给出实战例子;

nginx简单使用

修改配置文件nginx.conf;

nginx -s reload 重新加载(Nginx热部署)

nginx -t检查配置

nginx -s stop

正向代理与反向代理

nginx,经常被提及反向代理服务器功能。

由于防火墙的原因,我们并不能直接访问谷歌,那么我们可以借助VPN来实现,这就是一个简单的正向代理的例子。这里你能够发现,正向代理“代理”的是客户端,而且客户端是知道目标的,而目标是不知道客户端是通过VPN访问的。

当我们在外网访问百度的时候,其实会进行一个转发,代理到内网去,这就是所谓的反向代理,即反向代理“代理”的是服务器端,而且这一个过程对于客户端而言是透明的。

当我们访问web时候,前端会通过nginx 反向代理到后端服务器,并将请求结果返回给前端,前端返回给用户。这就是反向代理。

其他功能

负载均衡【upstream】

缓存,可以加快访问速度的机制,说白了,在配置上就是一个开启,同时指定目录,让缓存可以存储到磁盘上。

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#失败重试机制设置,当upstream里第一台server出现502,自动转入第二台;
#使用uwsgi时不需要设置
proxy_next_upstream http_502;

#nginx请求后台的超时时间,若是后台某个服务处理时间超过60s,则uwsgi关闭连接,返回超时,但是后台仍将请求执行结束;
uwsgi_read_timeout 60;

#uwsgi失败重试机制设置,当upstream里第一台server出现error,自动转入第二台;
#默认为uwsgi_next_upstream error timeout;
uwsgi_next_upstream error;

#配置后台服务器,默认第一台执行
upstream uwsgi_server {
    $SERVER1
    $SERVER2
}

#配置log路径
access_log  /var/log/nginx/SchoolBuy_access.log;
error_log   /var/log/nginx/SchoolBuy_error.log;

#配置80端口,http,进入前端界面
server {
    listen 80;
    server_name proxy;
    # rewrite ^(.*) https://$PROXY\$1 permanent;
    location / {
        root /usr/share/nginx/html;
    }
}

#配置443端口,https,进入后台https请求,uwsgi_pass至后台服务;
server {
    listen 443 ssl default;
    server_name proxy;

    ssl_certificate /etc/nginx/nginx.crt;
    ssl_certificate_key /etc/nginx/nginx.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
    ssl_prefer_server_ciphers on;

    charset utf-8;

    #最大上传200M文件
    client_max_body_size 200M;

    location /static {
        root /usr/share/nginx/html;
    }

    location / {
        #设置跨域
        set \$cors "allow";
        if (\$request_method = "OPTIONS") {
            set \$cors "\${cors}options";
        }
        if (\$cors = "allowoptions") {
            add_header 'Access-Control-Allow-Origin' "\$http_origin";
            add_header 'Access-Control-Allow-Credentials' "true";
            add_header 'Access-Control-Max-Age' 86400;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE';
            add_header 'Access-Control-Allow-Headers' 'reqid, nid, host, x-real-ip, x-forwarded-ip, event-type, event-id, accept, content-type';
            add_header 'Content-Length' 0;
            add_header 'Content-Type' 'text/plain, charset=utf-8';
            return 200;
        }
        
        #nginx设置当前服务器为代理服务器,支持uwsgi协议,向后台请求
        uwsgi_pass uwsgi_server;
        include     /etc/nginx/conf/uwsgi_params;

        #Proxy Settings,配置了uwsgi可不用
        proxy_redirect off;
        proxy_set_header Host \$host;
        proxy_set_header X-Real-IP \$remote_addr;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
        proxy_buffer_size 4k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
    }
}

当后台服务超时,uwsgi关闭与nginx连接时,会自动向第二个后台发送请求,这就导致了一个请求,两次运行,设置uwsgi_next_upstream error(默认uwsgi_next_upstream error timeout),这样超时后就不会再向第二个后台发送请求。