Nginx引发的惨案

尘封三年的项目突然重新启动,当初的研发人员也早已不见踪影,留给我的只是一个不能访问的页面。

既然当初的项目能正常访问,说明代码是正常的,如今访问不了了,只可能是部署出现了问题。

我看了一下Apollo配置中心配置的注册中心的地址,登录到eureka的管理界面,发现相关的服务都已下线。

于是我进入到Gitlab的CI-CD界面,重新部署了服务,然后使用xshell连接到部署的物理机器上,docker ps查看所有服务都已启动,再进入到eureka界面确认所有服务都已注册成功。

本来以为着大功告成,结果挑战才刚刚开始。

前端页面能正常出来,但是后端接口却毫无反应。

我打开本地的hosts文件看了一下域名对应的ip地址,连接到对应的物理机器上,发现正是Nginx所在的机器。

ps -ef | grep nginx 检查nginx正常启动着。

nginx -t 查找nginx的配置文件地址。

打开主配置文件发现使用include命令包含了众多子配置文件,然后寻找对应的子配置文件。

grep -H ‘www.study.com’ * 查看所有子配置文件并过滤出包含www.study.com的文件名,找到对应server_name为www.study.com的子配置文件即为要寻找的子配置文件A。

打开子配置文件A,发现配置如下:

location /Prestudy{
		proxy_pass "http://www.learn.com";
	 }
location /study/web{
	    rewrite ^(/study/web/.*)$ $1 break;
		proxy_pass "http://www.learn.com";
		proxy_connect_timeout 60s;  # 连接超时
		proxy_send_timeout 60s;     # 发送超时
		proxy_read_timeout 60s;     # 读取超时
	 }

发现又转发到了www.learn.com,于是继续grep -H ‘www.learn.com’ *,找到最终的配置文件B。配置如下

server {
    listen       80;
    server_name www.learn.com;
    root  /var/opt/www.learn.com/dist;
    access_log  logs/www.learn.com.access.log;
    error_log  logs/www.learn.com.error.log;
  
     location ~ /Prestudy(/.*)$ {
         rewrite ^/Prestudy(/.*)$ /$1 last;
     }

     location /study/web{
        proxy_pass "http://10.100.15.66:9011";
     }


    location /{
         index index.php index.html index.htm;
         try_files $uri $uri/ /index.html = 404;
    }
    error_page  404              /404.html;
    error_page  500 502 503 504  /500.html;
}

发现配置文件最终将后端请求全部转发到了网关地址。但是去到网关服务发现并没有收到请求。

于是打开接入日志logs/www.learn.com.access.log,发现Nginx收到了请求,然后打开nginx错误日志logs/www.learn.com.error.log,发现报错如下:

2024/09/03 11:25:40 [error] 15111#0: *268648 upstream timed out (110: Connection timed out) while connecting to upstream, client: 127.0.0.1, server: www.learn.com, request: “GET /study/web/dic/query?type=ACT_TYPE&loginCustomerId=58c90aa9f5b95a57189ddc17&partnerCode=UKSAS&streamNo=web_saas1725334349404558813 HTTP/1.0”, upstream: “http://10.100.15.66:9011/study/web/dic/query?type=ACT_TYPE&loginCustomerId=123456&partnerCode=ABCDE&streamNo=6987415”, host: “www.learn.com”, referrer: “http://www.learn.com/Prestudy/activity?v=23978.882615937113&hidePanle=true”

怀疑是网络不通,于是ping 10.100.15.66 确实没反应,网络不通。

于是找了IT打开了nginx和 10.100.15.66之间的网络,ping通了。

本来问题到这里应该就结束了吧,结果问题还是没有那么简单。错误日志依旧还是上面那个。通过分析,二者之间好像是通过代理服务器连接的,反正最终还是不通。

然后还有另一台nginx服务器,与目标机器10.100.15.66之间的网络是通的,于是便想着把请求转发到这台nginx服务器上10.1.13.15。

