968 字
5 分钟
Nginx备忘

于2026-4-9日重构 官网 | docker

常用命令#

Terminal window
# 测试配置
sudo nginx -t
# 查看完整配置,会把全部include进去,然后输出出来
sudo nginx -T
# 重新加载配置
nginx -s reload

文件结构#

以下的都是针对debian系的,他对nginx做了一些魔改,推荐用docker的吧

/etc/nginx/
├── nginx.conf # 主配置
├── sites-available/ # 可用的站点配置
├── sites-enabled/ # 启用的站点(符号链接),只用把available里的配置链接到enable才会启用站点配置。
└── conf.d/ # 额外配置
/var/www #这里放网站的静态文件
/var/log/nginx #默认这里放日志,当然可以放到你想的地方

配置文件#

没有主次之分,本质上就一个原生入口在/etc/nginx/nginx.config,但是他可以include从而进行配置的易维护性,debian和nginx官方的关系习惯不尽相同,但是最终区别不大。

下面是docker的nginx的默认配置,与debian的可能不太一样。

nginx.config
user nginx; #nginx父进程在systemd里一般是root权限执行的,这里配置的是他底下的子进程的用户,官方使用nginx用户,debian习惯用www-data,父进程一般是调控底下的子进程的并不处理代理事务
worker_processes auto; #自动调整进程数量
error_log /var/log/nginx/error.log notice;
pid /run/nginx.pid;
events {
worker_connections 1024; #单个进程最大的并发数
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf; #这里代表你可以在这个路径下写http块内部的其他配置,include代表这些配置会被顺序添加在这个位置上。
}

一般来说有一下几个顶级的配置块

stream#

这个是直接在代理的,只能在传输层把一个socket完全代理到另一个socket,无法端口复用等等应用层的操作。

events#

调整nginx运行性能参数,从刚刚的示例上可以看到worker_connections 1024;

mail#

处理邮件协议,可以代理这些协议:IMAP/POP3/SMTP

http#

web项目最常用的,下面有很多子块,nginx一般会在这个块下面include到conf.d/*.conf,所以我们就可以把站点写到这下面一个服务用一个conf

变量#

请求头字段#

  • X-API-KEY -> $http_x_api_key
  • Upgrade -> $http_upgrade
  • A_B -> 一般带下划线的字段会被抛弃
  • Host -> $http_host

请求参数#

比如用户输了:xxxx?id=1,这种url,可以用$arg_id来读出来

nginx自带#

  • $host:用户输入的主机名,也就是域名
  • $remote_addr:远程地址,客户端ip
  • $uri:请求路径,不包括参数的
  • $scheme

自定义变量#

用set定义例如set $xxx "xxx"; map里的变量可以不需要set的

server#

下面是几种常见的用法吧,CORS用nginx来添加性能比直接在后端添加好的多。

server {
server_name blog.cannian.space;
# nginx托管的静态页面
location / {
root /var/www/cannian;
index index.html;
try_files $uri $uri/ =404;
}
# 在blog.cannian.space/api下面的会被转发到后端去
location /api/ {
rewrite ^/api/(.*)$ /$1 break; #重写路径,你访问的是blog.cannian.space/api/get会变成127.0.0.1:5000/get
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host; #用户端写的url
proxy_set_header X-Real-IP $remote_addr; #连接的ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #也是传递客户端的真实IP地址,因为有时候会套cdn所以单纯的remote_addr不行
proxy_set_header X-Forwarded-Proto $scheme; #传递客户端使用的协议(HTTP/HTTPS)
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/blog.cannian.space/fullchain.pem; #证书
ssl_certificate_key /etc/letsencrypt/live/blog.cannian.space/privkey.pem; #私钥
}
# HTTP重定向到HTTPS
server {
listen 80;
server_name blog.cannian.space;
return 301 https://$server_name$request_uri;
}

nginx在面对一个https的请求他无法直接看到请求的host,他会先看TLS里的SNI,判断出在哪个server块里,然后证书解密,判断host再传给后端。

docker#

这个docker版的写配置大差不差,但是比传统的avilable-sites方便很多

"docker-compose.yml
services:
nginx:
image: nginx:alpine
container_name: nginx
ports:
- "80:80"
volumes:
- ./conf.d:/etc/nginx/conf.d:ro
Nginx备忘
https://blog.cannian.space/posts/2025-12-12-nginx/
作者
Cannian
发布于
2025-12-12
许可协议
CC BY-NC-SA 4.0