Nginx 502 Bad Gateway常见原因和解决办法 Nginx

前言

网站突然打不开了,浏览器显示"502 Bad Gateway"?这是Nginx最常见的报错之一。本文讲502是什么意思、常见原因、怎么排查和解决。

一、502是什么意思

502 Bad Gateway = Nginx作为代理,从后端服务器(比如PHP-FPM)拿不到正常的响应。

简单说:Nginx收到了你的请求,然后去问后端"给我数据",后端没理它或者报错了,Nginx就返回502。

二、常见原因

原因1:PHP-FPM没启动

后端PHP服务没跑,Nginx找不到人。

检查:

ps aux | grep php-fpm

没输出就是没启动。

启动:

systemctl start php-fpm

或者:

service php-fpm start

原因2:PHP-FPM端口不对

Nginx配置里写的PHP-FPM地址不对。

比如:

fastcgi_pass 127.0.0.1:9000;

但PHP-FPM实际监听的是 /tmp/php-cgi.sock。

检查PHP-FPM监听:

netstat -tlnp | grep php-fpm

或者:

ss -tlnp | grep php-fpm

原因3:PHP代码报错

PHP代码有致命错误,直接挂了。

看PHP错误日志:

tail -f /var/log/php-fpm/www-error.log

或者:

tail -f /var/log/php/error.log

原因4:PHP超时了

程序跑太慢,超过Nginx或PHP-FPM的超时时间。

改Nginx超时:

fastcgi_read_timeout 300;

改PHP-FPM超时:

request_terminate_timeout = 300

原因5:PHP-FPM进程数不够

请求太多,PHP-FPM忙不过来。

看进程数:

ps aux | grep php-fpm | wc -l

改配置:

pm.max_children = 50
pm.start_servers = 20

原因6:内存不够了

PHP进程占满内存,系统把PHP杀了。

看内存:

free -h

看dmesg:

dmesg | grep oom

三、排查步骤

第一步:看Nginx错误日志

tail -f /var/log/nginx/error.log

常见报错:

报错 含义
connect() failed (111: Connection refused) PHP-FPM没启动
Primary script unknown 文件路径不对
upstream timed out PHP超时了
recv() failed (104: Connection reset by peer) PHP-FPM挂了

第二步:看PHP-FPM状态

systemctl status php-fpm

看是不是running。

第三步:看PHP错误日志

tail -f /var/log/php-fpm/www-error.log

看PHP代码有没有报错。

第四步:看系统资源

top
free -h
df -h

看CPU、内存、磁盘够不够。

四、常见解决方法

方法1:重启PHP-FPM

systemctl restart php-fpm

方法2:改Nginx配置

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;

    # 超时时间
    fastcgi_read_timeout 300;
    fastcgi_send_timeout 300;
}

方法3:改PHP-FPM进程数

pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30

改完重启:

systemctl restart php-fpm

方法4:开PHP错误显示

display_errors = On
error_reporting = E_ALL

五、常见坑

坑1:只重启Nginx,不重启PHP-FPM

502是后端的问题,重启Nginx没用。

正确: 重启PHP-FPM。

坑2:文件路径不对

fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

错! 应该是:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

坑3:PHP-FPM版本不对

装了PHP7但Nginx还找PHP5的sock。

检查:

ls -la /var/run/php/

坑4:权限问题

PHP-FPM没权限读网站目录的文件。

解决:

chown -R www:www /www/wwwroot/

总结

记住:

  1. 502 = Nginx拿不到后端响应
  2. 先看Nginx错误日志
  3. 再看PHP-F启没启动
  4. 然后看PHP代码有没有报错
  5. 最后看系统资源够不够

最快排查:

tail -f /var/log/nginx/error.log
systemctl status php-fpm

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-9 07:40 

Nginx 配置HTTPS证书 Nginx

Nginx 配置HTTPS证书

现在网站都要HTTPS,配置证书是必备技能。

1. 为什么要HTTPS

  • 加密传输,防窃听
  • 浏览器安全标识
  • SEO 排名加分
  • 现在主流浏览器都要求HTTPS

2. 证书文件

一般有两个文件:

  • .crt:证书文件
  • .key:私钥文件
# 证书文件放在这里
/etc/nginx/ssl/
├── example.com.crt
└── example.com.key

3. 基本HTTPS配置

server {
    listen 443 ssl;
    server_name example.com;

    # 证书配置
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    # 其他配置
    location / {
        root /var/www/html;
        index index.html;
    }
}

4. HTTP 跳转 HTTPS

# HTTP 重定向到 HTTPS
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

5. 优化配置

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    # 优化SSL配置
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;

    # 加密套件
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;

    # HSTS
    add_header Strict-Transport-Security "max-age=63072000" always;
}

6. 检查配置

# 检查配置语法
nginx -t

# 重载配置
nginx -s reload

7. 证书申请

免费证书:

  • Let's Encrypt(用 certbot 申请)
  • 阿里云免费证书
  • 腾讯云免费证书

certbot 申请:

# 安装 certbot
yum install certbot python3-certbot-nginx

# 自动申请并配置
certbot --nginx -d example.com

自动续期:

# 测试续期
certbot renew --dry-run

# 加入定时任务
0 3 * * * certbot renew --quiet

8. 常见问题

1)证书不生效

  • 检查证书路径对不对
  • 检查文件权限
  • 重载 Nginx

2)浏览器提示不安全

  • 证书过期了
  • 域名不匹配
  • 中间证书没装全

3)HTTPS 访问慢

  • 开启 HTTP/2
  • 优化 SSL 会话缓存

4)证书续期失败

  • 检查域名解析
  • 检查80端口是否通
  • 手动运行 certbot 看报错

9. 证书有效期

  • 免费证书一般 3 个月
  • 要设置自动续期
  • 不然到期网站就挂了

10. 生产建议

1)强制 HTTPS

  • HTTP 全部 301 跳转
  • 开启 HSTS

2)开启 HTTP/2

  • listen 443 ssl http2
  • 提升访问速度

3)定期检查证书

  • 监控证书到期时间
  • 提前续期

4)中间证书

  • 有些证书要把中间证书合并
  • 不然浏览器不信任

总结

Nginx 配置HTTPS要点:

  • 配置证书和私钥路径
  • HTTP 跳转 HTTPS
  • 开启 HTTP/2
  • 优化 SSL 会话缓存
  • 用 certbot 免费申请
  • 设置自动续期
  • 定期检查证书有效期
  • 开启 HSTS
  • 注意中间证书问题

