跳到主要内容

3、nginx排错

nginx排错

2021.1.1-TS:nginx 报错文件描述符不够,返回了 500 错误码(仅收藏)

报错现象

网站第一次事故:网站上线 10 分钟就挂了,原因是我没有调大 nginx 的 worker 进程的文件描述符,导致有大量客户端访问的时候,nginx 报错文件描述符不够,返回了 500 错误码。

来自:

小林coding

https://xiaolincoding.com/

image-20230917172325900

为什么会有 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 服务在浏览器中显示中文为乱码,可能是由于字符编码设置不正确导致的问题。以下是一些建议的解决方法:

  1. 设置字符编码:

    • 在 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  这个是为啥?

image-20240803131347890

这个警告 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;
}
}

总结

  1. 不要在 server_name 中使用协议或请求 URIserver_name 指令应只包含域名或 IP 地址。
  2. 使用 returnrewrite 指令进行重定向:如果需要将 HTTP 请求重定向到 HTTPS,请使用适当的重定向指令。

通过正确的配置,你可以消除警告并确保 Nginx 正常工作。

2024.8.10-TS-网站无法强制跳转https(已解决)

image-20240810072605282

故障现象

奇怪,我的网站怎么没法强制https??

http访问依然是http的:

http://wiki.onedayxyy.cn/

image-20240810071246877

https访问:

https://wiki.onedayxyy.cn/

image-20240810071315820

排查过程

检查nginx配置

nginx.conf配置:

image-20240810071419753

Nginx这里的配置是没问题的哦:。。。。。(那估计是cdn那里里有问题)

image-20240810071446925

检查cdn配置

原来配置:

image-20240810071557276

解决办法

配置cdn里的https为强制跳转:

修改后:

image-20240810071625182

验证效果

再次:清空浏览器缓存后,再次用http访问后,会发现此时被强制跳转到了https

http://wiki.onedayxyy.cn/

image-20240810071712849

用curl再次测试下:

image-20240810071843325

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号

《云原生架构师实战》

image-20230107215126971

🍀 个人主页:

https://onedayxyy.cn

image-20240805214647028

🍀 知识库:

https://wiki.onedayxyy.cn/

image-20240804075128231

🍀 博客:

http://blog.onedayxyy.cn/

image-20240804075845906

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

往期推荐

我的开源项目:

https://wiki.onedayxyy.cn/docs/OpenSource

image-20240808061730115

玩转Typora+Docusuaurus+起始页交流群:

image-20240804095452509

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!