nginx配置详解

82 阅读5分钟

window 常用nginx命令: (在nginx.exe目录下执行)

start nginx //启动
./nginx -s reload // 重启
./nginx -s quit // 优雅关闭服务
./nginx -s stop // 快速关闭服务

root与 alias 区别

root 指令指定的是一个根目录,这个根目录将被附加到 URI 路径的前面。
alias 指令指定的是一个确切的路径,它会替换掉 location 块中的路径。

location /images/ {
    root /var/www;
}

当客户端请求 /images/example.png 时,Nginx 将查找文件 /var/www/images/example.png

location /images/ {
    alias /var/www/media/;
}

当客户端请求 /images/example.png 时,Nginx 将查找文件 /var/www/media/example.png

(注:window环境root写法为: root D:\\fe\\myProject)

负载均衡


http {
    #设置负载均衡
    upstream hot_list {
        server localhost:3000 weight=6 max_fails=2 fail_timeout=5s;
        server localhost:5000 weight=4 max_fails=2 fail_timeout=5s;
    }
    server {
        listen 80;
        location /api/ {
            proxy_pass http://hot_list;  # 使用定义的负载均衡模块
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

  • weight=4: 这个服务器的权重是 4。权重越大,Nginx 分配到此服务器的请求越多。在此配置中,相对权重表示此服务器将处理总请求的 40%(4/(6+4))。
  • max_fails=2: 定义在 fail_timeout 时间段内,最多允许失败的次数。如果在这个时间段内失败次数超过此值,Nginx 将临时将此服务器标记为不可用。
  • fail_timeout=5s: 如果一个服务器被标记为不可用,在 5 秒后,Nginx 将重新尝试使用此服务器。这个参数还定义了 max_fails 参数的时间窗口。

负载均衡策略

1. 轮询(Round Robin)

这是 Nginx 的默认负载均衡策略。Nginx 依次将请求分配给每个后端服务器。每个服务器按顺序接收请求,不考虑服务器的负载和响应时间。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
}

2. 最少连接(Least Connections)

这种策略将请求分配给当前处理连接最少的服务器,适用于长连接请求,如 WebSocket。

upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
}

3. IP 哈希(IP Hash)

基于客户端 IP 地址的哈希值来分配请求。同一客户端的请求将始终被分配到同一服务器。这对于需要会话粘性的应用程序很有用。

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
}

4. 哈希(Hash)

基于指定的键(例如 URI、请求参数)进行哈希来分配请求。这对于某些需要会话粘性的应用程序也是有用的。

upstream backend {
    hash $request_uri;
    server backend1.example.com;
    server backend2.example.com;
}

详细负载均衡可以看: samwho.dev/load-balanc…
翻译地址: juejin.cn/post/728275…

nginx基本配置