HTTPS 是网站标配,一定要配置好。


emer 发布于  2026-10-9 07:35 

Nginx 反向代理配置 Nginx

Nginx 反向代理配置

反向代理是 Nginx 最常用的功能之一,配置很简单。

1. 什么是反向代理

反向代理就是:用户访问 Nginx,Nginx 把请求转发给后端服务器,再把结果返回给用户。

作用:

  • 隐藏后端服务器
  • 负载均衡
  • 统一入口
  • 缓存静态内容

2. 基本配置

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        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_pass:后端地址
  • proxy_set_header:传递请求头

3. 常用请求头

location / {
    proxy_pass http://127.0.0.1:8080;

    # 传递域名
    proxy_set_header Host $host;

    # 传递真实IP
    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;
}

4. 超时配置

location / {
    proxy_pass http://127.0.0.1:8080;

    # 连接超时
    proxy_connect_timeout 60s;

    # 发送超时
    proxy_send_timeout 60s;

    # 读取超时
    proxy_read_timeout 60s;
}

5. WebSocket 代理

location /ws {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;

    # WebSocket 升级
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

6. 负载均衡

# 定义后端服务器组
upstream backend {
    server 127.0.0.1:8080 weight=1;
    server 127.0.0.1:8081 weight=2;
    server 127.0.0.1:8082 max_fails=3 fail_timeout=30s;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
    }
}

7. 静态文件直接返回

server {
    listen 80;
    server_name example.com;

    # 静态文件直接处理
    location ~* \.(js|css|png|jpg|gif)$ {
        root /var/www/static;
        expires 30d;
    }

    # 其他请求转发后端
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
    }
}

8. 配置生效

# 检查配置
nginx -t

# 重载配置
nginx -s reload

9. 常见问题

1)502 Bad Gateway

  • 后端服务没启动
  • 后端端口不对
  • 后端超时

2)504 Gateway Timeout

  • 后端处理太慢
  • 调整超时时间

3)获取不到真实IP

  • 没配置 X-Real-IP
  • 后端没读取请求头

4)WebSocket 连不上

  • 没配置 Upgrade 和 Connection 头

10. 生产建议

1)一定要传请求头

  • Host
  • X-Real-IP
  • X-Forwarded-For

2)合理设置超时

  • 根据业务调整
  • 不要太长也不要太短

3)静态文件 Nginx 直接处理

  • 减轻后端压力
  • 提高性能

4)开启 gzip 压缩

gzip on;
gzip_types text/css application/javascript;

总结

Nginx 反向代理配置要点:

  • proxy_pass 指定后端地址
  • 一定要传请求头
  • 常用超时配置
  • WebSocket 要升级头
  • upstream 做负载均衡
  • 静态文件直接返回
  • 配置完 nginx -t 检查
  • 502 检查后端是否启动
  • 生产环境传全请求头

反向代理是 Nginx 基本功,一定要熟练掌握。


emer 发布于  2026-10-9 07:30 

Nginx 访问日志配置 Nginx

Nginx 访问日志配置

访问日志是排查问题和分析流量的重要依据,配置好很有必要。

1. 默认日志位置

# 访问日志
/var/log/nginx/access.log

# 错误日志
/var/log/nginx/error.log

2. 日志格式

Nginx 默认有两种日志格式:

combined(默认)

log_format combined '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent"';

common

log_format common '$remote_addr [$time_local] "$request" $status $body_bytes_sent';

3. 自定义日志格式

在 nginx.conf 的 http 块添加:

http {
    log_format main '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    '$request_time $upstream_response_time';

    access_log /var/log/nginx/access.log main;
}

4. 常用日志变量

  • $remote_addr: 客户端IP
  • $time_local: 本地时间
  • $request: 请求行
  • $status: 状态码
  • $body_bytes_sent: 发送字节数
  • $http_referer: 来源页面
  • $http_user_agent: 浏览器信息
  • $request_time: 请求总耗时
  • $upstream_response_time: 后端响应时间

5. 按站点分开日志

不同站点用不同日志文件:

server {
    listen 80;
    server_name a.com;
    access_log /var/log/nginx/a.access.log;
}

server {
    listen 80;
    server_name b.com;
    access_log /var/log/nginx/b.access.log;
}

6. 关闭日志

静态资源不记日志:

location ~* \.(jpg|jpeg|png|gif|css|js)$ {
    access_log off;
}

7. 日志切割

Nginx 自带日志切割:

http {
    # 每天切割,保留30天
    access_log /var/log/nginx/access.log main;
    log_not_found off;
}

也可以用 logrotate:

# 配置文件
/etc/logrotate.d/nginx

8. 分析日志

统计访问量

# 统计总请求数
wc -l /var/log/nginx/access.log

# 统计独立IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

统计状态码

awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c

统计访问最多的URL

awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

总结

Nginx 访问日志配置要点:

  • 默认日志在 /var/log/nginx/
  • combined 是默认格式
  • 自定义格式添加 $request_time 等变量
  • 不同站点分开日志文件
  • 静态资源可以关闭日志
  • 日志要定期切割
  • 用 awk 分析日志很方便

做好日志配置,排查问题和分析流量都有用。


emer 发布于  2026-10-9 07:24 

Nginx 反向代理原理 Nginx

Nginx 反向代理原理

反向代理是 Nginx 最常用的功能,搞懂原理很有必要。

1. 什么是反向代理

正向代理:代理客户端,比如翻墙工具。
反向代理:代理服务器,客户端不知道真实服务器。

用户请求 Nginx,Nginx 再转发给后端服务器,用户以为自己直接访问的就是 Nginx。

2. 为什么用反向代理

1)隐藏真实服务器

  • 后端服务器 IP 不暴露
  • 更安全

2)负载均衡

  • 多个后端服务器分摊请求
  • 提高并发能力

3)统一入口

  • 多个服务用一个域名
  • 不同路径转发到不同服务

4)SSL 卸载

  • HTTPS 证书在 Nginx 配置
  • 后端用 HTTP 就行

5)缓存静态内容

  • Nginx 直接返回静态资源
  • 减轻后端压力

3. 基本配置

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

4. 常用代理头

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;

后端通过这些头获取真实客户端信息。

