nginx排错
nginx排错
2025.1.2-TS-nginx未启动报错-(已解决)
故障环境:自己源码编译安装好nginx,还没启动呢。。。。
(1)重载配置文件
[root@localhost sbin]# pwd
/home/geek/nginx/sbin
[root@localhost sbin]# vim ../conf/nginx.conf
#打开这个开关
tcp_nopush on;
自己的报错了:。。。
[root@localhost sbin]# ./nginx -s reload
nginx: [error] open() "/home/geek/nginx/logs/nginx.pid" failed (2: No such file or directory)
老师的没报错:
您在尝试重新加载 Nginx 配置时遇到了错误,提示无法找到 /home/geek/nginx/logs/nginx.pid
文件。这通常表示 Nginx 的 PID 文件没有按预期创建,可能是因为 Nginx 没有正确启动,或者配置文件中指定的路径不正确。以下是解决此问题的一些步骤:
1. 检查 Nginx 是否正在运行
首先,您可以检查 Nginx 是否已启动:
ps aux | grep nginx
如果没有看到 Nginx 的进程,说明 Nginx 可能没有启动。您可以通过以下命令来启动 Nginx:
sudo ./nginx
已解决。
2. 确保 PID 文件路径正确
根据您的 Nginx 配置文件,确认 PID 文件的位置是否正确。默认情况下,PID 文件位置通常是 /var/run/nginx.pid
。您可以在 Nginx 配置文件中查找 pid
指令,例如:
pid /var/run/nginx.pid;
如果您希望更改 PID 文件的路径,可以将其设置为有效的目录,确保该目录存在,并且 Nginx 进程有权限写入。
3. 创建日志目录
如果 /home/geek/nginx/logs/
目录不存在,您需要手动创建它。您可以使用以下命令:
mkdir -p /home/geek/nginx/logs
4. 检查错误日志
如果 Nginx 启动失败,您可以查看 Nginx 的错误日志,通常位于 /var/log/nginx/error.log
或您在配置文件中指定的其他位置。查看日志可以帮助您识别问题的具体原因。
5. 重新启动 Nginx
在修改配置或创建目录后,您可以重新启动 Nginx:(这个命令是也可以用来重启nginx。。。)
sudo ./nginx
6. 使用系统服务管理 Nginx
如果您是通过系统服务管理 Nginx(例如使用 systemd
),可以使用以下命令来启动、停止或重启 Nginx:
sudo systemctl start nginx # 启动 Nginx
sudo systemctl stop nginx # 停止 Nginx
sudo systemctl restart nginx # 重启 Nginx
sudo systemctl reload nginx # 重新加载配置
总结
通过以上步骤,您应该能够解决 PID 文件缺失的问题,并成功重新加载 Nginx。如果问题依然存在,建议您检查配置文件的正确性,或者查看错误日志以获取更多信息。如有其他问题,请随时询问!
2021.1.1-TS:nginx 报错文件描述符不够,返回了 500 错误码(仅收藏)
报错现象
网站第一次事故:网站上线 10 分钟就挂了,原因是我没有调大 nginx 的 worker 进程的文件描述符,导致有大量客户端访问的时候,nginx 报错文件描述符不够,返回了 500 错误码。
来自:
小林coding
为什么会有 500 错误?
收到大家反馈的错误后,我马上就去服务器查看 nginx 的 error 日志了,发现频繁报错了这个错误:“Too many open files”。
很快我就知道是文件描述符受限而导致 nginx 频繁报这个错误,每一个 TCP 连接都会占用一个文件描述符,当时发文不到 10 分钟,文章阅读就已经 1000 多了,瞬间一下子 1000 多个请求过来,就导致文件描述符被占满了,从而 nginx 就回 500 错误。
解决办法
所以,要解决这个问题,就要调大文件描述符的显示。
首先,先来看看系统的最大描述符数:
这个是默认值,有 18 万个,那肯定不是这里受限。
然后,通过 ulimit -n 查看每个用户的最大描述符数:
这个也是默认值,也有 6.5 万个,说明也不是这里受限。
然后,通过 /proc//limits 这个文件查看 nginx 工作进程的最大描述符数:
可以看到,最大值才 1024 个!猜测 nginx 工作进程的最大描述符数太小而导致 nginx 报 Too many open files 的错误。
要怎么调大 nginx 的工作进程的最大描述符数呢?
很简单,只需要在 nginx.conf 配置调大 worker_rlimit_nofile 的值,这个参数单跟每个工作进程可以建立的最大连接数量息息相关,我这里调大到了 65535。
然后重新 reload nginx 的配置,再查看 /proc//limits:
可以看到,nginx 的工作进程最大描述符已经设置为 65535。
调大 nginx 工作进程最大描述符后,nginx 的 error 日志就没有在报错了,至此 500 错误的问题就解决了。
2023.12.31-TS-nginx提供的http web服务浏览器界面显示中文为乱码(已解决)
- 故障环境
centos7.9
nginx version: nginx/1.20.1
故障现象
解决办法
nginx提供的http web服务浏览器界面显示中文为乱码?
如果 Nginx 提供的 HTTP Web 服务在浏览器中显示中文为乱码,可能是由于字符编码设置不正确导致的问题。以下是一些建议的解决方法:
设置字符编码:
在 Nginx 配置文件中,确保设置了正确的字符编码。你可以在配置文件的
http
块中添加如下设置:charset utf-8;
这会告诉浏览器使用 UTF-8 字符编码来解析页面内容。
- 测试过程
vim /etc/nginx/nginx.conf
……
charset utf-8;
重启Nginx。
测试效果
(问题已解决)
2024.8.4-TS-server_name字段错误配置(已解决)
故障现象
nginx: [warn] server name "https://$host$request_uri" has suspicious symbols in /etc/nginx/conf.d/blog.conf:47 这个是为啥?
这个警告 nginx: [warn] server name "https://$host$request_uri" has suspicious symbols in /etc/nginx/conf.d/blog.conf:47
表示在你的 Nginx 配置文件中的 server_name
指令包含了不适合的位置变量或字符。具体来说,server_name
指令只应该包含域名或IP地址,而不能包含协议 (https://
) 或请求 URI ($request_uri
等)。
可能的错误配置
你可能在 server_name
指令中错误地使用了变量或协议。例如:
server {
listen 80;
server_name https://$host$request_uri;
# 其他配置...
}
这是错误的配置,因为 server_name
只应包含域名。
解决方法
确保在 server_name
指令中仅包含适当的域名或 IP 地址。例如,假设你希望匹配主域名和子域名,你可以这样配置:
server {
listen 80;
server_name onedayxyy.cn *.onedayxyy.cn;
# 其他配置...
}
如果你需要将所有 HTTP 请求重定向到 HTTPS,你可以使用 return
指令或 rewrite
指令来实现。例如:
server {
listen 80;
server_name onedayxyy.cn *.onedayxyy.cn;
location / {
return 301 https://$host$request_uri;
}
}
或者:
server {
listen 80;
server_name onedayxyy.cn *.onedayxyy.cn;
location / {
rewrite ^ https://$host$request_uri? permanent;
}
}
总结
- 不要在
server_name
中使用协议或请求 URI:server_name
指令应只包含域名或 IP 地址。 - 使用
return
或rewrite
指令进行重定向:如果需要将 HTTP 请求重定向到 HTTPS,请使用适当的重定向指令。
通过正确的配置,你可以消除警告并确保 Nginx 正常工作。
2024.8.10-TS-网站无法强制跳转https(已解决)
故障现象
奇怪,我的网站怎么没法强制https??
http访问依然是http的:
https访问:
排查过程
检查nginx配置
nginx.conf配置:
Nginx这里的配置是没问题的哦:。。。。。(那估计是cdn那里里有问题)
检查cdn配置
原来配置:
解决办法
配置cdn里的https为强制跳转:
修改后:
验证效果
再次:清空浏览器缓存后,再次用http访问后,会发现此时被强制跳转到了https
用curl再次测试下: