介绍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),这样超时后就不会再向第二个后台发送请求。