尘封三年的项目突然重新启动,当初的研发人员也早已不见踪影,留给我的只是一个不能访问的页面。
既然当初的项目能正常访问,说明代码是正常的,如今访问不了了,只可能是部署出现了问题。
我看了一下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配置文件,大功告成。