5. 路径转发示例

# 根路径转发到PHP服务
location / {
    proxy_pass http://127.0.0.1:8080;
}

# /api 转发到后端接口
location /api/ {
    proxy_pass http://127.0.0.1:3000/;
}

# /static 直接读本地文件
location /static/ {
    root /var/www;
}

6. 超时设置

# 连接超时
proxy_connect_timeout 60s;

# 读取超时
proxy_read_timeout 60s;

# 发送超时
proxy_send_timeout 60s;

7. 常见问题

1)后端获取不到真实IP

  • 检查 X-Real-IP 头是否设置
  • 后端代码是否读取这个头

2)WebSocket 连接失败

  • 需要添加 Upgrade 头
  • 配置 HTTP/1.1
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;

3)大文件上传失败

  • 修改 client_max_body_size
  • 增加 proxy_read_timeout

总结

Nginx 反向代理要点:

  • 代理服务器,隐藏真实后端
  • 实现负载均衡、统一入口
  • 配置 proxy_pass 转发
  • 记得设置常用代理头
  • 后端通过请求头获取真实客户端信息
  • 注意超时和上传大小限制
  • WebSocket 需要特殊配置

做 Web 开发,反向代理是必备技能。


emer 发布于  2026-10-9 07:12 

Nginx 负载均衡配置 Nginx

Nginx 负载均衡配置

多台服务器分流,提高网站并发能力,Nginx 负载均衡很常用。

1. 什么是负载均衡

  • 多台服务器做同样的服务
  • Nginx 把请求分发给不同服务器
  • 提高并发能力,一台挂了其他还能用

2. 基础配置

upstream myserver {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://myserver;
    }
}

3. 常用分发策略

1)轮询(默认)

  • 一个接一个轮流分
    upstream myserver {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    }

2)加权轮询

  • 性能好的服务器多分点
    upstream myserver {
    server 127.0.0.1:8080 weight=3;
    server 127.0.0.1:8081 weight=1;
    }

3)ip_hash

  • 同一个IP固定访问同一台
    upstream myserver {
    ip_hash;
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    }

4. 健康检查

upstream myserver {
    server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
}
  • max_fails:失败几次标记为挂掉
  • fail_timeout:多久后重试

5. 常用参数

upstream myserver {
    # 备用服务器,其他都挂了才用
    server 127.0.0.1:8080 backup;

    # 不参与负载均衡
    server 127.0.0.1:8081 down;
}

6. 注意事项

  • 多台服务器数据要同步(Session、数据库)
  • Session 共享用 Redis
  • 文件上传用共享存储

总结

Nginx 负载均衡要点:

  • upstream 定义服务器组
  • proxy_pass 转发到组
  • 轮询、加权、ip_hash 策略
  • 健康检查自动剔除挂掉的服务
  • 注意 Session 共享

做大并发网站,负载均衡是必备的。


emer 发布于  2026-10-8 07:25 

Nginx 日志分析技巧 Nginx

Nginx 日志分析技巧

Nginx 日志是排查问题的重要工具,学会分析日志很重要。

1. 日志位置

默认日志路径:

# 访问日志
/var/log/nginx/access.log

# 错误日志
/var/log/nginx/error.log

2. 日志格式

默认日志格式:

log_format access '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent"';

3. 常用分析命令

1)查看访问量最多的IP:

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head 10

2)查看访问最多的页面:

awk '{print $7}' access.log | sort | uniq -c | sort -nr | head 10

3)查看状态码分布:

awk '{print $9}' access.log | sort | uniq -c | sort -nr

4)查看404错误:

awk '$9 == 404 {print $7}' access.log | sort | uniq -c | sort -nr

4. 排查常用

1)查看哪个IP访问频繁:

grep "127.0.0.1" access.log

2)查看某个时间段日志:

grep "08/Oct/2026:07" access.log

3)查看错误日志:

tail -f error.log

5. 日志切割

用 logrotate 自动切割:

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    notifempty
    create 0640 nginx adm
    postrotate
        systemctl reload nginx
    endscript
}

6. 常用场景

  • 被攻击了:查访问量最多的IP
  • 页面报错:查404/500
  • 流量突增:查访问最多的页面
  • 爬虫多:查 User-Agent

总结

Nginx 日志分析要点:

  • 访问日志查访问情况
  • 错误日志排查问题
  • awk 统计数据
  • 日志自动切割
  • 定期分析日志

做运维,看日志是基本功。


emer 发布于  2026-10-8 07:18 

Nginx HTTPS 配置详解 Nginx

Nginx HTTPS 配置详解

现在网站都要上 HTTPS,Nginx 配置 SSL 很简单。

1. 准备证书

免费证书可以用:

  • Let's Encrypt
  • 阿里云免费证书
  • 腾讯云免费证书

下载后有两个文件:

  • 证书文件:xxx.pem
  • 私钥文件:xxx.key

2. 基础配置

server {
    listen 443 ssl;
    server_name www.example.com;

    ssl_certificate /etc/nginx/ssl/xxx.pem;
    ssl_certificate_key /etc/nginx/ssl/xxx.key;

    location / {
        root /www/wwwroot/html;
        index index.html;
    }
}

3. HTTP 跳转 HTTPS

# HTTP 重定向到 HTTPS
server {
    listen 80;
    server_name www.example.com;
    return 301 https://$server_name$request_uri;
}

4. 优化配置

server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/nginx/ssl/xxx.pem;
    ssl_certificate_key /etc/nginx/ssl/xxx.key;

    # SSL 优化
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    location / {
        root /www/wwwroot/html;
        index index.html;
    }
}

5. 验证配置

# 检查配置是否正确
nginx -t

# 重载配置
nginx -s reload

6. 常见问题

1)证书不生效:

  • 检查证书路径对不对
  • 检查证书文件名
  • 重载 Nginx

2)浏览器提示不安全:

  • 证书域名不对
  • 证书过期了
  • 缺少中间证书

3)HTTP 打不开:

  • 检查 80 端口是否放行
  • 检查防火墙

7. Let's Encrypt 免费证书

用 certbot 自动申请:

# 安装
yum install certbot python3-certbot-nginx

# 自动申请并配置
certbot --nginx -d www.example.com

# 自动续期
certbot renew

总结

Nginx HTTPS 配置要点:

  • 443 端口监听 SSL
  • 配置证书和私钥路径
  • HTTP 跳转 HTTPS
  • 开启 http2 提升性能
  • 定期续期证书