修改配置文件A中的配置文件,使请求直接转发到10.1.13.15上。如下:

location /Prestudy{
		proxy_pass "http://10.1.13.15";
	 }
location /study/web{
	    rewrite ^(/study/web/.*)$ $1 break;
		proxy_pass "http://10.1.13.15";
		proxy_connect_timeout 60s;  # 连接超时
		proxy_send_timeout 60s;     # 发送超时
		proxy_read_timeout 60s;     # 读取超时
	 }

修改10.1.13.15的配置文件,如下:

location /Prestudy{
		proxy_pass "http://10.100.15.66:9011";
	 }
location /study/web{
	    rewrite ^(/study/web/.*)$ $1 break;
		proxy_pass "http://10.100.15.66:9011";
	 }

nginx -s reload重新加载配置文件,然后发现前端页面全部不见了。

oh! shit! 越改越烂了是吧?还不如不改?

研究了一下配置文件,发现有一部分前端文件放在nginx目录下。配置文件B部分详解:

server {
    listen       80;
    server_name www.learn.com;
    root  /var/opt/www.learn.com/dist;

     location ~ /Prestudy(/.*)$ {
         rewrite ^/Prestudy(/.*)$ /$1 last;
     }

    location /{
         index index.php index.html index.htm;
         try_files $uri $uri/ /index.html = 404;
    }
    error_page  404              /404.html;
    error_page  500 502 503 504  /500.html;
}

listen 80;:
nginx 监听 HTTP 端口 80。

server_name www.learn.com;:
这个服务器块仅在请求的主机名为 www.learn.com 时生效。

root /var/opt/www.learn.com/dist;:
指定了服务器根目录为 /var/opt/www.learn.com/dist。所有未被 location 块覆盖的请求都将在此目录下查找文件。

location ~ /Prestudy(/.*)$:
    匹配 URI 中包含 /Prestudy的请求。
    rewrite ^/Prestudy(/.*)$ /$1 last;:将 /Prestudy替换为空,重写请求 URI。例如,/Prestudy/path/to/file 会重写为 /path/to/file。last 表示重写后继续应用新的 location 块。

location /:
处理根 URL 及其子路径的请求。
index index.php index.html index.htm;:指定默认的索引文件,nginx 会尝试按顺序查找这些文件。
try_files $uri $uri/ /index.html = 404;:尝试访问请求的 URI 或目录,如果都找不到,则返回 index.html 或 404 错误。

错误页面配置:
error_page 404 /404.html;:当出现 404 错误时,显示 /404.html 页面。
error_page 500 502 503 504 /500.html;:当出现 500、502、503 或 504 错误时,显示 /500.html 页面。

如果请求没有匹配到任何 location 块

如果请求的 URI 与 /Prestudy不匹配,并且文件存在于 root 指定的目录下,location / 会尝试提供文件。
如果文件不存在,则返回 404 错误,nginx 将显示 /404.html 页面(如果存在的话)。

总结,这个配置的目标是处理指定域名的请求,重写特定的 URL 前缀,并提供适当的默认文件和错误处理页面。

所以,前端请求还是放在第一台nginx服务器上,后端请求转发到第二台nginx服务器上。最终配置如下:

配置文件A:

location /Prestudy{
		proxy_pass "http://www.learn.com";
	 }
location /study/web{
	    rewrite ^(/study/web/.*)$ $1 break;
		proxy_pass "http://10.1.13.15";
		proxy_connect_timeout 60s;  # 连接超时
		proxy_send_timeout 60s;     # 发送超时
		proxy_read_timeout 60s;     # 读取超时
	 }

10.1.13.15配置文件:

location /study/web{
	    rewrite ^(/study/web/.*)$ $1 break;
		proxy_pass "http://10.100.15.66:9011";
	 }

重新加载nginx配置文件,大功告成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值