nginx.conf配置常见问题
发布时间:2026/8/28 13:43:45 作者:尧图编辑部 阅读量:1,286

Nginx location、root、alias 与 proxy_pass一、location 匹配规则1. 基本语法location [ | ~ | ~* | ^~ ] uri { ... } location name { ... }修饰符含义URI 精确匹配^~普通前缀匹配成功后不再检查正则 location~区分大小写的正则匹配~*不区分大小写的正则匹配无修饰符普通前缀匹配name命名 location只用于 Nginx 内部跳转!~和!~*是正则判断运算符不是location支持的修饰符。2. 匹配顺序常见的非嵌套location可以按下面的顺序理解查找location uri匹配成功立即结束。查找所有普通前缀保留最长匹配。如果最长前缀使用了^~立即使用它。按配置顺序检查正则 location使用第一个匹配项。正则均未匹配时使用之前找到的最长前缀。精确匹配 ↓ 最长前缀匹配 ↓ 是否带 ^~ ── 是 ── 使用该前缀 │ 否 ↓ 按顺序检查正则 ↓ 正则未命中则使用最长前缀3. 匹配示例location / { deny all; } location ~ \.html$ { allow all; }请求结果原因/403正则未匹配最终使用location //index.html允许访问.html正则匹配成功/not-found.html404正则匹配成功但文件不存在/index.txt403正则未匹配使用location /location /即使请求 URI 恰好是/也不等同于location /。只有显式使用才是精确匹配。4.和^~# 只匹配 / location / { ... } # 匹配 /static/ 开头的 URI并跳过正则 location location ^~ /static/ { ... }location /new只影响/new。请求/new/a匹配不上它后仍会继续查找其他 location。5. 普通前缀与正则的顺序普通前缀选择最长匹配与配置顺序无关location /prefix/ { deny all; } location /prefix/mid/ { allow all; }请求/prefix/mid/a.html使用/prefix/mid/。正则 location 按配置顺序匹配第一个命中的规则生效location ~ \.html$ { allow all; } location ~ ^/prefix/.*\.html$ { deny all; }请求/prefix/a.html会命中第一个正则因此正则规则应从具体到通用排列。6. 命名 location命名 location 不能由浏览器直接访问只能用于内部跳转location / { root /usr/share/nginx/html; } error_page 404 fallback; location fallback { proxy_pass https://example.com; }二、root 和 alias1. 核心区别root文件路径 root 完整请求 URI。alias使用alias指定的目录替换匹配到的 location 前缀。2. root 示例location /images/ { root /data/w3; }请求/images/logo.png实际文件/data/w3/images/logo.png3. alias 示例location /images/ { alias /data/pictures/; }请求/images/logo.png实际文件/data/pictures/logo.png当 location 以/结尾时alias 通常也应以/结尾避免路径拼接错误。如果 URI 前缀和磁盘目录名称相同优先使用root配置更直观location /images/ { root /data; }三、proxy_pass 路径规则判断proxy_pass是否改写 URI关键看它是否包含 URI 部分。1. proxy_pass 不带 URIlocation /api/ { proxy_pass http://127.0.0.1:8000; }请求/api/getUser代理到http://127.0.0.1:8000/api/getUser原始 URI 会被保留。2. proxy_pass 带 URIlocation /api/ { proxy_pass http://127.0.0.1:8000/; }请求/api/getUser代理到http://127.0.0.1:8000/getUser匹配到的/api/会被/替换。3. 带后缀路径location /api/ { proxy_pass http://127.0.0.1:8000/user/; }请求/api/getUser会代理到http://127.0.0.1:8000/user/getUser推荐让 location 和 proxy_pass 的斜杠保持对应location /api/ { proxy_pass http://127.0.0.1:8000/user/; }这样最直观也能减少重复斜杠或路径粘连问题。常用代理头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;四、前端项目部署根路径部署server { listen 8090; server_name localhost; location / { root /home/web/my_demo; index index.html; try_files $uri $uri/ /index.html; } }访问地址http://localhost:8090/带前缀部署server { listen 8090; server_name localhost; location /my_demo/ { root /home/web; index index.html; try_files $uri $uri/ /my_demo/index.html; } }访问地址http://localhost:8090/my_demo/五、nginx.pid 缺失错误示例nginx: [error] open() .../logs/nginx.pid failed常见原因Nginx 未成功启动。Nginx 被异常终止。PID 文件被删除。配置的 PID 路径不正确。执行nginx -s reload时实际运行实例使用了另一份配置。处理方式# 检查配置及配置文件路径sudonginx-t# 确认没有残留进程后使用指定配置启动sudonginx-c/achance/data1/nginx/conf/nginx.conf# 后续使用同一份配置重新加载sudonginx-sreload-c/achance/data1/nginx/conf/nginx.conf不建议直接把killall nginx作为首选方案。应先检查进程和配置路径避免中断其他 Nginx 实例。