一、引言
Nginx,作为一款高性能的HTTP和反向代理服务器,已成为现代互联网架构的基石。它凭借其高并发、低内存占用以及无与伦比的稳定性,在全球范围内被广泛使用。其核心作用主要体现在三个方面:
反向代理:作为客户端和后端服务器之间的中介,隐藏真实服务器,实现请求的转发和安全控制。
负载均衡:将海量客户端请求分发到多个后端服务器,避免单点故障,提升系统吞吐量和可用性。
静态资源服务:高效处理静态文件(如HTML、CSS、JS、图片),因其高效的文件I/O模型而性能卓越。
所有这些功能都通过一个核心文件来定义——nginx.conf。此配置文件采用分层的、基于块的指令系统,理解其结构是掌握Nginx的关键。
二、配置文件基础架构
一个标准的nginx.conf文件遵循清晰的层级结构,从外到内依次是:
图片
main (全局块)├── events (Events块)└── http (HTTP块) ├── ... (HTTP全局配置) └── server (Server块) ├── ... (Server全局配置) └── location (Location块)
main (全局块)
├── events (Events块)
└── http (HTTP块)
├── ... (HTTP全局配置)
└── server (Server块)
├── ... (Server全局配置)
└── location (Location块)1. 全局块(Global Block)
这是配置文件的顶层上下文,设置的指令影响Nginx的整体运行。
user nginx nginx; # 定义运行Nginx进程的用户和组worker_processes auto; # 工作进程数,通常设置为CPU核心数或`auto`error_log /var/log/nginx/error.log warn; # 错误日志路径及级别pid /var/run/nginx.pid; # 存储主进程ID的文件worker_rlimit_nofile 65535; # 一个进程能打开的最大文件描述符数
user nginx nginx; # 定义运行Nginx进程的用户和组
worker_processes auto; # 工作进程数,通常设置为CPU核心数或`auto`
error_log /var/log/nginx/error.log warn; # 错误日志路径及级别
pid /var/run/nginx.pid; # 存储主进程ID的文件
worker_rlimit_nofile 65535; # 一个进程能打开的最大文件描述符数2. Events块(Events Block)
此块用于配置网络连接相关的参数,直接影响Nginx的并发处理能力。
events { worker_connections 1024; # 每个工作进程的最大并发连接数 use epoll; # 在Linux上使用高效的事件模型epoll multi_accept on; # 允许一个工作进程同时接受多个新连接}
events {
worker_connections 1024; # 每个工作进程的最大并发连接数
use epoll; # 在Linux上使用高效的事件模型epoll
multi_accept on; # 允许一个工作进程同时接受多个新连接
}最大客户端连接数估算公式:
worker_processes * worker_connections3. HTTP块(HTTP Block)
这是Nginx HTTP功能配置的核心,所有与HTTP服务相关的指令都在此块中或嵌套其中。
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"'; access_log /var/log/nginx/access.log main; # 访问日志路径和格式 # 性能相关 sendfile on; # 启用高效文件传输 tcp_nopush on; # 在sendfile模式下,确保数据包被完整填充再发送 keepalive_timeout 65; # 客户端长连接超时时间 gzip on; # 开启Gzip压缩,减少传输数据量 gzip_types text/plain text/css application/json; # 指定压缩类型 # 后续的server块将在此定义 include /etc/nginx/conf.d/*.conf; # 引入其他server配置,便于模块化管理}4. Server块(Server Block)此块用于定义一个虚拟主机,可以基于不同的域名或IP来提供不同的服务。server { listen 80; # 监听端口 server_name example.com www.example.com; # 绑定的域名,支持通配符和正则 root /usr/share/nginx/html; # 该虚拟主机的根目录 index index.html index.htm; # 默认索引文件 # 在此可以定义多个location块}
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"';
access_log /var/log/nginx/access.log main; # 访问日志路径和格式
# 性能相关
sendfile on; # 启用高效文件传输
tcp_nopush on; # 在sendfile模式下,确保数据包被完整填充再发送
keepalive_timeout 65; # 客户端长连接超时时间
gzip on; # 开启Gzip压缩,减少传输数据量
gzip_types text/plain text/css application/json; # 指定压缩类型
# 后续的server块将在此定义
include /etc/nginx/conf.d/*.conf; # 引入其他server配置,便于模块化管理
}
4. Server块(Server Block)
此块用于定义一个虚拟主机,可以基于不同的域名或IP来提供不同的服务。
server {
listen 80; # 监听端口
server_name example.com www.example.com; # 绑定的域名,支持通配符和正则
root /usr/share/nginx/html; # 该虚拟主机的根目录
index index.html index.htm; # 默认索引文件
# 在此可以定义多个location块
}5. Location块(Location Block)
这是最灵活的配置单元,用于根据请求的URI进行精细化的路由和控制。其匹配规则和优先级是重点。
location [ = | ~ | ~* | ^~ ] /uri/ { # 配置指令}
location [ = | ~ | ~* | ^~ ] /uri/ {
# 配置指令
}=:精确匹配。location = /login只匹配/login请求。^~:前缀匹配,如果匹配成功,则不再进行正则匹配。~:区分大小写的正则匹配。~*:不区分大小写的正则匹配。- 无符号:普通前缀匹配。
优先级规则:=〉 ^~ 〉 按配置文件中的顺序(正则)〉 普通前缀匹配
示例:
location /images/ { # 匹配以 /images/ 开头的任何请求 alias /data/static/images/;}location ~* \.(gif|jpg|jpeg)$ { # 不区分大小写地匹配常见图片格式 expires 30d; # 设置浏览器缓存 add_header Cache-Control "public";}location = /admin { # 只精确匹配 /admin deny all; # 禁止访问 return 403;}
location /images/ {
# 匹配以 /images/ 开头的任何请求
alias /data/static/images/;
}
location ~* \.(gif|jpg|jpeg)$ {
# 不区分大小写地匹配常见图片格式
expires 30d; # 设置浏览器缓存
add_header Cache-Control "public";
}
location = /admin {
# 只精确匹配 /admin
deny all; # 禁止访问
return 403;
}三、实战场景与配置示例
1. 反向代理配置
将请求转发到后端应用服务器(如Tomcat, Node.js, Django等)。
server { listen 80; server_name app.example.com; location / { proxy_pass http://backend_server; # 指向upstream或具体地址 proxy_set_header Host $host; # 传递原始请求的Host头 proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 追加代理IP链 proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议(http/https) # 超时控制 proxy_connect_timeout 30s; proxy_read_timeout 60s; proxy_send_timeout 60s; }}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_server; # 指向upstream或具体地址
proxy_set_header Host $host; # 传递原始请求的Host头
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 追加代理IP链
proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议(http/https)
# 超时控制
proxy_connect_timeout 30s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}2. 负载均衡策略
使用upstream块定义后端服务器组,并选择不同的负载均衡算法。
http { upstream backend_server { # 1. 轮询(默认) # server 192.168.1.101:8080; # server 192.168.1.102:8080; # 2. 加权轮询 server 192.168.1.101:8080 weight=3; # 处理3倍请求 server 192.168.1.102:8080 weight=1; # 3. IP哈希(保证同一客户端访问固定后端,解决会话保持) # ip_hash; # 4. 最少连接数 # least_conn; # 健康检查(需要nginx-plus或集成第三方模块,如ngx_http_upstream_check_module) # server 192.168.1.103:8080 backup; # 备份服务器,当其他都不可用时启用 } server { listen 80; server_name app.example.com; location / { proxy_pass http://backend_server; } }}
http {
upstream backend_server {
# 1. 轮询(默认)
# server 192.168.1.101:8080;
# server 192.168.1.102:8080;
# 2. 加权轮询
server 192.168.1.101:8080 weight=3; # 处理3倍请求
server 192.168.1.102:8080 weight=1;
# 3. IP哈希(保证同一客户端访问固定后端,解决会话保持)
# ip_hash;
# 4. 最少连接数
# least_conn;
# 健康检查(需要nginx-plus或集成第三方模块,如ngx_http_upstream_check_module)
# server 192.168.1.103:8080 backup; # 备份服务器,当其他都不可用时启用
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_server;
}
}
}3. SSL/TLS部署
启用HTTPS,保障数据传输安全。
server { listen 443 ssl http2; # 启用HTTP/2以提升性能 server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; # 证书文件路径 ssl_certificate_key /etc/nginx/ssl/example.com.key; # 私钥文件路径 # 安全强化配置 ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的TLS版本 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 强制HTTPS重定向(可选,在另一个server块中) # server { # listen 80; # server_name example.com; # return 301 https://$server_name$request_uri; # } location / { root /usr/share/nginx/html; index index.html; }}
server {
listen 443 ssl http2; # 启用HTTP/2以提升性能
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt; # 证书文件路径
ssl_certificate_key /etc/nginx/ssl/example.com.key; # 私钥文件路径
# 安全强化配置
ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的TLS版本
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 强制HTTPS重定向(可选,在另一个server块中)
# server {
# listen 80;
# server_name example.com;
# return 301 https://$server_name$request_uri;
# }
location / {
root /usr/share/nginx/html;
index index.html;
}
}4. 访问控制与限流
保护服务免受滥用和攻击。
# IP黑白名单location /admin/ { allow 192.168.1.0/24; # 允许内网IP段 allow 203.0.113.1; # 允许特定IP deny all; # 拒绝其他所有IP return 403;}# 请求速率限制(限流)http { limit_req_zone $binary_remote_addr znotallow=api:10m rate=10r/s; # 定义限流zone server { location /api/ { limit_req znotallow=api burst=20 nodelay; # 应用限流 proxy_pass http://api_backend; # 超过频率限制返回429 limit_req_status 429; } }}# 连接数限制http { limit_conn_zone $binary_remote_addr znotallow=addr:10m; server { location /download/ { limit_conn addr 1; # 同一IP同时只能有1个下载连接 } }}
# IP黑白名单
location /admin/ {
allow 192.168.1.0/24; # 允许内网IP段
allow 203.0.113.1; # 允许特定IP
deny all; # 拒绝其他所有IP
return 403;
}
# 请求速率限制(限流)
http {
limit_req_zone $binary_remote_addr znotallow=api:10m rate=10r/s; # 定义限流zone
server {
location /api/ {
limit_req znotallow=api burst=20 nodelay; # 应用限流
proxy_pass http://api_backend;
# 超过频率限制返回429
limit_req_status 429;
}
}
}
# 连接数限制
http {
limit_conn_zone $binary_remote_addr znotallow=addr:10m;
server {
location /download/ {
limit_conn addr 1; # 同一IP同时只能有1个下载连接
}
}
}四、性能优化技巧
1. 关键参数调优
# 全局块worker_processes auto; # 与CPU核心数绑定worker_rlimit_nofile 65535; # 提高文件描述符限制events { worker_connections 65535; # 提高单进程连接数 use epoll; # Linux高效事件模型 multi_accept on;}http { sendfile on; tcp_nopush on; tcp_nodelay on; # 禁用Nagle算法,提高实时性 keepalive_timeout 30; # 适当调整长连接超时 keepalive_requests 1000; # 一个长连接可处理的请求数 # 关闭不必要或敏感的版本信息 server_tokens off;}
# 全局块
worker_processes auto; # 与CPU核心数绑定
worker_rlimit_nofile 65535; # 提高文件描述符限制
events {
worker_connections 65535; # 提高单进程连接数
use epoll; # Linux高效事件模型
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on; # 禁用Nagle算法,提高实时性
keepalive_timeout 30; # 适当调整长连接超时
keepalive_requests 1000; # 一个长连接可处理的请求数
# 关闭不必要或敏感的版本信息
server_tokens off;
}2. 日志管理
日志分割:使用logrotate工具或自定义脚本,避免日志文件过大。
格式自定义:根据需求记录关键字段,避免记录无用信息消耗I/O。
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" "$request_time"' '"$http_user_agent" "$http_x_forwarded_for"';# 注意添加了$request_time,用于分析请求处理耗时
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$request_time"'
'"$http_user_agent" "$http_x_forwarded_for"';
# 注意添加了$request_time,用于分析请求处理耗时3. 缓存策略
代理缓存:缓存后端应用的响应。
http { proxy_cache_path /var/cache/nginx levels=1:2 keys_znotallow=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { location / { proxy_cache my_cache; proxy_cache_key "$scheme$request_method$host$request_uri"; proxy_cache_valid 200 302 10m; # 200和302状态码缓存10分钟 proxy_cache_valid 404 1m; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; add_header X-Cache-Status $upstream_cache_status; # 在响应头中显示缓存命中状态 proxy_pass http://backend; } }}
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_znotallow=my_cache:10m
max_size=10g inactive=60m use_temp_path=off;
server {
location / {
proxy_cache my_cache;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 10m; # 200和302状态码缓存10分钟
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
add_header X-Cache-Status $upstream_cache_status; # 在响应头中显示缓存命中状态
proxy_pass http://backend;
}
}
}浏览器缓存:通过设置expires和Cache-Control头,让浏览器缓存静态资源。
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 1y; # 缓存1年 add_header Cache-Control "public, immutable";}
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y; # 缓存1年
add_header Cache-Control "public, immutable";
}五、常见问题排查
1. 配置文件语法检查
在重启Nginx前,建议进行语法检查。
nginx -t
# 输出:nginx: configuration file /etc/nginx/nginx.conf test is successful
nginx -t
# 输出:nginx: configuration file /etc/nginx/nginx.conf test is successful
2. 热重载
修改配置后,无需停止服务即可应用新配置。
# 重新加载配置(推荐)需要到nginx根目录 /usr/sbin/nginx -s reloadnginx -s reload# 或者使用systemdsystemctl reload nginx
# 重新加载配置(推荐)需要到nginx根目录 /usr/sbin/nginx -s reload
nginx -s reload
# 或者使用systemd
systemctl reload nginx执行命令后Nginx主进程发送HUP信号,主进程会检查新配置的语法,然后启动新的工作进程,并优雅地关闭旧的工作进程。
3. 常见的错误处理
403 Forbidden:
图片
检查root目录路径是否正确。
检查文件权限和user指令指定的用户是否有读取权限。
检查index文件是否存在。
502 Bad Gateway:
图片
后端服务是否启动并正常运行。
proxy_pass指向的地址和端口是否正确。
防火墙规则是否阻止了Nginx到后端的连接。
后端应用处理超时(检查proxy_read_timeout)。
504 Gateway Timeout:
图片
后端服务处理时间过长,增加proxy_read_timeout值。
后端服务器资源(CPU、内存、数据库连接)耗尽。
六、高级功能与扩展
1. 动态配置管理
OpenResty:基于Nginx,集成了LuaJIT,允许使用Lua脚本在Nginx的各个处理阶段(如访问、内容、日志)实现复杂业务逻辑,实现动态路由、认证、限流等。
Consul-Template:与Consul服务发现集成,可以根据服务注册中心的变动,自动生成Nginx的Upstream配置并触发重载。
2. 安全加固实践
防止信息泄露:server_tokens off; 隐藏Nginx版本号。
安全头设置:
add_header X-Frame-Options "SAMEORIGIN" always; # 防点击劫持add_header X-Content-Type-Options "nosniff" always; # 防MIME类型嗅探add_header X-XSS-Protection "1; mode=block" always; # 启用XSS过滤器add_header Referrer-Policy "no-referrer-when-downgrade" always; # 控制Referer头
add_header X-Frame-Options "SAMEORIGIN" always; # 防点击劫持
add_header X-Content-Type-Options "nosniff" always; # 防MIME类型嗅探
add_header X-XSS-Protection "1; mode=block" always; # 启用XSS过滤器
add_header Referrer-Policy "no-referrer-when-downgrade" always; # 控制Referer头CSRF防护:可通过验证Referer头或使用OpenResty实现Token验证。
3. 监控与可视化
stub_status模块:内置模块,提供基本的状态信息。
location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; # 只允许本地访问 deny all;}
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1; # 只允许本地访问
deny all;
}访问http://your-server/nginx_status会得到类似如下输出:
Active connections: 291server accepts handled requests16630948 16630948 31070465Reading: 6 Writing: 179 Waiting: 106
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106Prometheus监控:使用nginx-prometheus-exporter或nginx-vts-exporter(需要编译VTS模块)将Nginx指标转换为Prometheus格式,再通过Grafana进行可视化展示。
七、总结与建议
配置文件管理的建议
模块化:不要将所有配置都写在主配置文件中。使用include指令将不同功能的配置(如SSL、gzip、upstream)和不同站点的配置(server块)拆分到/etc/nginx/conf.d/或/etc/nginx/sites-available/下的独立文件中。
版本控制:将整个/etc/nginx/目录纳入Git等版本控制系统,任何修改都有据可查,便于回滚和团队协作。
注释清晰:为复杂的配置段添加注释,说明其目的和原理。
遵循最小权限原则:文件权限、用户设置都应遵循安全最佳实践。
学习资源
图片
官方文档:https://nginx.org/en/docs/ - 最权威、最全面的参考。
图片
Nginx Wiki:大量的示例和教程:https://wiki.archlinuxcn.org/wiki/Nginx。
工具链:
nginx -t:每次修改后建议检查一下语法。
ss / netstat**:检查端口监听和连接状态。
curl / httpie**:用于测试接口和HTTP头。
附录
生产环境标准配置模板
# === 全局块 ===# 用户组user nobody;# 工作进程数worker_processes 1;# 日志路径和日志级别error_log logs/error.log;error_log logs/error.log notice;error_log logs/error.log info;# 进程文件路径pid logs/nginx.pid;# === events块 ===events { # 最大连接数 worker_connections 1024; # 设置网络连接序列化 accept_mutex on; # 一个进程是否同时接收多个网络连接 multi_accept on; # 事件驱动模型 use epoll;}# === http块 ===http { # === http全局块 === # 文件扩展名与文件类型映射表 include mime.types; # 默认文件类型 default_type application/octet-stream; # 是否开启服务日志 access_log off; # 自定义服务日志格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 设置日志的格式 access_log logs/access.log main; # 是否开启高效文件传输模式 sendfile on; # 每个进程每次最大传输值 sendfile_max_chunk 100k; # 长连接超时事件 keepalive_timeout 65; # 响应客户端的超时事件 send_timeout 75; # 客户端请求头的区缓冲区大小 client_header_buffer_size 32k; # 客户端请求头的最大缓冲区数量和大小 large_client_header_buffers 8 32k; # 允许客户端请求的最大字节数 client_max_body_size 10m; # 客户端请求体的缓冲区大小 client_body_buffer_size 128k; # ---配置http_gzip模块--- # 开启gzip压缩输出,可减少网络传输 gzip on; # 设置允许压缩的页面最小字节数 gzip_min_length 1k; # 设置系统获取多少个单位的缓存用于存储gzip的压缩结果数据流 gzip_buffers 4 16k; # 设置http协议的版本 gzip_http_version 1.0; # 设置zip压缩比 gzip_comp_level 6; # 匹配mime类型进行压缩 gzip_types text/plain text/css application/json; # 设置开启或者关闭后端服务器返回的结果是否压缩 gzip_proxied any; # 该配置和http头有关系,会在响应头加个vary:Accept-Encoding gzip_vray on; # ---配置http_proxy反向代理--- # Nginx跟代理服务器连接超时时间 proxy_connect_timeout 75; # Nginx与代理服务器两个成功的响应操作之间超时时间 proxy_read_timeout 75; # Nginx传输文件至代理服务器的超时时间 proxy_send_timeout 100; # 设置从代理服务器读取并保存用户头信息的缓冲区大小 proxy_buffer_size 4k; # 设置代理缓冲区大小 proxy_buffers 4 32k; # 设置高负荷下的缓冲大小 proxy_busy_buffers_size 64k; # 设置最大临时文件大小,默认1024M proxy_max_temp_file_size 64k; # 限制每次写临时文件的大小 proxy_temp_file_write_size 64k; # 指定临时文件所在的目录 proxy_temp_path proxy_temp; # 定义tomcat地址 upstream tomcat { server 192.168.138.100:8888; } # === HTTP-server块 === server { # 监听端口 listen 80; # 监听服务器地址 server_name localhost; # 每个连接请求上限次数 keepalive_requests 120; # 字符集 charset utf-8; # 服务日志所在目录以及日志格式 access_log logs/host.access.log main; # 错误页 error_page 404 /404.html; error_page 500 502 503 504 /50x.html; # === HTTP-server-location块 === location / { # 服务器的默认网站根目录位置 root /usr/share/nginx/html; # 默认访问的文件名 index index.html; # 拒绝的IP deny 192.168.56.21; deny all; # 允许的IP allow 192.168.56.10; allow all; } # 设置响应头 location / { # 设置允许跨域类型 add_header Access-Control-Allow-Origin * always; # 是否允许信任证书 add_header Access-Control-Allow-Credentials 'true' always; # 允许的请求头类型 add_header Access-Control-Allow-Headers * always; # 设置允许的请求方式 add_header Access-Control-Allow-Methods 'PUT,GET,POST,DELETE,OPTIONS' always; # 处理OPTIONS请求 if ($request_method = 'OPTIONS') { return 204; } } # 设置反向代理服务器 location / { # 反向代理服务器地址 proxy_pass http://192.168.56.23; # 是否重定向代理服务器地址 proxy_redirect off; # 设置向代理服务器发送请求时的请求头数据 # cookie proxy_pass_header Set-Cookie; # 主机名 proxy_set_header Host $host; # 真实IP proxy_set_header X-Real-Ip $remote_addr; # 表示Http请求端真实IP proxy_set_header X-Forwarded-For $remote_addr; } } # 配置ssl server { # 开启 ssl ssl on; # ssl证书路径 ssl_certificate cert.pem; # ssl证书密钥 ssl_certificate_key cert.key; # ssl缓存 ssl_session_cache shared:SSL:1m; # ssl会话超时时间 ssl_session_timeout 5m; # ssl会话票据 ssl_session_tickets off; # ssl协议版本 ssl_protocols TLSv1.2; # ssl密码套件 ssl_ciphers 'HIGH:!aNULL:!MD5'; # 开启ssl服务密码套件 ssl_prefer_server_ciphers on; }}
# === 全局块 ===
# 用户组
user nobody;
# 工作进程数
worker_processes 1;
# 日志路径和日志级别
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
# 进程文件路径
pid logs/nginx.pid;
# === events块 ===
events {
# 最大连接数
worker_connections 1024;
# 设置网络连接序列化
accept_mutex on;
# 一个进程是否同时接收多个网络连接
multi_accept on;
# 事件驱动模型
use epoll;
}
# === http块 ===
http {
# === http全局块 ===
# 文件扩展名与文件类型映射表
include mime.types;
# 默认文件类型
default_type application/octet-stream;
# 是否开启服务日志
access_log off;
# 自定义服务日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 设置日志的格式
access_log logs/access.log main;
# 是否开启高效文件传输模式
sendfile on;
# 每个进程每次最大传输值
sendfile_max_chunk 100k;
# 长连接超时事件
keepalive_timeout 65;
# 响应客户端的超时事件
send_timeout 75;
# 客户端请求头的区缓冲区大小
client_header_buffer_size 32k;
# 客户端请求头的最大缓冲区数量和大小
large_client_header_buffers 8 32k;
# 允许客户端请求的最大字节数
client_max_body_size 10m;
# 客户端请求体的缓冲区大小
client_body_buffer_size 128k;
# ---配置http_gzip模块---
# 开启gzip压缩输出,可减少网络传输
gzip on;
# 设置允许压缩的页面最小字节数
gzip_min_length 1k;
# 设置系统获取多少个单位的缓存用于存储gzip的压缩结果数据流
gzip_buffers 4 16k;
# 设置http协议的版本
gzip_http_version 1.0;
# 设置zip压缩比
gzip_comp_level 6;
# 匹配mime类型进行压缩
gzip_types text/plain text/css application/json;
# 设置开启或者关闭后端服务器返回的结果是否压缩
gzip_proxied any;
# 该配置和http头有关系,会在响应头加个vary:Accept-Encoding
gzip_vray on;
# ---配置http_proxy反向代理---
# Nginx跟代理服务器连接超时时间
proxy_connect_timeout 75;
# Nginx与代理服务器两个成功的响应操作之间超时时间
proxy_read_timeout 75;
# Nginx传输文件至代理服务器的超时时间
proxy_send_timeout 100;
# 设置从代理服务器读取并保存用户头信息的缓冲区大小
proxy_buffer_size 4k;
# 设置代理缓冲区大小
proxy_buffers 4 32k;
# 设置高负荷下的缓冲大小
proxy_busy_buffers_size 64k;
# 设置最大临时文件大小,默认1024M
proxy_max_temp_file_size 64k;
# 限制每次写临时文件的大小
proxy_temp_file_write_size 64k;
# 指定临时文件所在的目录
proxy_temp_path proxy_temp;
# 定义tomcat地址
upstream tomcat {
server 192.168.138.100:8888;
}
# === HTTP-server块 ===
server {
# 监听端口
listen 80;
# 监听服务器地址
server_name localhost;
# 每个连接请求上限次数
keepalive_requests 120;
# 字符集
charset utf-8;
# 服务日志所在目录以及日志格式
access_log logs/host.access.log main;
# 错误页
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# === HTTP-server-location块 ===
location / {
# 服务器的默认网站根目录位置
root /usr/share/nginx/html;
# 默认访问的文件名
index index.html;
# 拒绝的IP
deny 192.168.56.21;
deny all;
# 允许的IP
allow 192.168.56.10;
allow all;
}
# 设置响应头
location / {
# 设置允许跨域类型
add_header Access-Control-Allow-Origin * always;
# 是否允许信任证书
add_header Access-Control-Allow-Credentials 'true' always;
# 允许的请求头类型
add_header Access-Control-Allow-Headers * always;
# 设置允许的请求方式
add_header Access-Control-Allow-Methods 'PUT,GET,POST,DELETE,OPTIONS' always;
# 处理OPTIONS请求
if ($request_method = 'OPTIONS') {
return 204;
}
}
# 设置反向代理服务器
location / {
# 反向代理服务器地址
proxy_pass http://192.168.56.23;
# 是否重定向代理服务器地址
proxy_redirect off;
# 设置向代理服务器发送请求时的请求头数据
# cookie
proxy_pass_header Set-Cookie;
# 主机名
proxy_set_header Host $host;
# 真实IP
proxy_set_header X-Real-Ip $remote_addr;
# 表示Http请求端真实IP
proxy_set_header X-Forwarded-For $remote_addr;
}
}
# 配置ssl
server {
# 开启 ssl
ssl on;
# ssl证书路径
ssl_certificate cert.pem;
# ssl证书密钥
ssl_certificate_key cert.key;
# ssl缓存
ssl_session_cache shared:SSL:1m;
# ssl会话超时时间
ssl_session_timeout 5m;
# ssl会话票据
ssl_session_tickets off;
# ssl协议版本
ssl_protocols TLSv1.2;
# ssl密码套件
ssl_ciphers 'HIGH:!aNULL:!MD5';
# 开启ssl服务密码套件
ssl_prefer_server_ciphers on;
}
}常用配置参数速查表
指令 | 上下文 | 说明与示例 |
| main | 工作进程数, |
| events | 单进程最大并发连接数 |
| server | 监听端口, |
| server | 虚拟主机关联的域名 |
| server, location | 定义请求的根目录 |
| server, location | 定义默认索引文件 |
| server | 根据URI匹配并配置路由规则 |
| location, if | 设置反向代理的后端地址 |
| http | 定义负载均衡的后端服务器组 |
| server | 指定SSL证书文件路径 |
| http, server, location | 基于IP的访问控制 |
| http | 定义请求限流的共享内存区域 |
通过本篇指南,相信大家应该已经对Nginx配置文件有了比较深刻的了解。从希望这篇文章能够帮助大家!




