server {
    #指定服务器监听的端口和地址。
    listen 80; 
    #定义虚拟主机的域名。
    server_name example.com www.example.com; 
    # 默认的location块,用于处理根目录请求
    location / {
        #指定请求文件的根目录。
        root /var/www/html; 
        #设置默认文件
        index index.html index.htm; 。
    }

    location /api {
        #指定代理请求的后端服务器
        proxy_pass http://backend; 
        #设置传递给后端服务器的请求头
        proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    
    # 用于处理重定向 
    location /old-path/ {
        # 永久重定向到新的路径 
        rewrite ^/old-path/(.*)$ /new-path/$1 permanent; 
    }
    
    # 用于处理静态文件(图片、CSS、JS等)
    location /static/ { 
        # 指定静态文件的根目录
        alias /var/www/static/; 
        # 禁止日志记录 
        access_log off; 
        # 缓存静态文件 expires 30d; 
    }
    error_page 404 /404.html; #定义错误页面

    gzip on; #启用 gzip 压缩
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; #指定要压缩的 MIME 类型。

    access_log /var/log/nginx/access.log; #设置访问日志文件路径
    error_log /var/log/nginx/error.log warn; #设置错误日志文件路径和级别
}

不带斜杠的 proxy_pass http://backend; 请求 http://example.com/api/foo/bar 会被转发为 http://backend/api/foo/bar
带斜杠的 proxy_pass http://backend/; 请求 http://example.com/api/foo/bar 会被转发为 http://backend/foo/bar

nginx 内置变量

通用变量

  • $arg_name:如果请求 URI 中没有参数 name,则变量为空字符串。
  • $args:如果请求 URI 中没有参数,则变量为空字符串。
  • $binary_remote_addr:表示客户端 IP 地址的二进制形式,通常没有默认值。
  • $body_bytes_sent:传送给客户端的字节数,响应头不计算在内,默认值为 0
  • $content_lengthContent-Length 请求头的值,如果没有提供,则变量为空字符串。
  • $content_typeContent-Type 请求头的值,如果没有提供,则变量为空字符串。
  • $cookie_name:cookie name 的值,如果没有提供该 cookie,则变量为空字符串。
  • $document_root:当前请求在 root 指令中指定的值,没有请求时为空字符串。
  • $host:请求主机头字段,或者服务器名称。如果请求中没有 Host 头字段,则为服务器的第一个 server_name 指令的值。
  • $hostname:服务器的主机名,通常由操作系统配置。
  • $http_name:HTTP 请求头 name 的值,如果没有提供该请求头,则变量为空字符串。
  • $https:如果使用 SSL 安全连接,则值为 “on”,否则为空字符串。
  • $is_args:如果请求 URI 包含参数,则值为 ?,否则为空字符串。
  • $limit_rate:用于设置响应的传输速率,默认情况下没有限制。
  • $query_string:与 $args 相同。
  • $remote_addr:客户端的 IP 地址,没有请求时为空字符串。
  • $remote_port:客户端的端口,没有请求时为空字符串。
  • $remote_user:已通过 Auth Basic 模块认证的用户名,如果没有认证,则变量为空字符串。
  • $request:包含请求类型、URI 和 HTTP 版本的信息,没有请求时为空字符串。
  • $request_body:请求体的内容,没有请求体时为空字符串。
  • $request_body_file:客户端请求体的临时文件名,如果请求体不大或者没有请求体,则变量为空字符串。
  • $request_completion:如果请求完成,值为 OK,否则为空字符串。
  • $request_filename:当前请求的文件路径,由 root 或 alias 指令与 URI 请求生成,没有请求时为空字符串。
  • $request_length:请求的总长度(包括请求行、请求头和请求体),没有请求时为空字符串。
  • $request_method:HTTP 请求方法,如 “GET” 或 “POST”,没有请求时为空字符串。
  • $request_time:从接收请求到完成响应的时间,没有请求时为空字符串。
  • $request_uri:带参数的原始请求 URI,不包含主机名,没有请求时为空字符串。
  • $scheme:请求使用的协议,httphttps,没有请求时为空字符串。
  • $server_addr:服务器的地址,默认是监听地址,可以通过 listen 指令绑定。
  • $server_name:服务器名称,默认为匹配请求的 server_name 指令的值。
  • $server_port:请求到达的服务器端口,默认为监听端口。
  • $server_protocol:请求使用的协议版本,如 HTTP/1.1,没有请求时为空字符串。
  • $status:响应的状态码,没有请求时为空字符串。
  • $time_iso8601:ISO 8601 标准格式的时间,没有请求时为空字符串。
  • $time_local:本地时间,格式:%d/%b/%Y:%H:%M:%S %z,没有请求时为空字符串。

特定模块的变量

  • $args:在请求 URI 中的参数部分(参数字符串),没有请求时为空字符串。
  • $binary_remote_addr:客户端地址的二进制表示,没有请求时为空字符串。
  • $body_bytes_sent:发送给客户端的主体字节数,默认值为 0
  • $connection:连接序列号,默认值为 0
  • $connection_requests:当前通过一个连接到来的请求数量,默认值为 1
  • $content_lengthContent-Length 请求头的值,如果没有提供,则变量为空字符串。
  • $content_typeContent-Type 请求头的值,如果没有提供,则变量为空字符串。
  • $cookie_name:请求中的 cookie name 的值,如果没有提供该 cookie,则变量为空字符串。
  • $document_root:当前请求的文档根目录或 alias 指定的路径,没有请求时为空字符串。
  • $http_name:请求头 name 的值,如果没有提供该请求头,则变量为空字符串。
  • $https:如果连接使用 SSL 安全连接则值为 "on",否则为空字符串。
  • $is_args:如果请求 URI 包含参数则值为 "?",否则为空字符串。
  • $limit_rate:用于限制响应速率,默认情况下没有限制。
  • $msec:当前时间的毫秒数。
  • $nginx_version:nginx 的版本。
  • $pid:工作进程的 PID。
  • $pipe:如果请求来自管道连接(pipe)则值为 "p",否则为空字符串。
  • $proxy_add_x_forwarded_for:客户端地址列表,代理服务器地址。
  • $realpath_root:当前请求的真实根目录。
  • $request_completion:如果请求完成则值为 "OK",否则为空字符串。
  • $request_id:请求的唯一标识符。
  • $sent_http_name:响应头 name 的值,如果没有该响应头,则变量为空字符串。
  • $ssl_cipher:SSL 连接使用的加密套件,如果没有使用 SSL 则为空字符串。
  • $ssl_protocol:SSL 连接使用的协议,如果没有使用 SSL 则为空字符串。
  • $ssl_session_id:SSL 会话的唯一标识符,如果没有使用 SSL 则为空字符串。
  • $uid_got:UID 从 cookie,如果没有提供该 cookie 则为空字符串。
  • $uid_reset:UID 从 cookie 被重置,如果没有提供该 cookie 则为空字符串。