HTTP状态码499/500/502/504
1** :临时响应并需要请求者继续执行操作;
2**:请求成功。操作被成功接收接收并处理;
3**:重定向代码,需要进一步的操作以完成请求;
4**:客户端错误,请求包含语法错误或者无法完成请求;
5**:服务器错误,服务器在处理请求的过程中发生错误;
在日常工作中,经常遇到 HTTP 的错误码,下面,我们尝试着去追踪
2,实验环境默认配置
2.1 Nginx配置
http { access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
server {
listen 80;
server_name www.test.com;
root /opt/wwwroot/test;
# index index.php;
location / {
#index index.html index.htm index.php;
try_files $uri $uri/ /index.php?$query_string;
autoindex on;
}
location ~ .php(.*)$ {
#fastcgi_pass 127.0.0.1:9000;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
fastcgi_split_path_info ^((?U).+.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_connect_timeout 5; # nginx连接fastcgi的超时时间
fastcgi_send_timeout 10; #nginx往fastcgi发送参数的超时时间
fastcgi_read_timeout 10; #nginx从fastcig获取数据的超时时间
include fastcgi_params;
}
}
2.2 PHP配置
2.2.1 php-fpm (我本地是www.conf)
pm.max_children = 5 //最大worker数量request_terminate_timeout = 30 //请求终止执行超时时间,worker执行时间超过该时间后,请求将被终止
access.log = /var/log/php7.3-fpm.access.log //php-fpm请求日志
request_slowlog_timeout = 1 //慢处理超时时间,处理事件超过该时间的请求将被记录到slowlog中
slowlog = /var/log/php7.3-fpm.log.slow //php-fpm慢处理日志
2.2.2 php.ini
max_execution_time = 30 //php脚本最大执行时间,超过此时间,php脚本将终止执行error_reporting = E_ALL //为了测试把所有日志都展示出来
log_errors = On
error_log = /var/log/php7.3-fpm.log //php错误日志
2.3 php文件
在项目根目录/opt/wwwroot/test 下,创建 test.php 文件,通过调整来查看http响应code
<?phpsleep(7); // 通过调整sleep秒数,来达成不同情况的复现
echo "hello world".PHP_EOL;
error_log("hello", 3, "/tmp/hello.log");
2.4 状态码
状态码含义来自 https://httpstatuses.com/
3,实验
3.1 499
3.1.1 含义
499 CLIENT CLOSED REQUESTA non-standard status code introduced by nginx for the case when a client closes the connection while nginx is processing the request.
客户端关闭请求:一个被nginx引入的非标准状态码,对应的场景是,当nginx正在处理请求时,客户端关闭了HTTP连接。
引申出来,就是当HTTP请求到达Nginx后,该请求还在被处理的状态时,浏览器的请求超时时间到了,主动关闭了连接。但是,此状态码在浏览器请求时几乎不可见,因为浏览器默认的超时时间会很长。多见于服务之间的调用,在业务架构中常常会分层设计,拆分为不同的子系统或者微服务,这样系统之间就会常常通过http方式来请求,并且会设置每次请求的超时时间,当请求在请求时间内所调用的上游服务无返回,则会主动关闭连接,上游服务日志中会记录一条499。
3.1.2 模拟
3.1.2.1 配置
3.1.2.1.1 nginx
fastcgi_connect_timeout 5;fastcgi_send_timeout 10;
fastcgi_read_timeout 10;
3.1.2.1.2 php-fpm
pm.max_children = 5request_terminate_timeout = 30
request_slowlog_timeout = 1
3.1.2.1.3 php.ini
max_execution_time = 30
3.1.2.1.4 php文件
<?phpsleep(7);
echo "hello world".PHP_EOL;
error_log("hello", 3, "/tmp/test.log");
3.1.2.2 操作
在终端命令行,使用curl方式进行请求,命令如下
curl -i -m 3 http://www.test.com/test.php
-m/--max-time <seconds> 用来设置最大传输时间,表示请求超时时间,单位为秒。这里表示这个curl请求最长连接时间为3秒。
3.1.2.3 反馈
3.1.2.3.1 终端命令行
curl: (28) Operation timed out after 3000 milliseconds with 0 bytes received
3.1.2.3.2 nginx access.log
127.0.0.1 - - [11/May/2020:14:00:34 +0800] "GET /test.php HTTP/1.1" 499 0 "-" "curl/7.47.0"
3.1.2.3.3 php7.3-fpm access.log
- - 11/May/2020:14:00:31 +0800 "GET /test.php" 200
3.1.2.3.4 php7.3-fpm log.slow
[11-May-2020 14:00:33] [pool www] pid 97710script_filename = /opt/wwwroot/test/test.php
[0x00007f8c94a1e080] sleep() /opt/wwwroot/test/test.php:3
3.1.2.3.5 php.ini error_log
[11-May-2020 14:00:33] WARNING: [pool www] child 97710, script "/opt/wwwroot/test/test.php" (request: "GET /test.php") executing too slow (1.083661 sec), logging[11-May-2020 14:00:33] NOTICE: child 97710 stopped for tracing
[11-May-2020 14:00:33] NOTICE: about to trace 97710
[11-May-2020 14:00:33] NOTICE: finished trace of 97710
可以看到,在php层面,脚本执行了7秒多,既没有超出 30秒的max_execution_time ,又没有超出 30秒的 request_terminate_timeout,只超出了 1秒的 request_slowlog_timeout。在 nginx 层面,它也没有超出 10秒的fastcgi_read_timeout。但是7秒的执行时间,超过了curl请求自身的3秒超时时间,所以报 499错误。这个可以从nginx日志中可以看出。
3.2 500
3.2.1 含义
500 INTERNAL SERVER ERRORThe server encountered an unexpected condition that prevented it from fulfilling the request.
内部服务错误:服务器遭遇到了一个预料之外的情况,这个情况阻止了它完成请求的处理。
基本上是PHP脚本语言的语法错误。
3.2.2 模拟
3.1.2.1 配置
和默认配置一样,保持不变,对PHP脚本进行修改如下:
<?php//sleep(7);
eco $a; //这里的$a未定义
echo "hello world".PHP_EOL //这里少了;
//error_log("hello", 3, "/tmp/test.log");
3.2.2.2 操作
curl -i http://www.test.com/test.php
3.2.3.3 反馈
3.1.2.3.1 终端命令行
HTTP/1.1 500 Internal Server ErrorServer: nginx/1.17.4
Date: Mon, 11 May 2020 06:50:35 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
3.1.2.3.2 nginx access.log
127.0.0.1 - - [11/May/2020:14:50:35 +0800] "GET /test.php HTTP/1.1" 500 5 "-" "curl/7.47.0"
3.1.2.3.2 nginx error.log
2020/05/11 14:46:12 [error] 94843#94843: *38 FastCGI sent in stderr: "PHP message: PHP Notice: Undefined variable: a in /opt/wwwroot/test/test.php on line 5" while reading response header from upstream, client: 127.0.0.1, server: www.test.com, request: "GET /test.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.3-fpm.sock:", host: "www.test.com"2020/05/11 14:50:35 [error] 94843#94843: *46 FastCGI sent in stderr: "PHP message: PHP Parse error: syntax error, unexpected end of file, expecting "," or ";" in /opt/wwwroot/test/test.php on line 7" while reading response header from upstream, client: 127.0.0.1, server: www.test.com, request: "GET /test.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.3-fpm.sock:", host: "www.test.com"
3.1.2.3.4 php7.3-fpm access.log
- - 11/May/2020:14:50:35 +0800 "GET /test.php" 500
可以看到,在PHP层面,由于语法错误,在php-fpm的访问日志中报500。在nginx层面,access报500,特别在error日志中,把fastcgi的标准错误也记录下来了,这很方便我们定位原因。在终端命令行,也报了500的错误。
同时,脚本执行所需的内存过大,导致系统无法分配内存,也会报500错误。例如
<?php$a = [];
for($i=99999999;$i>=0;$i--) {
$a[] = $i*3;
}
var_dump($a);
反馈
HTTP/1.1 500 Internal Server ErrorServer: nginx/1.17.4
Date: Mon, 11 May 2020 13:28:35 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
nginx access.log
127.0.0.1 - - [11/May/2020:21:28:35 +0800] "GET /test.php HTTP/1.1" 500 5 "-" "curl/7.47.0"
nginx error.log
2020/05/11 21:28:35 [error] 94843#94843: *96 FastCGI sent in stderr: "PHP message: PHP Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 67108872 bytes) in /opt/wwwroot/test/test.php on line 7" while reading response header from upstream, client: 127.0.0.1, server: www.test.com, request: "GET /test.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.3-fpm.sock:", host: "www.test.com"
php-fpm access.log
- - 11/May/2020:21:28:35 +0800 "GET /test.php" 500
php-fpm log.slow
无日志
php.ini error.log
无日志
可以看到,当php对test.php脚本进行解析时,尝试着去分配内存,但是超出了最大可用内存 64MB,
; Maximum amount of memory a script may consume (128MB); http://php.net/memory-limit
;memory_limit = 128M
memory_limit = 64M
而由于脚本还没来得及执行,所有就没有log.slow和error.log的记录了。
3.2.3 502
3.2.3.1 含义
502 BAD GATEWAYThe server, while acting as a gateway or proxy, received an invalid response from an inbound server it accessed while attempting to fulfill the request.
网关错误:服务器,当它作为一个网关或者代理去工作,尝试着处理请求时,它从它所进入的到达的 上游服务器 处,接收到了一个非法、无效的响应。
从上一篇文章,我们知道,网关,就是在协调服务器之间进行数据传输的设备,它包含着一套协议。在这个场景中,nginx负责客户端和php-fpm之间的数据传输,nginx就是这里的网关。
而对应502来说,它是指网关从上游服务器,也就是php-fpm那里收到了一个无效的响应,也就是说,问题不在nginx,而在php-fpm了。那php-fpm会出什么问题呢?
我们知道,php-fpm在启动后,会从master处fork出若干个worker进程,nginx会将请求转发给php-fpm,php-fpm处理php脚本,然后将结果原路返回。那这里就涉及到3个节点,第一php-fpm服务在不在,第二php-fpm的worker启动失败,第三php-fpm处理有没有问题。我们来分别模拟一下:
3.2.3.2 配置
3.2.3.2.1 php-fpm服务不可用
service php7.3-fpm stopsystemctl status php7.3-fpm.service
● php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
Active: inactive (dead) since 一 2020-05-11 18:58:50 CST; 46s ago
Docs: man:php-fpm7.3(8)
Process: 94811 ExecReload=/bin/kill -USR2 $MAINPID (code=exited, status=0/SUCCESS)
Process: 97708 ExecStart=/usr/sbin/php-fpm7.3 --nodaemonize --fpm-config /etc/php/7.3/fpm/php-fpm.conf (code=exited, status=0/SUCCESS)
Main PID: 97708 (code=exited, status=0/SUCCESS)
Status: "Processes active: 0, idle: 2, Requests: 19, slow: 1, Traffic: 0req/sec"
执行
curl -i http://www.test.com/test.php
反馈
HTTP/1.1 502 Bad GatewayServer: nginx/1.17.4
Date: Mon, 11 May 2020 10:59:04 GMT
Content-Type: text/html
Content-Length: 157
Connection: keep-alive
<html>
<head><title>502 Bad Gateway</title></head>
<body>
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.17.4</center>
</body>
</html>
nginx access.log
127.0.0.1 - - [11/May/2020:18:59:04 +0800] "GET /test.php HTTP/1.1" 502 157 "-" "curl/7.47.0"
nginx error.log
2020/05/11 18:59:04 [crit] 94842#94842: *58 connect() to unix:/run/php/php7.3-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: www.test.com, request: "GET /test.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.3-fpm.sock:", host: "www.test.com"
php.ini error.log
[11-May-2020 18:58:50] NOTICE: Terminating ...[11-May-2020 18:58:50] NOTICE: exiting, bye-bye!
说明php-fpm服务未启动时,会造成502。
3.2.3.2.2 php-fpm worker启动失败
我们曾经遇到过,由于服务器内存不足,导致不能分配内存,fork()新的php-fpm worker进程失败,导致502 bad gatway,见 一次502的排查过程
3.2.3.2.3 php-fpm执行不正确
nginx
fastcgi_read_timeout 10;
php-fpm
request_terminate_timeout = 5
php.ini
max_execution_time = 30
test.php
<?phpsleep(7);
echo "hello world".PHP_EOL;
执行
curl -i http://www.test.com/test.php
返回
HTTP/1.1 502 Bad GatewayServer: nginx/1.17.4
Date: Mon, 11 May 2020 12:13:11 GMT
Content-Type: text/html
Content-Length: 157
Connection: keep-alive
<html>
<head><title>502 Bad Gateway</title></head>
<body>
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.17.4</center>
</body>
</html>
nginx access.log
127.0.0.1 - - [11/May/2020:20:13:11 +0800] "GET /test.php HTTP/1.1" 502 157 "-" "curl/7.47.0"
nginx error.log
2020/05/11 20:13:11 [error] 94843#94843: *66 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 127.0.0.1, server: www.test.com, request: "GET /test.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.3-fpm.sock:", host: "www.test.com"
php-fpm access.log
无日志
php-fpm log.slow
[11-May-2020 20:13:07] [pool www] pid 111473script_filename = /opt/wwwroot/test/test.php
[0x00007fa800e1e080] sleep() /opt/wwwroot/test/test.php:3
php.ini error.log
[11-May-2020 20:13:07] WARNING: [pool www] child 111473, script "/opt/wwwroot/test/test.php" (request: "GET /test.php") executing too slow (1.145909 sec), logging[11-May-2020 20:13:07] NOTICE: child 111473 stopped for tracing
[11-May-2020 20:13:07] NOTICE: about to trace 111473
[11-May-2020 20:13:07] NOTICE: finished trace of 111473
[11-May-2020 20:13:11] WARNING: [pool www] child 111473, script "/opt/wwwroot/test/test.php" (request: "GET /test.php") execution timed out (5.152688 sec), terminating
[11-May-2020 20:13:11] WARNING: [pool www] child 111473 exited on signal 15 (SIGTERM) after 69.485376 seconds from start
[11-May-2020 20:13:11] NOTICE: [pool www] child 111495 started
可以看到,由于sleep(7) 超出了 php-fpm的request_terminate_timeout = 5; 导致进程在5秒钟时终止运行,导致nginx接收数据失败 recv() failed,返回了504。
那如果把配置改成以下呢?
php-fpm
request_terminate_timeout = 2
php.ini
max_execution_time = 1
test.php
<?phpfor($i=0;$i<=99999999;$i++) {
print($i);
}
执行结果
nginx access.log
127.0.0.1 - - [11/May/2020:21:15:53 +0800] "GET /test.php HTTP/1.1" 200 152406184 "-" "curl/7.47.0"
nginx error.log
2020/05/11 21:15:42 [error] 94840#94840: *88 FastCGI sent in stderr: "PHP message: PHP Fatal error: Maximum execution time of 1 second exceeded in /opt/wwwroot/test/test.php on line 7" while reading upstream, client: 127.0.0.1, server: www.test.com, request: "GET /test.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.3-fpm.sock:", host: "www.test.com"
php-fpm access.log
- - 11/May/2020:21:15:41 +0800 "GET /test.php" 200
php-fpm log.slow
[11-May-2020 21:15:42] [pool www] pid 113133script_filename = /opt/wwwroot/test/test.php
php.ini error.log
[11-May-2020 21:15:42] WARNING: [pool www] child 113133, script "/opt/wwwroot/test/test.php" (request: "GET /test.php") executing too slow (1.310565 sec), logging[11-May-2020 21:15:42] NOTICE: child 113133 stopped for tracing
[11-May-2020 21:15:42] NOTICE: about to trace 113133
[11-May-2020 21:15:42] NOTICE: finished trace of 113133
可以看到,虽然PHP脚本本身执行时间需要很长,但是它在 1秒的max_exection_time之后, 仍然继续执行了。看起来这个max_exection_time设置在这里并没有约束这个脚本的执行。
3.2.4 504
3.2.4.1 含义
504 GATEWAY TIMEOUTThe server, while acting as a gateway or proxy, did not receive a timely response
from an upstream server it needed to access in order to complete the request.
网关超时:服务器,当作为一个网关或代理工作时,没有从上游服务器接收到 为了完成请求 所需访问的 及时的响应(数据)。也就是说,nginx作为网关,为了完成请求,它必须获取到上游服务器的数据,但是上游服务器在规定时间内没有给到这些数据,所以nginx无法access到这些数据。也就是上游服务器响应超时了。
3.2.4.2 试验
3.2.4.2.1
nginx
fastcgi_read_timeout 1;
php-fpm
request_terminate_timeout = 2/8
php.ini
max_execution_time = 10
php
<?phpsleep(7);
echo "hello world";
反馈
HTTP/1.1 504 Gateway Time-outServer: nginx/1.17.4
Date: Mon, 11 May 2020 14:11:12 GMT
Content-Type: text/html
Content-Length: 167
Connection: keep-alive
<html>
<head><title>504 Gateway Time-out</title></head>
<body>
<center><h1>504 Gateway Time-out</h1></center>
<hr><center>nginx/1.17.4</center>
</body>
</html>
nginx access.log
127.0.0.1 - - [11/May/2020:22:11:12 +0800] "GET /test.php HTTP/1.1" 504 167 "-" "curl/7.47.0"
nginx error.log
2020/05/11 22:11:12 [error] 114740#114740: *1 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 127.0.0.1, server: www.test.com,
request: "GET /test.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.3-fpm.sock",
host: "www.test.com"
php-fpm access.log
- - 11/May/2020:22:11:11 +0800 "GET /test.php" 200
php-fpm slow.log
[11-May-2020 22:11:12] [pool www] pid 114714script_filename = /opt/wwwroot/test/test.php
[0x00007fb76f61e080] sleep() /opt/wwwroot/test/test.php:5
php.ini error.log
当为request_terminate_timeout2时
[11-May-2020 22:17:49] WARNING: [pool www] child 114873, script "/opt/wwwroot/test/test.php" (request: "GET /test.php") executing too slow (1.317875 sec), logging[11-May-2020 22:17:49] NOTICE: child 114873 stopped for tracing
[11-May-2020 22:17:49] NOTICE: about to trace 114873
[11-May-2020 22:17:49] NOTICE: finished trace of 114873
[11-May-2020 22:17:50] WARNING: [pool www] child 114873, script "/opt/wwwroot/test/test.php" (request: "GET /test.php") execution timed out (2.320690 sec), terminating
[11-May-2020 22:17:50] WARNING: [pool www] child 114873 exited on signal 15 (SIGTERM) after 6.016013 seconds from start
[11-May-2020 22:17:50] NOTICE: [pool www] child 114881 started
当request_terminate_timeout为8时
[11-May-2020 22:11:12] WARNING: [pool www] child 114714, script "/opt/wwwroot/test/test.php" (request: "GET /test.php") executing too slow (1.132842 sec), logging[11-May-2020 22:11:12] NOTICE: child 114714 stopped for tracing
[11-May-2020 22:11:12] NOTICE: about to trace 114714
[11-May-2020 22:11:12] NOTICE: finished trace of 114714
可以看到,nginx的超时时间为1秒,不管request_terminate_timeout为2还是8时,由于sleep(7),php都未执行完,返回给nginx的数据自然是不合格的,所以报504。只是当request_terminate_timeout为2时,php-fpm被强制终止了,而为8时,虽然nginx已经返回了504,但php脚本仍然在执行。
3.2.4.2.2 php-fpm执行时间超出 fastcgi_read_timeout 时间
php-fpm worker数量少,请求排队,占用了fastcgi_read_timeout时间,这样即便在php-fpm本身执行不需要很长时间的情况下,仍然会导致请求超出nginx fastcgi_read_timeout 时间。
nginx
fastcgi_read_timeout 10;
php.ini
max_execution_time = 30
php-fpm
pm.max_children = 1pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1
request_terminate_timeout = 30
test.php
<?phpsleep(7);
echo "hello world".PHP_EOL;
我们看到php-fpm只有一个worker, 那我们在两个不同的终端命令行中分别执行
curl -i http://www.test.com/test.php
第一个,执行7秒,200
HTTP/1.1 200 OKServer: nginx/1.17.4
Date: Mon, 11 May 2020 11:28:14 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
hello world
第二个,由于只有一个worker,在第一个请求执行完之前,第二个请求一直处在等待状态,而nginx所设置fastcgi_read_timeout 10;一直在等待返回,直到第一个请求执行完毕,worker被释放,此时耗费7秒钟。
接着第二个请求被执行,在 sleep(7) 执行到第3秒时,nginx所设置fastcgi_read_timeout 10秒钟已到,此时 php-fpm在此时间内没有标准返回,所以报 504 Gateway Timeout.
HTTP/1.1 504 Gateway Time-outServer: nginx/1.17.4
Date: Mon, 11 May 2020 11:28:20 GMT
Content-Type: text/html
Content-Length: 167
Connection: keep-alive
<html>
<head><title>504 Gateway Time-out</title></head>
<body>
<center><h1>504 Gateway Time-out</h1></center>
<hr><center>nginx/1.17.4</center>
</body>
</html>
nginx access.log
127.0.0.1 - - [11/May/2020:19:28:20 +0800] "GET /test.php HTTP/1.1" 504 167 "-" "curl/7.47.0"
nginx error.log
2020/05/11 19:28:20 [error] 94840#94840: *64 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 127.0.0.1, server: www.test.com, request: "GET /test.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.3-fpm.sock", host: "www.test.com"
php-fpm access.log
- - 11/May/2020:19:28:14 +0800 "GET /test.php" 200
php-fpm log.slow
[11-May-2020 19:28:15] WARNING: [pool www] child 110567, script "/opt/wwwroot/test/test.php" (request: "GET /test.php") executing too slow (1.054866 sec), logging[11-May-2020 19:28:15] NOTICE: child 110567 stopped for tracing
[11-May-2020 19:28:15] NOTICE: about to trace 110567
[11-May-2020 19:28:15] NOTICE: finished trace of 110567
php.ini error.log
[11-May-2020 19:28:15] [pool www] pid 110567script_filename = /opt/wwwroot/test/test.php
[0x00007f6074a1e080] sleep() /opt/wwwroot/test/test.php:3
3.2.4 504 总结
由此可见,nginx的fastcgi_read_timeout时间,是包含了它排队获得php-fpm worker的时间,加上worker处理的时间。
3.3 总结
获取php-fpm worker + php运行时间 > fastcgi_read_timeout
504
request_terminate_timeout > fastcgi_read_timeout
502
php语法错误,脚本执行所需内存过大,无法分配内存
500
客户端超时时间 < 响应时间
499
fastcgi_read_timeout > request_terminate_timeout > 获取php-fpm worker + php运行时间
200
以上是 HTTP状态码499/500/502/504 的全部内容, 来源链接: utcz.com/z/516364.html