目录与文件
Linux 下 Nginx 的家在 /etc/nginx/:主配置 nginx.conf,日志在 /var/log/nginx/。主配置里通常用 include /etc/nginx/conf.d/*.conf; 把每个站点拆成独立文件——一个站点一个文件,别把所有 server 塞进主配置,改一个站点动全身是运维噩梦。
四层结构
main { # 全局:进程、用户、错误日志
worker_processes auto; # worker 数,auto = CPU 核数
error_log /var/log/nginx/error.log warn;
}
events { # 连接模型
worker_connections 10240; # 每个 worker 的最大连接数
}
http { # HTTP 全局:MIME、日志格式、压缩、超时
include mime.types;
gzip on; # 这里配的 gzip 对所有 server 生效
server { # 一个虚拟主机 = 一个 server
listen 80;
server_name example.com;
location / { # 路由规则,下一篇细讲
root /var/www/html;
}
}
}理解层级的关键是继承:外层的指令会被内层继承,内层可以覆盖。所以"全局都压缩、某个接口不压缩"就写成 http 层 gzip on + 对应 location 里 gzip off。反过来,root 放在 location 里然后想给别的 location 用,就是放错层级的典型翻车——各层该放什么,地图上都有标。
指令生效的仪式
改完配置不是重启,是先检查再重载:nginx -t 做语法与语义检查(放错层级在这里会报 "unknown directive"),通过后 nginx -s reload 平滑加载。reload 的原理值得一提:master 收到信号后读新配置、fork 新 worker,新 worker 接新流量,旧 worker 把手头请求处理完再退出——全程不丢请求,不停服务。这就是"reload 能替代重启"的底气,也是生产环境永远优先 reload 的原因。
三个常见翻车
改了没 reload:配置是改了,进程里跑的还是旧的——reload 后再看。server_name 不匹配:两个 server 监听同一端口,请求按 Host 头找 server,找不到就落到 default(第一个定义的)——"为什么请求进了别人的 server"多半是这个。分号和花括号:指令必须以分号结尾,块必须有花括号,nginx -t 报的行号就是救命稻草。下一篇进最常用的 server 内部:location 匹配规则。
评论 (0)