这篇文章上次修改于 222 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

globa

上下文: 最外层

# 指定运行的用户和组
user  www-data www-data;

# 指定进程数, 生产环境建议为物理核心数或自动
worker_processes 1;
worker_processes auto;

# 错误日志和级别 [ debug | info | notice | warn | error | crit ], stderr 表示标准错误输出
error_log logs/error.log info;

# pid
pid logs/nginx.pid;

http

上下文: http | server | location | other
没特殊需求大部分都直接配置在 http 块中即可

# 文件类型映射表, 通常未知文件默认下载
include mime.types;
default_type application/octet-stream;

# 默认编码
charset UTF-8;

# 日志格式化
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;

# 开启目录访问, 默认关闭
autoindex off;

# 上传文件需要
client_max_body_size 128G;

# 添加返回 header 内容, 也可以写进其中的 server 块内单独配置
# 跨域配置
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' '*';
# QUIC 配置
add_header Strict-Transport-Security 'max-age=31536000';
add_header Alt-Svc 'h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"';
add_header QUIC-Status $http3;

server

上下文: server
其中部分配置可以更低层

# HTTPS
server {
    listen 80 default_server;
    server_name _;
    # 注意这里是 $host 而不是 $server_name
    return 301 https://$host$request_uri;
}

# 端口监听
listen 443 ssl;
listen 443 quic reuseport;

# server 块对应的域名
server_name kazusa.cc;

# 配置根目录, 也可以写进下级的 location 实现多个根目录
root /www/kazusa.cc;

# 缺省首页
index index.php index.html;

# SSL
ssl_certificate conf\vhosts\cert\domain.pem;
ssl_certificate_key conf\vhosts\cert\domain-key.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";

# 错误页面
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root   html;
}

location

上下文: location

# 通常写法
location / {
    # 寻找顺序: 文件 > 文件夹 > php
    try_files $uri $uri/ /index.php$is_args$query_string;
}

# 某个路径单独配置根目录
location = /jsonrpc {
    root /path/to/xxx;
}

# 正则匹配某些文件并做缓存
location ~* ^.+\.(ico|gif|jpg|jpeg|png|html|htm|css|js|svg|ttf|eot|otf|woff|scss|less|mp4|woff2)$ {
        # 文件过期时间, -1表示不缓存
        expires 3d;
}

# PHP 服务
location ~ .*\.php(\/.*)*$ {
    include fastcgi.conf;
    fastcgi_pass unix:/run/php/php-fpm.sock;
    # 另一种
    # fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
}

rewrite

伪静态和重写很复杂, 如果可以还是用域名和端口号来划分不同功能吧

location / {
    # 几种不同的伪静态模式, 只能选择其中一种
    rewrite ^/(.*)$ /$1.php last;
    rewrite ^/(.*)$ /index.php/$1 last;
    try_files $uri $uri/ /index.php$is_args$query_string;
}

proxy

# 配置了反代就不需要根目录了
location = /jsonrpc {
    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;
    # 源地址只能是 协议://主机名:端口号 这种形式
    proxy_pass http://127.0.0.1:6800;
}

stream

类似于 http 但是位于网络层(http 是应用层),因此本身并不支持域名规则。

作用:反代比较特殊的流量,比如数据库和 SSH 这些。

支持 TCP 和 UDP 流量(需要使用 reuseport 复用),未完结。。。