nginx配置-最佳实践
# 最佳实践
# 静态Http服务器配置
首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。 配置:
server {
listen 80; # 端口
server_name localhost 192.168.1.49; # 域名,访问俩都行
location / { # 代表这是项目根目录
root /usr/share/nginx/www; # 虚拟目录
}
}
2
3
4
5
6
7
# 反代配置
既然服务器可以直接HTTP访问,为什么要在中间加上一个反向代理,不是多此一举吗?反向代理有什么作用?继续往下看,下面的负载均衡、虚拟主机,都基于反向代理实现,当然反向代理的功能也不仅仅是这些。
server {
listen 80;
location / {
proxy_pass http://192.168.1.49:15000; # 应用服务器HTTP地址
}
}
2
3
4
5
6
# 反代-负载均衡
Nginx将用户的请求分配给不同的服务器,确保负载均衡,让网站能够更高效地应对大量用户访问。类似于餐馆前台服务员的作用,他们将点餐分发给不同的厨师,以确保餐厅的服务高效而流畅。
- 好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。
- 请求分配给多台机器处理,效率提升。
upstream myapp {
ip_hash; # 固定访客
server 192.168.0.1:8080 weight=9; # 应用服务器1
server 192.168.0.2:8080 weight=1; # 应用服务器2
}
2
3
4
5
# 反代-虚拟主机
有的网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。
想象你有一台大型厨房,但你需要同时为两个不同的晚宴准备食物,一个是意大利面宴会,另一个是墨西哥风味晚宴。你可以将一台大型餐桌分成两部分,一部分用于准备意大利面,另一部分用于准备墨西哥风味食物。
尽管你在同一个厨房工作,但你可以根据不同的需求和食谱,为两个晚宴分别准备食物,而不会相互干扰。就像虚拟主机一样,两个域名(意大利面宴会和墨西哥风味晚宴)都指向同一台服务器(厨房),但服务器根据域名的不同,能够提供不同的网站内容,就像在同一个厨房中制作不同的美食一样。这使得你可以在一台服务器上为多个网站提供服务,降低了成本和资源的浪费。
server { # ----------------------- 这个服务器块的作用是拒绝所有未匹配到其他域名的请求。------------------------
listen 80 default_server;
server_name _;
return 444; # 过滤其他域名的请求,返回444状态码
}
server { # ----------------------- 这个服务器块的作用是将请求代理到本地的 localhost 主机的端口 8080 ------------------------
listen 80;
server_name www.aaa.com; # www.aaa.com域名
location / {
proxy_pass http://localhost:8080; # 对应端口号8080
}
}
server { # ----------------------- 这个服务器块的作用是将请求代理到本地的 localhost 主机的端口 8081 ------------------------
listen 80;
server_name www.bbb.com; # www.bbb.com域名
location / {
proxy_pass http://localhost:8081; # 对应端口号8081
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
在服务器8080和8081分别开了一个应用,客户端通过不同的域名访问,根据server_name可以反向代理到对应的应用服务器。
虚拟主机的原理是通过HTTP请求头中的Host是否匹配server_name来实现的,有兴趣的同学可以研究一下HTTP协议。
另外,server_name配置还可以过滤有人恶意将某些域名指向你的主机服务器。
- 只有来自
www.example.com
的请求会被Nginx接受和代理到localhost:8080
。 - 如果其他域名(例如恶意域名)尝试访问该Nginx服务器,Nginx会忽略这些请求或返回默认服务器的响应,这是一种防止未经授权的访问的方法。
# 标准模板
所有自定义的配置都基于下面的来改
注意配置时候,这里有一个小坑就是在写文件路径的时候,如果是绝对路径,要双杠
\\
。
worker_processes auto; # 根据内核确定工作进程数
events {
worker_connections 1024; # 设置每个工作进程的最大连接数
}
http {
client_max_body_size 10000m; # 设置客户端请求的最大单个文件字节数(重写之后就会失效)
include mime.types; # 确定文件的MIME类型。这有助于浏览器和其他HTTP客户端正确解释文件,例如将HTML文件识别为HTML、图像文件识别为图像等
default_type application/octet-stream; # 默认MIME类型
# 自定义日志格式
log_format main escape=json '{ "@timestamp": "$time_iso8601", '
'"remote_addr": "$remote_addr",'
'"costime": "$request_time",'
'"realtime": "$upstream_response_time",'
'"status": $status,'
'"x_forwarded": "$http_x_forwarded_for",'
'"referer": "$http_referer",'
'"request": "$request",'
'"upstr_addr": "$upstream_addr",'
'"bytes":$body_bytes_sent,'
'"dm":$request_body,'
'"agent": "$http_user_agent" }';
sendfile on; # 配置on让sendfile发挥作用,将文件的回写过程交给数据缓冲去去完成,而不是放在应用中完成,这样的话在性能提升有有好处
keepalive_timeout 65; # 给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好
server {
listen 15000;
server_name localhost;
client_max_body_size 1024m;
proxy_buffers 4 1024k;
proxy_buffer_size 1024k;
# ------------------- 配置静态资源 -------------------
location / {
root html/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
error_page 405 =200 $request_uri;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
}
# ------------------- 代理:转发特定的HTTP请求到另一个服务器上 -------------------
location /api/base {
rewrite ^/api/base/(.*)$ /$1 break; # 将所有匹配 /api/base/ 后的路径部分捕获((.*)),然后将其重写为根路径(/$1),break 表示停止匹配其他规则并执行代理操作。
proxy_pass http://127.0.0.1:27405; # 将所有匹配 /api/base 的请求转发到 http://127.0.0.1:27405
proxy_connect_timeout 15s;
proxy_send_timeout 6000s;
proxy_read_timeout 6000s;
proxy_set_header X-Forwarded-Proto http;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# ------------------- 代理:转发特定的HTTP请求到另一个服务器上 -------------------
location /api/user {
rewrite ^/api/user/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:27403;
proxy_connect_timeout 15s;
proxy_send_timeout 6000s;
proxy_read_timeout 6000s;
proxy_set_header X-Forwarded-Proto http;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /api {
proxy_pass http://127.0.0.1:27480;
proxy_connect_timeout 15s;
proxy_send_timeout 6000s;
proxy_read_timeout 6000s;
proxy_set_header X-Forwarded-Proto http;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /q/swagger-ui {
proxy_pass http://127.0.0.1:27401/q/swagger-ui;
}
}
# 配置日志反向代理服务
server {
listen 15002;
server_name jenkins_log;
root D:\APP\script\log;
types { # 以文本形式在浏览器中打开.log后缀的文件
text/plain log;
}
}
# 配置文档下载服务
server {
listen 15003;
server_name server_name222222222;
root D:\AAAAAA\\release;
location / {
autoindex on;
index index.html;
try_files $uri $uri/ =404;
}
}
}
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106