V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
drymonfidelia
V2EX  ›  NGINX

有台生产服务器, Nginx 每天都会因为不同原因 exit 一次,虽然配了自动重启,有没办法排查是什么原因?平均一天 1820 万请求

  •  
  •   drymonfidelia · 84 天前 · 3014 次点击
    这是一个创建于 84 天前的主题,其中的信息可能已经有所发展或是发生改变。

    每天原因都不一样,这是今天的日志

    Aug 15 13:07:32 hostname nginx[3297853]: nginx: [emerg] host not found in upstream "backend.example.com" in /etc/nginx/sites-enabled/app1:25
    Aug 15 13:07:32 hostname nginx[3297853]: nginx: configuration file /etc/nginx/nginx.conf test failed
    Aug 15 13:07:32 hostname systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
    Aug 15 13:07:32 hostname systemd[1]: nginx.service: Failed with result 'exit-code'.
    Aug 15 13:07:32 hostname systemd[1]: Failed to start A high performance web server and a reverse proxy server.
    

    在这几秒前崩了没写日志,这个日志是刚自动重启后又崩了的。没改配置,10 秒后第三次自动重启就成功了。backend 在别的服务器上,内网 DNS 也一直正常

    24 条回复    2024-08-16 15:02:04 +08:00
    NevadaLi
        1
    NevadaLi  
       84 天前
    upstream 后端没起来?
    daimaosix
        2
    daimaosix  
       84 天前
    看看是不是被 CC 了
    kk2syc
        3
    kk2syc  
       84 天前
    内网 DNS 的问题,在 /etc/hosts 中配置 backend.example.com IP 试试看
    lpe234
        4
    lpe234  
       84 天前
    感觉,`内网 DNS 也一直正常` 和 `host not found in upstream "backend.example.com" ` 相比较而言,NGINX 的日志更可信
    yannxia
        5
    yannxia  
       84 天前
    host not found in upstream ,这个很明确吧···
    billbur
        6
    billbur  
       84 天前
    "backend.example.com"这可不像一个生产环境该出现的域名
    drymonfidelia
        7
    drymonfidelia  
    OP
       84 天前
    @billbur 是公司的域名,我发日志的时候换成了 example
    march1993
        8
    march1993  
       84 天前
    @drymonfidelia 挂之前的日志呢? sudo dmesg 看看有没有 OOM
    drymonfidelia
        9
    drymonfidelia  
    OP
       84 天前
    @march1993 挂之前没有日志,就突然挂了
    wushenlun
        10
    wushenlun  
       84 天前 via Android
    upstream 别写域名写 ip ,内网 dns 问题,最好要有 debug 日志
    yinmin
        11
    yinmin  
       84 天前
    upstream 写 ip 。如果 upstream 是 http ,加:proxy_set_header ;如果 upstream 是 https ,加:proxy_ssl_name 、proxy_ssl_server_name 、proxy_set_header

    参考代码如下:
    location /app/ {
    proxy_pass https://192.168.1.100:443;
    proxy_ssl_name backend.example.com;
    proxy_ssl_server_name on;
    proxy_set_header Host backend.example.com;
    ...
    }
    abolast
        12
    abolast  
       84 天前
    /etc/nginx/sites-enabled/app1 这个文件应该脱敏贴一下吧,nginx 迭代这么多年指定是不会有容易被碰到的 bug ,大概率是你配置写得有问题
    catamaran
        13
    catamaran  
       84 天前
    有工具在改配置文件? configuration file /etc/nginx/nginx.conf test failed
    runwu2022
        14
    runwu2022  
       84 天前
    nginx 的配置文件里面 upstream 块配置检查一下,报错明显指向 upstream 内的 server host 主机无法解析或者无法找到
    blackeeper
        15
    blackeeper  
       84 天前
    这个问题我遇到过,排查过,就是内网 DNS 服务器的问题,写死到 hosts 文件就可以了
    drymonfidelia
        16
    drymonfidelia  
    OP
       84 天前
    @wushenlun
    @runwu2022
    @blackeeper
    @yinmin 我记得 Nginx 是只有启动的时候会解析一次 DNS ,如果是 DNS 的问题的话应该不会中途崩掉吧?
    @abolast 里面 import 了十几个文件,不知道应该贴哪个
    hefish
        17
    hefish  
       83 天前
    @drymonfidelia /etc/nginx/sites-enabled/app1 贴这个。
    yinmin
        18
    yinmin  
       83 天前
    @drymonfidelia

    关于“host not found in upstream”错误,你使用 11 楼的写法,就可以避免了。

    关于不明原因的退出重启,如果你的 nginx 是基于 systemd (systemctl)部署的,你可以试试这命令查看 nginx 系统级日志:journalctl -u nginx

    如果使用 docker 部署的,可以试试:docker logs <nginx 容器名称>
    zpfhbyx
        19
    zpfhbyx  
       83 天前
    ```
    upstream backend {
    server xxx.com;
    }

    localtion / {
    proxy_pass http://backend;
    ......
    }
    ```
    blackeeper
        20
    blackeeper  
       83 天前
    @drymonfidelia 你这个 nginx 是 reload 了,然后 dns 没办法解析,ng 就退出了。
    xxxccc
        21
    xxxccc  
       83 天前
    “/etc/nginx/sites-enabled/app1:25” 看看这个文件的第 25 行吧
    drymonfidelia
        22
    drymonfidelia  
    OP
       83 天前
    @xxxccc 第 25 行就是 proxy_pass 没什么特别的
    drymonfidelia
        23
    drymonfidelia  
    OP
       83 天前
    @yinmin 我贴的就是 `journalctl -u nginx` 输出的日志,之前不知道为什么没输出日志直接崩了,现在按照你说的把域名换成 IP 了,不知道今天还会不会崩
    yinmin
        24
    yinmin  
       83 天前
    @drymonfidelia 你查一下/var/log/nginx 下面的日志文件 access.log 、error.log 在 nginx 异常重启前的日志情况

    如果日志文件很大,可以使用 awk 根据时间查看:

    awk '$4 >= "[15/Aug/2024:13:07:00" && $4 <= "[15/Aug/2024:13:07:33"' /var/log/nginx/access.log
    awk '$1 >= "2024/08/15" && $1<= "2024/08/15" && $2 >="13:07:00" && $2<="13:07:33"' /var/log/nginx/error.log

    $4 是 access.log 的日期的位置,如果你们自定义过 access.log 的格式,可以修改到匹配的位置
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3898 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 10:19 · PVG 18:19 · LAX 02:19 · JFK 05:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.