目录

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;
         }
        }
}
  1. limit_req_zone
    这是 Nginx 的指令,用于定义一个共享内存区域来存储请求限流的状态信息。

  2. $binary_remote_addr

    • 这是 Nginx 变量,表示客户端的 IP 地址(二进制形式)
    • 使用二进制形式比字符串形式($remote_addr)更节省内存空间
    • 这意味着限流是基于每个客户端 IP 单独计算的
  3. zone=one:10m

    • one 是这个内存区域的名称(可以自定义)
    • 10m 表示分配 10MB 的共享内存空间
    • 10MB 大约可以存储约 16 万个 IP 地址的状态信息
  4. 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