现在做网站,HTTPS 是标配。


emer 发布于  2026-10-8 07:15 

Nginx报"no input file specified"错误解决 Nginx

前言

访问 PHP 页面,直接报 "No input file specified",意思是 PHP-FPM 找不到要执行的 PHP 文件。这是 Nginx 配置里 root 路径不对导致的。

报错长什么样

页面上直接显示:

No input file specified.

没有其他信息,就这么一句话。

常见原因

原因1:root 路径不对

PHP location 里的 root 和 server 里的 root 不一致。

错误示例:

server {
    root  /var/www/html;

    location ~ \.php$ {
        fastcgi_param SCRIPT_FILENAME /var/www/php$fastcgi_script_name;
    }
}

这样 PHP 找文件的时候就找错目录了。

正确做法:

server {
    root  /var/www/html;

    location ~ \.php$ {
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

用 $document_root 自动取 server 里的 root。

原因2:文件真的不存在

URL 对应的 PHP 文件根本就没有。

检查:

ls /var/www/html/test.php

原因3:文件权限不对

文件存在,但 Nginx/PHP-FPM 读不了。

解决: 确保文件权限是 644,目录是 755,属主是 www。

完整正确的配置

server {
    listen       80;
    server_name  www.example.com;

    root  /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        fastcgi_pass   unix:/run/php-fpm/www.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

排查步骤

第一步:确认文件在不在

ls /var/www/html/test.php

第二步:看 Nginx 错误日志

tail -f /var/log/nginx/error.log

访问一下报错的页面,看日志里写的路径是什么。

第三步:确认 root 路径

grep root /etc/nginx/conf.d/你的站点.conf

常见坑

坑1:fastcgi_param 写错了

写成了 $request_filename 或者其他变量。

解决: 一定要用 $document_root$fastcgi_script_name。

坑2:伪静态和 PHP 冲突

配了伪静态,导致 PHP 请求被重写到别的地方了。

解决: 确保伪静态规则在 PHP location 之前,而且 PHP location 能正常匹配到 .php 请求。

坑3:多站点 root 不一致

A 站点的 PHP 请求跑到 B 站点去了。

原因: 多个站点的 root 配置不对。

解决: 每个站点的 root 都写清楚,别共用。

坑4:PHP-FPM 配置不对

PHP-FPM 的 www.conf 里的 listen 路径和 Nginx 配置的不一致。

解决: 确认两边的 socket 路径一样。

总结

90% 的情况都是 root 路径不对。

检查这三点:

  1. root 路径写对了没
  2. 文件真的存在不
  3. 文件权限对不对

记住: PHP 配置里一定要用 $document_root$fastcgi_script_name,别写死路径。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:51 

Nginx配置访问密码,限制后台访问 Nginx

前言

网站后台地址公开,谁都能访问,容易被别人扫到然后暴力破解。给后台加一层 Nginx 访问密码,多一道防护。

什么是访问密码

就是访问某个目录前,浏览器先弹一个登录框,输入用户名密码才能进去。和网站本身的登录是两回事。

第一步:生成密码文件

用 htpasswd 命令生成密码文件:

htpasswd -c /etc/nginx/.htpasswd admin

第一次加 -c 创建文件,输入两次密码。

不加 -c 是追加新用户:

htpasswd /etc/nginx/.htpasswd user2

如果没有 htpasswd 命令,先装:

yum install -y httpd-tools

第二步:Nginx 配置

给后台目录加密码:

location /admin/ {
    auth_basic "Admin Login";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

完整配置示例

server {
    listen       80;
    server_name  www.example.com;

    root  /var/www/html;
    index index.php index.html;

    # 后台加密码
    location /admin/ {
        auth_basic "Admin Login";
        auth_basic_user_file /etc/nginx/.htpasswd;

        # 后台本身的 PHP 配置
        location ~ \.php$ {
            fastcgi_pass   unix:/run/php-fpm/www.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }

    # 前台正常访问
    location / {
        try_files $uri $uri/ =404;
    }
}

重载生效

nginx -t
nginx -s reload

常见坑

坑1:.htpasswd 文件权限不对

Nginx 读不到密码文件。

解决: 确保文件权限是 644,属主是 www:

chown www:www /etc/nginx/.htpasswd
chmod 644 /etc/nginx/.htpasswd

坑2:PHP 文件不弹密码

访问 /admin/index.php 直接就进了,没弹密码框。

原因: PHP 的 location 把请求拦截了,没走 auth_basic。

解决: 把 auth_basic 配置放到 PHP 的 location 里,或者放到 server 级别。

坑3:忘记密码

自己把密码忘了。

解决: 重新生成:

htpasswd -b /etc/nginx/.htpasswd admin 新密码

坑4:密码文件放网站目录里

把 .htpasswd 放在了网站根目录下,别人能直接下载。

解决: 密码文件放在网站目录外面,比如 /etc/nginx/ 下面。

总结

两步搞定:

  1. htpasswd 生成密码文件
  2. Nginx 加 auth_basic 配置

记住: 密码文件别放网站目录里,放在外面安全。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:50 

Nginx日志切割,按天切割nginx日志 Nginx

前言

Nginx 的访问日志一直写在一个文件里,越写越大,几百GB都有可能。磁盘满了网站就挂了。本文讲一下怎么用 logrotate 自动按天切割 Nginx 日志。

为什么要切割日志

  • 日志太大占磁盘
  • 分析大文件慢
  • 出问题查日志不方便

方法一:用系统自带的 logrotate

CentOS 自带 logrotate,直接配就行。

第一步:写配置文件

vi /etc/logrotate.d/nginx

内容:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    notifempty
    create 0644 www www
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

参数说明:

参数 说明
daily 按天切割
rotate 30 保留30天的日志
compress 压缩旧日志
notifempty 空文件不切割
missingok 日志文件不存在不报错

第二步:测试一下

logrotate -d /etc/logrotate.d/nginx

-d 是调试模式,不会真执行,看一下有没有报错。

第三步:立即执行一次

logrotate -f /etc/logrotate.d/nginx

方法二:自己写脚本

不想用 logrotate,自己写个 shell 脚本:

vi /root/nginx_log.sh

内容:

#!/bin/bash

LOG_PATH=/var/log/nginx
YESTERDAY=$(date -d "yesterday" +%Y%m%d)

cd $LOG_PATH

mv access.log access_$YESTERDAY.log
mv error.log error_$YESTERDAY.log

nginx -s reopen

加执行权限:

chmod +x /root/nginx_log.sh

加到 crontab,每天凌晨执行:

crontab -e

加一行:

0 0 * * * /root/nginx_log.sh

常见坑

坑1:切割后日志不写了

把日志文件改名了,Nginx 还往旧文件写。

原因: Nginx 打开的是文件句柄,改名后它不知道。

解决: 切割后要通知 Nginx 重新打开日志文件:

nginx -s reopen

坑2:旧日志没删,磁盘还是满的

配了切割,但旧日志还留着。

原因: 没配 rotate 参数。

解决: 加上 rotate 30,自动只保留30天。

坑3:压缩太占CPU

所有日志都压缩,CPU 飙高。

解决: 错峰压缩,比如凌晨3点再压缩,或者用 delaycompress 延迟一天再压缩。

坑4:日志权限不对

切割后新日志文件属主不对,Nginx 写不了。

解决: logrotate 配置里加 create 0644 www www。

总结

推荐用 logrotate,系统自带,不用自己维护脚本。

核心配置就这些:

/var/log/nginx/*.log {
    daily
    rotate 30
    compress
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid`
    endscript
}

记住: 切割完一定要通知 Nginx 重新打开日志文件,不然新日志不写。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:49 

Nginx配置websocket反向代理 Nginx

前言

做实时聊天、推送、在线游戏,需要用 WebSocket。Nginx 当反向代理的时候,默认不支持 WebSocket 协议,需要额外配置。本文讲一下怎么配。

WebSocket 是什么

WebSocket 是一种全双工通信协议,浏览器和服务器建立连接后,可以一直保持连接,互相实时推送消息。

为什么需要特殊配置

普通 HTTP 请求是短连接,请求完就断了。WebSocket 是长连接,而且用的是 Upgrade 协议头。Nginx 默认的反向代理不支持这种升级,需要加特殊配置。

基础配置

location /ws/ {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

关键就是这三行:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

完整配置示例

server {
    listen       80;
    server_name  www.example.com;

    root  /var/www/html;
    index index.html;

    # WebSocket 代理
    location /ws/ {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_read_timeout 300s;
    }

    # 普通 HTTP 代理
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

超时配置

WebSocket 是长连接,默认超时时间短了会自动断开。

proxy_read_timeout 300s;
proxy_send_timeout 300s;

意思是:5分钟没有数据传输才断开。

常见坑

坑1:WebSocket 连接失败

前端连 WebSocket 一直失败。

原因: Nginx 没配 Upgrade 和 Connection 头。

解决: 加上那三行关键配置。

坑2:连接几秒就自动断了

连上了,过一会儿就断了。

原因: Nginx 默认超时时间太短(60秒)。

解决: 调大 proxy_read_timeout。

坑3:HTTPS 下 WebSocket 连不上

HTTP 下正常,HTTPS 下连不上。

原因: 前端用了 ws://,但网站是 https 的,浏览器不让。

解决: 前端用 wss://(加密的 WebSocket)。

坑4:连接数太多被拒

很多人同时在线,新的连接被拒了。

原因: Nginx 或后端服务器连接数限制。

解决: 调大 Nginx 和后端的连接数限制。

总结

WebSocket 代理就三行核心配置:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

记住: WebSocket 是长连接,记得调大超时时间,别让它自动断了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:48 

Nginx防盗链配置,防止图片被别人盗用 Nginx

前言

网站的图片被别人盗链了,他的网站直接用你的图片地址,流量全从你服务器走,白白消耗带宽。Nginx 可以配置防盗链,防止这种情况。

什么是盗链

就是别人在自己网站里直接引用你服务器上的图片。用户看他的网站,实际图片是从你服务器加载的。

防盗链原理

Nginx 检查请求头里的 Referer 字段,看是从哪个页面过来的。如果不是自己网站的 Referer,就拒绝或者返回一张提示图。

基础配置

location ~* \.(jpg|png|gif|jpeg)$ {
    valid_referers none blocked www.example.com example.com;
    if ($invalid_referer) {
        return 403;
    }
}

解释:

  • valid_referers:允许哪些来源访问
  • none:允许直接输入地址访问
  • blocked:允许伪装的 Referer
  • www.example.com:自己的域名

配置示例

server {
    listen       80;
    server_name  www.example.com;

    root  /var/www/html;
    index index.html;

    # 防盗链
    location ~* \.(jpg|png|gif|jpeg|webp)$ {
        valid_referers none blocked www.example.com example.com *.example.com;
        if ($invalid_referer) {
            return 403;
        }
    }
}

替换成提示图

不想直接 403,可以返回一张"禁止盗链"的提示图:

location ~* \.(jpg|png|gif|jpeg)$ {
    valid_referers none blocked www.example.com example.com;
    if ($invalid_referer) {
        rewrite ^/.*\.(jpg|png|gif)$ /no-hotlink.png last;
    }
}

这样别人盗链就显示一张提示图。

常见坑

坑1:自己网站图片也加载不出来

配了防盗链,自己网站的图片也打不开了。

原因: valid_referers 里没写全自己的域名。

解决: 把 http 和 https 的域名都写上:

valid_referers none blocked www.example.com example.com;

坑2:搜索引擎图片也被挡了

百度图片搜不到你的图片了。

原因: 防盗链把搜索引擎也挡了。

解决: 加上搜索引擎的 Referer:

valid_referers none blocked www.example.com example.com *.baidu.com *.google.com;

坑3:CDN 后面防盗链不生效

用了 CDN,防盗链配置不生效。

原因: 请求经过 CDN,Referer 是 CDN 的。

解决: CDN 那边配置防盗链,或者把 CDN 的 Referer 加到白名单。

坑4:微信里打开图片不显示

在微信里打开自己的文章,图片显示不出来。

原因: 微信的 Referer 被挡了。

解决: 加上微信的 Referer:

valid_referers none blocked www.example.com example.com *.weixin.qq.com;

总结

防盗链就三行配置:

valid_referers none blocked www.example.com example.com;
if ($invalid_referer) {
    return 403;
}

记住: 配完防盗链,先测试一下自己网站图片能不能正常打开。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:47 

Nginx安装后找不到配置文件,编译安装路径 Nginx

前言

编译安装 Nginx 后,想用 nginx 命令提示 command not found,找配置文件也找不到。这是因为编译安装的 Nginx 不在系统默认 PATH 里,路径和包管理器安装的不一样。

编译安装的默认路径

一般编译安装 Nginx,默认装在:

/usr/local/nginx/

目录结构:

/usr/local/nginx/
├── sbin/
│   └── nginx          # 主程序
├── conf/
│   ├── nginx.conf     # 主配置文件
│   ├── mime.types
│   └── fastcgi_params
├── html/              # 默认网站目录
└── logs/
    ├── access.log
    └── error.log

怎么确认安装路径

方法一:nginx -V

/usr/local/nginx/sbin/nginx -V

输出里 --prefix= 后面就是安装路径。

方法二:ps 命令看进程

ps aux | grep nginx

进程路径就是 Nginx 在哪。

把 nginx 加到 PATH

不想每次都输完整路径,加个软链接:

ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx

之后直接用 nginx 命令就行。

配置文件在哪

编译安装的配置文件在:

/usr/local/nginx/conf/nginx.conf

编辑:

vi /usr/local/nginx/conf/nginx.conf

常用命令

# 启动
/usr/local/nginx/sbin/nginx

# 重载
/usr/local/nginx/sbin/nginx -s reload

# 停止
/usr/local/nginx/sbin/nginx -s stop

# 检查配置
/usr/local/nginx/sbin/nginx -t

开机自启

编译安装的 Nginx 没有 systemd 服务,需要自己写:

vi /etc/systemd/system/nginx.service

内容:

[Unit]
Description=Nginx Web Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop

[Install]
WantedBy=multi-user.target

然后:

systemctl daemon-reload
systemctl enable nginx
systemctl start nginx

常见坑

坑1:nginx: command not found

执行 nginx 提示找不到命令。

原因: 编译安装的不在 PATH 里。

解决: 加软链接,或者用完整路径。

坑2:改了配置不生效

改了 /etc/nginx/nginx.conf,但重载后还是老配置。

原因: 你改的是包管理器安装的配置文件,实际跑的是编译安装的。

解决: 用 nginx -t 确认一下实际加载的是哪个配置文件。

坑3:多个 nginx 共存

系统里同时有 yum 安装的和编译安装的 Nginx,不知道哪个在跑。

解决: 先停掉一个,再看进程。

坑4:日志找不到

日志不在 /var/log/nginx/。

原因: 编译安装的日志在自己的目录里。

解决: 看 nginx.conf 里的 error_log 和 access_log 配置。

总结

编译安装 Nginx 记住三个路径:

内容 路径
主程序 /usr/local/nginx/sbin/nginx
配置文件 /usr/local/nginx/conf/nginx.conf
日志 /usr/local/nginx/logs/

记住: 编译安装的和 yum 安装的路径不一样,别搞混了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:46 

Nginx配置上传文件大小限制,client_max_body_size Nginx

前言

用户上传大文件,提示 413 Request Entity Too Large,这就是 Nginx 默认上传文件大小限制太小了。本文讲一下怎么改上传大小限制。

报错是什么样的

413 Request Entity Too Large

Nginx 默认限制是 1MB,传个大点的文件就报错。

配置方法

第一步:改 Nginx 配置

在 http 或 server 块里加:

client_max_body_size 50m;

意思是:最大允许上传 50MB 的文件。

第二步:同时改 PHP 配置

光改 Nginx 不够,PHP 自己也有上传限制:

upload_max_filesize = 50M
post_max_size = 50M

完整配置示例

Nginx 配置:

server {
    listen       80;
    server_name  www.example.com;

    root  /var/www/html;
    index index.php index.html;

    # 上传文件大小限制
    client_max_body_size 50m;

    location ~ \.php$ {
        fastcgi_pass   unix:/run/php-fpm/www.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

PHP 配置(php.ini):

upload_max_filesize = 50M
post_max_size = 50M

重载生效

nginx -t
nginx -s reload

systemctl restart php-fpm

常见坑

坑1:只改了 Nginx,PHP 没改

改了 Nginx 的 client_max_body_size,但 PHP 的 upload_max_filesize 还是 2M,传大点的文件还是报错。

解决: Nginx 和 PHP 两边都要改。

坑2:413 还是 413

改了配置重载了,但还是 413。

原因: 改的不是实际加载的配置文件。

解决: 用 nginx -t 确认一下配置文件路径。

坑3:上传大文件超时

传个 50MB 的文件,传到一半 504 超时了。

原因: 上传慢,超时了。

解决: 调大超时时间:

client_body_timeout 300s;
fastcgi_read_timeout 300s;

坑4:post_max_size 比 upload_max_filesize 小

PHP 里 post_max_size 必须比 upload_max_filesize 大,否则还是上传不了。

建议: 两个设成一样大。

推荐配置

一般网站传图片、文档,设 20MB 够了:

client_max_body_size 20m;
upload_max_filesize = 20M
post_max_size = 20M

如果是视频网站,设 100MB 或更大。

总结

上传文件限制要改三个地方:

  1. Nginx 的 client_max_body_size
  2. PHP 的 upload_max_filesize
  3. PHP 的 post_max_size

记住: 改完两边都要重载,别只改一边。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:44 

Nginx负载均衡配置,upstream多台服务器 Nginx

前言

网站访问量上来了,一台服务器扛不住,想用多台服务器一起跑。Nginx 的负载均衡功能就是干这个的:前面一台 Nginx 当入口,后面多台服务器一起干活。

什么是负载均衡

用户请求 → Nginx(负载均衡)→ 服务器A
                          → 服务器B
                          → 服务器C

Nginx 把请求按规则分发到不同的后端服务器,分担压力。

基础配置

第一步:定义 upstream

在 http 块里定义后端服务器组:

upstream backend {
    server 192.168.1.101:80;
    server 192.168.1.102:80;
    server 192.168.1.103:80;
}

第二步:反向代理到后端

server {
    listen       80;
    server_name  www.example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

负载均衡策略

轮询(默认)

默认就是轮询,一个一个轮流来。

upstream backend {
    server 192.168.1.101;
    server 192.168.1.102;
}

加权轮询

服务器性能不一样,性能好的多分点请求:

upstream backend {
    server 192.168.1.101 weight=3;
    server 192.168.1.102 weight=1;
}

意思是:每4个请求,3个给101,1个给102。

ip_hash

同一个用户的请求永远打到同一台服务器(解决 session 问题):

upstream backend {
    ip_hash;
    server 192.168.1.101;
    server 192.168.1.102;
}

健康检查

某台服务器挂了,Nginx 自动把它踢出去:

upstream backend {
    server 192.168.1.101 max_fails=3 fail_timeout=30s;
    server 192.168.1.102 max_fails=3 fail_timeout=30s;
}

意思是:3次失败就暂停30秒不发请求给它。

完整配置示例

http {
    upstream backend {
        server 192.168.1.101 weight=3 max_fails=3 fail_timeout=30s;
        server 192.168.1.102 weight=1 max_fails=3 fail_timeout=30s;
    }

    server {
        listen       80;
        server_name  www.example.com;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

常见坑

坑1:session 不一致

用户登录了,刷新一下又掉登录。

原因: 轮询把请求分到不同服务器,session 没共享。

解决: 用 ip_hash,或者用 Redis 统一存 session。

坑2:后端服务器改了但 Nginx 没生效

加了一台新服务器,配置也写了,但没重载。

解决: nginx -s reload。

坑3:后端服务端口不对

后端跑在 8080 端口,upstream 里写的 80。

解决: upstream 里写对端口。

坑4:后端获取不到真实 IP

后端日志里记的都是 Nginx 的 IP。

解决: 加 X-Forwarded-For 头:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

总结

负载均衡就两步:

  1. upstream 定义后端服务器列表
  2. proxy_pass 转发到 upstream

记住: 多台服务器用负载均衡,记得处理 session 共享问题。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:43 

Nginx报504 Gateway Timeout超时排查 Nginx

前言

访问网站提示 504 Gateway Timeout,意思是 Nginx 把请求转发给后端(PHP-FPM 或其他服务),后端半天没响应,Nginx 等不及了就返回 504。本文讲一下 504 的排查思路。

504 和 502 的区别

  • 502 Bad Gateway:后端服务直接挂了,连不上
  • 504 Gateway Timeout:后端服务在跑,但响应太慢,超时了

常见原因

原因1:PHP 程序执行太慢

一个 PHP 请求要跑 30 秒,Nginx 默认等 60 秒就超时了。

解决: 优化 PHP 代码,或者调大 Nginx 超时时间。

原因2:PHP-FPM 进程不够

PHP-FPM 进程数用完了,新请求排队等着。

解决: 增加 PHP-FPM 进程数。

原因3:后端服务挂了

后端的 Java/Node.js 服务没启动,或者端口不对。

解决: 确认后端服务在跑。

排查步骤

第一步:看 Nginx 错误日志

tail -f /var/log/nginx/error.log

找具体是哪个请求超时了。

第二步:看 PHP-FPM 状态

ps aux | grep php-fpm

看进程数是不是满了。

第三步:直接访问后端

绕过 Nginx,直接访问后端服务:

curl http://127.0.0.1:9000/

看后端自己响应快不快。

调大 Nginx 超时时间

如果程序确实需要跑很久,调大超时时间:

location ~ \.php$ {
    fastcgi_pass   unix:/run/php-fpm/www.sock;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;

    # 超时时间
    fastcgi_connect_timeout 60s;
    fastcgi_send_timeout    60s;
    fastcgi_read_timeout    60s;
}

参数说明:

参数 说明
fastcgi_connect_timeout 连接后端超时时间
fastcgi_send_timeout 发送请求超时时间
fastcgi_read_timeout 读响应超时时间

增加 PHP-FPM 进程数

PHP-FPM 配置文件一般在 /etc/php-fpm.d/www.conf:

pm = static
pm.max_children = 50

改成 50 个进程,重载 PHP-FPM。

常见坑

坑1:只调了 Nginx 超时

调了 Nginx 超时,但 PHP 自己也有超时(max_execution_time)。

解决: 同时改 php.ini:

max_execution_time = 60

坑2:后端服务重启了但 Nginx 没重载

后端服务换了端口,Nginx 还连旧端口。

解决: 改完配置 nginx -s reload。

坑3:大文件上传超时

上传大文件,跑到一半 504。

原因: 上传慢,超时了。

解决: 调大 client_body_timeout 和 fastcgi_read_timeout。

坑4:CDN 也有超时

用了 CDN,CDN 自己也有超时限制。

解决: CDN 那边也调大超时时间。

总结

504 排查三步:

  1. 看 Nginx 错误日志
  2. 确认后端服务在跑
  3. 程序优化 or 调大超时时间

记住: 504 是后端响应太慢,不是 Nginx 本身的问题。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:42 

Nginx配置访问日志,日志格式详解 Nginx

前言

网站出问题了,想查一下谁访问过哪个页面,怎么查?Nginx 的访问日志就记录了所有请求。本文讲一下 Nginx 怎么配置访问日志,日志格式都有什么字段。

默认日志位置

Nginx 默认访问日志在:

/var/log/nginx/access.log

错误日志在:

/var/log/nginx/error.log

查看实时日志

tail -f /var/log/nginx/access.log

日志格式定义

Nginx 自带一个默认格式叫 combined:

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

常用日志变量

变量 说明
$remote_addr 客户端 IP
$time_local 本地时间
$request 请求行(方法+URL+协议)
$status 状态码
$body_bytes_sent 发送字节数
$http_referer 来源页面
$http_user_agent 浏览器 UA

自定义日志格式

想多记点信息,比如响应时间、X-Forwarded-For:

log_format myformat '$remote_addr - [$time_local] '
                     '"$request" $status $body_bytes_sent '
                     '"$http_referer" "$http_user_agent" '
                     'rt=$request_time uct="$upstream_connect_time"';

access_log /var/log/nginx/access.log myformat;

单独给某个站点配日志

多站点的时候,每个站点单独记日志:

server {
    listen       80;
    server_name  www.aaa.com;

    root  /var/www/aaa;
    index index.html;

    access_log /var/log/nginx/aaa_access.log;
    error_log  /var/log/nginx/aaa_error.log;
}

关闭日志

不想记日志(不推荐):

access_log off;

常见坑

坑1:用了 CDN,日志里都是 CDN IP

访问日志里记的都是 CDN 的 IP,不是真实用户的。

原因: 请求经过 CDN 转发了。

解决: 记 X-Forwarded-For:

log_format combined '$http_x_forwarded_for - $remote_user [$time_local] ...';

坑2:日志太大占磁盘

访问日志一直写,把磁盘占满了。

解决: 配 logrotate 自动切割日志。

坑3:查不到某个 IP 的访问记录

想查某个 IP 今天访问了多少次,日志里没有。

原因: 日志已经被切割轮转了。

解决: 看昨天的日志文件:

grep "IP地址" /var/log/nginx/access.log.1

坑4:日志权限不对

Nginx 写不了日志。

解决: 确保日志目录属主是 www:

chown -R www:www /var/log/nginx/

常用日志分析命令

统计访问量前10的IP:

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10

统计 404 最多的页面:

awk '($9 == 404)' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr

总结

一行配置开启日志:

access_log /var/log/nginx/access.log;

记住: 日志是排查问题的第一手资料,出事先看日志。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:41 

Nginx限制请求速率,防止CC攻击配置 Nginx

前言

网站被 CC 攻击,一个人疯狂刷页面,服务器直接卡死。Nginx 自带请求限速功能,能防止这种恶意刷接口、刷页面的行为。

什么是 CC 攻击

CC 攻击就是模拟正常用户,疯狂访问网站,把服务器资源耗尽,正常用户打不开网站。

Nginx 限速配置

用 limit_req_zone 定义限速规则,用 limit_req 应用到具体位置。

第一步:定义限速规则

在 http 块里(一般在 nginx.conf 或 conf.d 目录的配置文件里):

# 定义一个叫 "allips" 的区域,按 IP 限速,每秒允许 10 个请求
limit_req_zone $binary_remote_addr zone=allips:10m rate=10r/s;

解释:

  • $binary_remote_addr:按客户端 IP 限速
  • zone=allips:10m:定义一个叫 allips 的内存区域,10M 大小
  • rate=10r/s:每秒允许 10 个请求

第二步:在具体位置应用

server {
    listen       80;
    server_name  www.example.com;

    root  /var/www/html;
    index index.php index.html;

    # 应用限速
    limit_req zone=allips burst=20 nodelay;

    location / {
        try_files $uri $uri/ =404;
    }
}

burst=20 意思是:允许突发 20 个请求排队,超过就拒绝。

完整配置示例

http {
    # 定义限速区域
    limit_req_zone $binary_remote_addr zone=allips:10m rate=10r/s;

    server {
        listen       80;
        server_name  www.example.com;

        root  /var/www/html;
        index index.php index.html;

        # 应用限速
        limit_req zone=allips burst=20 nodelay;

        location / {
            try_files $uri $uri/ =404;
        }
    }
}

常用限速参数

参数 说明
rate=10r/s 每秒 10 个请求
rate=30r/m 每分钟 30 个请求
burst=20 允许 20 个突发请求排队
nodelay 突发请求不延迟,立即处理

只限制某个接口

不想全站限速,只想限制某个接口?

location /api/login {
    limit_req zone=allips burst=5 nodelay;
}

这样只有登录接口限速,其他接口不限。

常见坑

坑1:限速太严,正常用户也被拦了

设了 rate=1r/s,用户点一下按钮就 503。

解决: 把速率调宽一点,比如 rate=10r/s,burst=20。

坑2:用了 CDN,限速按 CDN IP 算了

用了 CDN,所有请求都从 CDN 过来,Nginx 看到的都是 CDN 的 IP,把 CDN 给限了。

解决: 用真实客户端 IP 来限速:

set_real_ip_from  CDN的IP段;
real_ip_header    X-Forwarded-For;

limit_req_zone $realip zone=allips:10m rate=10r/s;

坑3:报错 503 Too Many Requests

用户访问提示 503。

原因: 请求太快,被限速了。

解决: 调大 burst 和 rate。

坑4:limit_req_zone 写在 server 块里

把 limit_req_zone 写在 server 块里了,Nginx 报错。

原因: limit_req_zone 只能写在 http 块里。

解决: 挪到 nginx.conf 的 http 块里。

总结

防 CC 攻击就这三步:

  1. http 块里定义 limit_req_zone
  2. server 块里加 limit_req
  3. nginx -s reload 重载

记住: 限速别太严,正常用户别给拦了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:39 

Nginx设置默认首页,index.html配置 Nginx

前言

访问网站根目录,Nginx 不知道默认打开哪个文件,就返回 403 或者 404。这是因为没配置默认首页。本文讲一下 Nginx 怎么设置默认首页。

什么是默认首页

用户访问 www.example.com/,Nginx 自动找目录下的 index.html 打开,不用手动输入文件名。

配置方法

用 index 指令设置:

server {
    listen       80;
    server_name  www.example.com;

    root  /var/www/html;
    index index.html;
}

多个默认首页

Nginx 会按顺序找,找到第一个存在的就用:

index index.html index.htm index.php;

意思是:先找 index.html,没有就找 index.htm,再没有就找 index.php。

完整站点配置

server {
    listen       80;
    server_name  www.example.com;

    root  /var/www/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        fastcgi_pass   unix:/run/php-fpm/www.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

自定义默认首页

不想用 index.html,想用别的文件名?

index default.html;

这样访问根目录就打开 default.html。

常见坑

坑1:访问根目录 403 Forbidden

配置了 root,也放了 index.html,但访问还是 403。

原因1: 文件名写错了,比如是 Index.html(大写 I)。

解决: Linux 区分大小写,文件名必须和 index 配置一致。

原因2: 文件权限不对。

解决: 确保文件权限是 644,目录是 755。

坑2:默认首页不生效

改了 index 配置,但还是打开旧的首页。

原因: 没重载 Nginx。

解决:

nginx -s reload

坑3:PHP 首页不解析

默认首页设成 index.php,但访问直接下载 PHP 文件。

原因: PHP 解析配置没写对。

解决: 确保有 PHP 的 location 配置:

location ~ \.php$ {
    fastcgi_pass   unix:/run/php-fpm/www.sock;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

坑4:静态首页和 PHP 首页顺序

index 里先写 index.html 还是 index.php?

建议: 把常用的放前面。如果主要是 PHP 程序,就把 index.php 放前面。

总结

一行配置搞定:

index index.php index.html index.htm;

记住: index 后面跟多个文件名,Nginx 按顺序找,找到第一个存在的就用。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:38 
'); })();