nginx 常用配置作用详解
目录
概述
nginx 配置文件: nginx.conf
修改配置文件后需要重启 nginx 才能生效
以下是 nginx.conf 的配置结构部分说明
#user nobody; #配置用户或者组,默认为nobody nobody。
worker_processes 1; #允许生成的进程数,默认为1
#错误日志
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; #指定nginx进程运行文件存放地址
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
include include conf.d/my_config.conf; # 导入自己的配置
default_type application/octet-stream; #默认文件类型,默认为text/plain
#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方式传输文件,默认为off,可以在http块,server块,location块。
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
#gzip on;
server {
listen 80; #监听端口
server_name localhost; #监听地址
#charset koi8-r;
#access_log logs/host.access.log main;
location / { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
root html; #根目录
index index.html index.htm; #设置默认页
# proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
# deny 127.0.0.1; #拒绝的ip
# allow 172.18.5.54; #允许的ip
# proxy_connect_timeout 10; # 连接超时
# autoindex on;# 表示web可访问服务器目录
}
#error_page 404 /404.html; #错误页
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# HTTPS server 配置 https 代理
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
反向代理
http{
...
server {
listen 443 ssl;
server_name tools.fiveyoboy.com; # 监听这个域名
location / { # 监听 / uri 路径
proxy_set_header X-Real-IP $remote_addr; # 设置 X-Real-IP 头,向后端服务器传递客户端的真实 IP 地址(内置变量 $remote_addr)
# 设置 X-Forwarded-For 头,记录请求经过的所有代理服务器的 IP 链
# $proxy_add_x_forwarded_for 会自动追加当前代理服务器的 IP 到现有的 X-Forwarded-For 头(如果客户端已经提供了该头),用 , 隔开
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 定义反向代理的目标地址,将请求转发到指定的后端服务器。
proxy_pass http://127.0.0.1:3000;
# 设置 Host HTTP 头,确保后端服务器知道原始请求的域名
proxy_set_header Host $host;
# add_header:Nginx 指令,用于向响应添加自定义 HTTP 头。
# Referrer-Policy:HTTP 头部字段,用于控制浏览器发送 Referer 头的策略
# origin:策略值,表示只发送源站(协议+域名+端口),不包含路径和查询参数
add_header Referrer-Policy origin;
}
}
}
https 反向代理
server {
listen 443 ssl;
server_name tools.fiveyoboy.com;
# 配置证书,*.pem he *.key 文件需要存在 nginx.conf所在的位置,比如我这里是在同级目录下的 cert 目录中
ssl_certificate cert/tools.fiveyoboy.com_bundle.pem;
ssl_certificate_key cert/tools.fiveyoboy.com.key;
# 配置 SSL 会话缓存,用于存储 SSL/TLS 会话参数,避免每次连接都进行完整的 SSL 握手
ssl_session_cache shared:SSL:1m;
#设置 SSL 会话缓存的超时时间
ssl_session_timeout 5m;
# 定义服务器允许使用的 SSL/TLS 加密套件列表
ssl_ciphers HIGH:!aNULL:!MD5;
# 优先使用服务器端配置的加密套件顺序
ssl_prefer_server_ciphers on;
location / {
# 定义反向代理的目标地址,将请求转发到指定的后端服务器。
proxy_pass http://127.0.0.1:3000;
}
}
设置超时时间
http{
proxy_connect_timeout 600; # 与后端服务器建立连接的超时时间(单位:秒)
proxy_read_timeout 600; # 定义从后端服务器读取响应的超时时间(单位:秒)
proxy_send_timeout 600; # 定义向后端服务器发送请求的超时时间(单位:秒)
keepalive_timeout 600; # Keepalive连接超时时间(单位:秒)设置客户端连接保持活动的超时时间,超过后服务器将关闭连接,(0表示禁用,连接完成后立即关闭)
}
限制请求 body 最大
http{
client_max_body_size 50M; # 客户端请求体最大大小(0表示不限制)# 这里设置为50兆字节,适用于大文件上传场景
}
请求超过会报错:413
ip 限流
http{
....
# 配置限流
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
listen 443 ssl;
server_name tools.fiveyoboy.com;
location / {
limit_req zone=one burst=10 nodelay; # 应用限流,burst:允许超过速率限制的突发请求数(缓冲队列大小),nodelay:不对突发请求进行延迟处理,delay:指定多少请求可以被立即处理
proxy_pass http://127.0.0.1:1000;
proxy_set_header Host $host;
}
}
}
limit_req_zone
这是 Nginx 的指令,用于定义一个共享内存区域来存储请求限流的状态信息。
$binary_remote_addr
- 这是 Nginx 变量,表示客户端的 IP 地址(二进制形式)
- 使用二进制形式比字符串形式(
$remote_addr
)更节省内存空间- 这意味着限流是基于每个客户端 IP 单独计算的
zone=one:10m
one
是这个内存区域的名称(可以自定义)10m
表示分配 10MB 的共享内存空间- 10MB 大约可以存储约 16 万个 IP 地址的状态信息
rate=1r/s
- 定义请求速率限制
1r/s
表示每秒允许 1 个请求- 也可以使用其他单位,如
30r/m
(每分钟 30 次)
重定向HTTP到HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri; # 强制转为 https
}
负载均衡配置
# 在http块中添加以下配置,然后./nginx -s reload:
upstream mysvr {
# 1.轮询(默认): 每个请求按时间顺序逐一分配
server 127.0.0.1:8833;
server 127.0.0.1:8832;
# 2.weight weight 代表权重默认为 1,权重越高被分配的客户端越多
# server 127.0.0.1:8833 weight=10;
# server 127.0.0.1:8832 weight=10;
# 3.ip_hash 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器
# ip_hash
# 4.fair(第三方);按后端服务器的响应时间来分配请求,响应时间短的优先分配
# fair
}
server {
listen 8834;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://mysvr;
proxy_connect_timeout 10; # 连接超时
autoindex on;# 表示web可访问服务器目录
}
}
# 以上配置 表示 访问127.0.0.1:8834 nginx
# 则将请求分发到 mysvr(名称自定义)的服务中
# 再根据upstream mysvr的server的配置策略分发请求
限制 IP 访问
配置 ip 白名单、黑名单
location / {
deny 192.168.1.100; # 禁止单个IP
deny 10.0.0.0/8; # 禁止整个IP段
allow 192.168.1.0/24; # 允许其他IP
allow 127.0.0.1; # 允许本地
deny all; # 默认拒绝所有(必须放在最后)
}
- 适用于简单的访问控制
- 规则按顺序匹配,第一个匹配的规则生效
- 返回
403 Forbidden
错误
常用变量
$host
: 请求的主机名$remote_addr
: 客户端IP地址$request_uri
: 完整的原始请求URI$uri
: 当前请求的URI$args
: 查询字符串$http_user_agent
: 用户代理字符串$scheme
: HTTP或HTTPS