Nginx配置详解

Nginx配置详解✈️✈️✈️

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# 用户和工作进程配置
user www-data; # Nginx 进程使用的用户,通常为www-data,确保Nginx以低权限用户运行。
worker_processes auto; # 根据系统的CPU核心数量自动设置工作进程数,优化性能。
pid /run/nginx.pid; # 存储Nginx主进程的PID文件路径。

# 错误日志配置
error_log /var/log/nginx/error.log warn; # 错误日志路径和日志级别。warn记录较重要的警告信息,其他级别包括debug、info等。

events {
worker_connections1024; # 每个worker进程允许的最大并发连接数,通常与性能优化有关。
}

http {
# 基本设置
include /etc/nginx/mime.types; # 包含标准的MIME类型文件,用于正确处理不同类型的文件。
default_type application/octet-stream; # 默认MIME类型,如果无法识别文件类型,将其作为二进制流处理。

# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status$body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 定义日志格式,记录客户端IP、用户、请求时间、请求状态、发送数据字节、引用页面、用户代理、转发IP等信息。

access_log /var/log/nginx/access.log main; # 访问日志存放路径,使用main格式记录。

# 发送文件优化
sendfileon; # 使用sendfile系统调用来发送文件,提高文件传输效率。
tcp_nopushon; # 优化TCP数据包的发送,减少延迟。
tcp_nodelayon; # 禁止Nagle算法,确保数据包立即发送,适用于小数据包的场景。

# 保持连接超时
keepalive_timeout65; # 设置保持连接的超时时间,65秒后关闭空闲连接。

# Gzip压缩配置,用于压缩传输内容,减少带宽消耗
gzipon; # 启用Gzip压缩。
gzip_disable"msie6"; # 针对旧版本IE浏览器禁用Gzip。
gzip_varyon; # 根据客户端是否支持Gzip,发送相应的Vary头信息。
gzip_proxied any; # 允许代理服务器压缩任何请求。
gzip_comp_level6; # Gzip压缩级别,数值越高压缩率越大,但处理速度较慢,通常6是比较合理的设置。
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 指定需要进行Gzip压缩的内容类型,包括HTML、CSS、JSON、XML等文本类文件。

# 安全头部配置,增强HTTP响应的安全性
add_header X-Frame-Options "SAMEORIGIN" always; # 防止网站被嵌入到iframe中,避免点击劫持攻击。
add_header X-XSS-Protection "1; mode=block" always; # 启用浏览器的XSS攻击防护。
add_header X-Content-Type-Options "nosniff" always; # 防止浏览器猜测文件的MIME类型,减少代码注入攻击风险。
add_header Referrer-Policy "no-referrer-when-downgrade" always; # 控制HTTP引用的策略,限制敏感信息的泄漏。
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
# 定义内容安全策略,限制外部资源加载,防止跨站脚本(XSS)等攻击。

# SSL设置,确保HTTPS连接的安全性
ssl_protocols TLSv1.2 TLSv1.3; # 仅启用安全的TLS版本,禁用过时的版本如TLS 1.0和1.1。
ssl_prefer_server_cipherson; # 优先使用服务器端的加密套件。
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
# 安全的SSL加密套件,使用ECDHE和DHE实现前向保密,确保数据传输的安全性。

ssl_session_cache shared:SSL:10m; # 启用SSL会话缓存,减少重复SSL握手的开销。
ssl_session_timeout1d; # 会话缓存的过期时间设置为1天。
ssl_session_ticketsoff; # 禁用会话票据以提高安全性。

ssl_dhparam /etc/nginx/dhparam.pem; # 使用预生成的Diffie-Hellman参数文件,增强SSL/TLS安全性。

# OCSP Stapling,减少SSL握手的时间并提高安全性
ssl_staplingon; # 启用OCSP Stapling,减少证书状态检查的延迟。
ssl_stapling_verifyon; # 启用Stapling时,验证OCSP响应的真实性。
resolver8.8.8.88.8.4.4 valid=300s; # 配置DNS解析器,指定Google的公共DNS服务。
resolver_timeout5s; # DNS解析超时时间为5秒。

# 负载均衡配置,定义后端服务器池
upstream backend {
server127.0.0.1:8080 max_fails=3 fail_timeout=30s; # 定义后端服务器和健康检查机制。
server127.0.0.1:8081 max_fails=3 fail_timeout=30s; # 第二台后端服务器。
server127.0.0.1:8082 max_fails=3 fail_timeout=30s; # 第三台后端服务器。
}

# HTTP服务器块,用于处理80端口的HTTP请求
server {
listen80; # 监听80端口,处理HTTP请求。
server_name example.com www.example.com; # 服务器的域名。

# HTTP重定向到HTTPS
return301 https://$server_name$request_uri; # 将所有HTTP请求永久重定向到HTTPS。
}

# HTTPS服务器块,用于处理443端口的HTTPS请求
server {
listen443 ssl http2; # 监听443端口,启用SSL和HTTP/2。
listen443 quic reuseport; # 启用QUIC和HTTP/3支持
add_header Alt-Svc 'h3-23=":443"; ma=86400'; # 提供HTTP/3的支持提示

server_name example.com www.example.com; # 服务器的域名。

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # SSL证书路径。
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # SSL证书密钥路径。

# 根目录
root /var/www/example.com; # 网站根目录,提供静态资源。
index index.html index.htm index.php; # 默认访问的文件列表。

# 自定义错误页面
error_page404 /404.html; # 当404错误发生时,使用指定的页面。
error_page500502503504 /50x.html; # 当服务器发生错误时,使用指定页面。

# 反向代理到后端应用
location / {
proxy_pass http://backend; # 将所有请求转发到定义的后端服务器池。
proxy_http_version1.1; # 使用HTTP 1.1进行代理,以支持长连接。
proxy_set_header Upgrade $http_upgrade; # 支持WebSocket协议升级。
proxy_set_header Connection 'upgrade'; # 设置连接头部为upgrade以支持WebSocket。
proxy_set_header Host $host; # 保持请求头中的Host不变。
proxy_cache_bypass$http_upgrade; # 在升级连接时不使用缓存。
proxy_set_header X-Real-IP $remote_addr; # 传递客户端的真实IP地址给后端服务器。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 添加X-Forwarded-For头部以记录客户端IP。
proxy_set_header X-Forwarded-Proto $scheme; # 传递请求的协议(HTTP或HTTPS)。
}

# 静态文件处理,设置缓存时间
location~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires30d; # 缓存静态文件30天,减少服务器负载。
add_header Cache-Control "public, no-transform"; # 设置Cache-Control头,允许代理服务器缓存文件。
}

# 禁止访问隐藏文件
location~ /\. {
deny all; # 禁止访问以"."开头的隐藏文件(如.git、.htaccess等)。
access_logoff; # 不记录隐藏文件的访问日志。
log_not_foundoff; # 不记录找不到隐藏文件的日志。
}

# PHP-FPM配置(如果需要使用PHP)
#location ~ \.php$ {
# fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # 将PHP请求转发到PHP-FPM处理。
# fastcgi_index index.php; # 默认的PHP文件为index.php。
# include fastcgi_params; # 包含FastCGI的相关配置。
#}
}

