Nginx 的配置文件是以块(block)组织指令的文本文件。

配置文件路径:

  • Ubuntu apt 安装:/etc/nginx/
  • MacOS brew 安装:/usr/local/etc/nginx/

include

在配置文件中,使用 include 指令可以插入其他文件内容。例如:

include mime.types;

这样可以将不同域的配置分开管理。

block

概述

每个块用花括号({})表示。主要块有:

含义
main全局设置,包含 Nginx 的基本控制功能,顶层块,无需显式写出。
events事件设置,控制连接处理方式
httpHTTP 设置
server主机设置
upstream负载均衡设置
location针对特定 URL 的设置。

块的嵌套关系如下:

main
├── events
└── http
    ├── server
    │   └── location
    └── upstream

被嵌套的块会继承父块设置,也可重新设置。

原理

http 块可声明多个 server 块,每个 server 块配置一个虚拟主机和监听端口,server 块内可插入多个 location 块,location 块用于 URL 匹配和单独设置。

例如:

http {
    include       mime.types;
    server {
        listen       80;
        server_name  bbs.example.com;

        location / {
            proxy_pass        http://localhost:5000;
            proxy_set_header  Host  $host;
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        # 静态文件,nginx 自己处理
        location  ~* /download/ {
            root /apps/oa/fs;
        }
    }
}

main 块

nginx 运行时与业务无关的参数,如工作进程数、身份等。

  • worker_processes auto 工作进程数,建议与 CPU 核数一致。
  • worker_cpu_affinity 设置 CPU 粘性,提升高并发性能。
  • worker_rlimit_nofile 10240 限制最大打开文件数。

events 块

  • worker_connections 2048 每个 worker 最大并发连接数。
  • use epoll Linux 下默认高效事件模型。

http 块

HTTP 服务相关参数。

  • sendfile on 开启高效文件传输。
  • keepalive_timeout 60 长连接超时时间。
  • send_timeout 响应客户端超时时间。
  • client_max_body_size 10m 最大单文件上传限制。
  • client_body_buffer_size 128k 请求缓冲区大小。

gzip 压缩相关设置

  • gzip on 开启 gzip 压缩。
  • gzip_min_length 1k 最小压缩字节数。
  • gzip_buffers 4 16k 压缩结果缓存。
  • gzip_http_version 1.1 启用 GZip 所需 HTTP 版本。
  • gzip_comp_level 6 压缩比。
  • gzip_types 匹配 mime 类型。
  • gzip_proxied any 反向代理压缩。
  • gzip_vary on 响应头加 Vary: Accept-Encoding。

http_proxy 相关设置

  • proxy_connect_timeout 60 代理连接超时。
  • proxy_read_timeout 60 代理接收超时。
  • proxy_buffer_size 4k 头信息缓冲区。
  • proxy_buffers 4 32k 响应缓冲区。
  • proxy_busy_buffers_size 64k 高负荷缓冲区。
  • proxy_max_temp_file_size 最大临时文件大小。
  • proxy_temp_file_write_size 64k 临时文件写入大小。

server 块

  • listen 监听端口。
  • server_name 服务器名。

可根据 server_name 区分请求转发。

server {
    listen 80;
    server_name www.a.net;
    location / {
        proxy_pass http://127.0.0.1:5000;
        index index.html index.htm;
    }
}

server {
    listen 80;
    server_name www.a.cn;
    location / {
        proxy_pass http://127.0.0.1:8000;
        index index.html index.htm;
    }
}

upstream 块

upstream 块定义多个后端服务器地址,通过算法负载均衡。

upstream backend {
    least_conn;
    server 127.0.0.1:8000 down;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    server 127.0.0.1:8003;
}

负载均衡算法

  • round-robin 默认轮询算法。
  • least_conn 活跃连接数最少。
  • ip_hash 按 IP 哈希分配。
  • hash 按键哈希分配。

状态参数

状态参数含义
down不参与负载均衡
max_fails允许失败次数
fail_timeout暂停服务时间
backup备份服务器

location 块

  • root /var/www/html 网站根目录。
  • index index.jsp index.html index.htm 默认文件名。
  • proxy_pass http://backend 反向代理。
  • 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; 真实 URL。

URI 匹配规则

  • = 精确匹配。
  • 完整路径匹配。
  • ^~ 前缀匹配。
  • ~ 区分大小写正则。
  • ~* 不区分大小写正则。
  • 最长字符匹配。
  • / 通用匹配。

举例:

location  = / {
  # 精确匹配 /
}
location  / {
  # 匹配所有请求
}
location ~ /documents/Abc {
  # 匹配 /documents/Abc
}
location ^~ /images/ {
  # 匹配 /images/ 前缀
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配图片扩展名
}
location /images/ {
  # 匹配 /images/
}
location /images/abc {
  # 匹配 /images/abc
}

HTTPS 设置

使用 Let’s Encrypt 证书示例:

http {
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    include     /etc/letsencrypt/options-ssl-nginx.conf;
    add_header  Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    server {
        listen 443 ssl;
        server_name xxxxx;

        ssl_certificate     /etc/letsencrypt/live/jupyter.mrchi.cc/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/jupyter.mrchi.cc/privkey.pem;
    }

    # HTTP 请求301重定向到 HTTPS
    server {
        listen 80;
        server_name xxxxx;
        return 301 https://$server_name$request_uri;
    }
}

WebSocket 设置

location ~ /api/kernels/ {
    proxy_pass          http://localhost:8888;
    proxy_set_header    Host       $host;
    proxy_http_version  1.1;
    proxy_set_header    Upgrade    "websocket";
    proxy_set_header    Connection "Upgrade";
    proxy_read_timeout  86400;
}

Default server 配置

444 状态码会直接关闭连接,不返回内容。

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    server_name _;

    ssl_certificate     /etc/letsencrypt/live/jupyter.mrchi.cc/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/jupyter.mrchi.cc/privkey.pem;

    return 444;
}

其他

测试配置:

sudo nginx -t

加载配置:

sudo nginx -s reload