Nginx 的配置文件是以块(block)组织指令的文本文件。
配置文件路径:
- Ubuntu apt 安装:
/etc/nginx/
; - MacOS brew 安装:
/usr/local/etc/nginx/
;
include
在配置文件中,使用 include
指令可以插入其他文件内容。例如:
include mime.types;
这样可以将不同域的配置分开管理。
block
概述
每个块用花括号({}
)表示。主要块有:
块 | 含义 |
---|---|
main | 全局设置,包含 Nginx 的基本控制功能,顶层块,无需显式写出。 |
events | 事件设置,控制连接处理方式 |
http | HTTP 设置 |
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