# 速率限制配置,防止DDoS攻击或暴力破解
limit_req_zone$binary_remote_addr zone=one:10m rate=10r/s; # 限制每秒请求数量为10次
server {
location / {
limit_req zone=one burst=5 nodelay; # 超过限制时立即拒绝请求
}
}

# FastCGI缓存配置,用于动态内容缓存,提升性能
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=FASTCGI_CACHE:100m inactive=60m;
fastcgi_cache_key"$scheme$request_method$host$request_uri";

server {
location~ \.php$ {
fastcgi_cache FASTCGI_CACHE; # 启用FastCGI缓存
fastcgi_cache_valid20030210m; # 200和302状态的响应缓存10分钟
fastcgi_cache_valid4041m; # 404状态的响应缓存1分钟
add_header X-Fastcgi-Cache $upstream_cache_status; # 添加缓存命中状态头
}
}

# 限制上传文件大小,防止过大文件导致服务器资源耗尽
client_max_body_size10M; # 设置上传文件的最大大小为10MB

# 跨域资源共享(CORS)设置,允许跨域请求
add_header'Access-Control-Allow-Origin''*'; # 允许所有来源的跨域请求
}

Nginx配置详解
http://www.ublanco.com/Nginx配置详解/
作者
Blanco
发布于
2024年10月1日
许可协议