当我们发现自己网站,用浏览器不能访问的时候,我们需要一步步排查问题。
整个部署的链路是 Nginx -> uWSGI -> Python Web程序
。
下面以分析 python 程序为例!
sudo ps aux | grep python
或者
sudo ps -ef | grep python
返回结果为
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
tu 4491 0.0 18.0 3489820 2960628 ? Sl Jan29 0:19 python a.py
tu 12602 5.3 26.4 4910444 4343708 pts/1 Sl+ 12:34 4:07 python b.py
# 输出结果中 USER 后面的 PID 代表进程编号。
进入 /proc/PID/ 目录的文件信息来得到这个进程的一些信息
(Linux中一切皆文件,进程信息也在文件中),
比如它是在哪个目录启动的,启动命令是什么等信息。执行命令后输入内容如下:
# 进入相关PID目录
sudo cd /proc/4491
# 查看在哪个目录启动的,启动命令是什么等信息
sudo ls -ahl
lrwxrwxrwx 1 tu tu 0 Feb 17 13:32 cwd -> /home/tu # 启动进程时的工作目录
-r-------- 1 tu tu 0 Feb 17 13:32 environ # 进程的环境变量列表
lrwxrwxrwx 1 tu tu 0 Feb 17 12:00 exe -> /usr/bin/python2.7 # 链接到进程的执行命令文件
# 杀死指定pid进程
sudo kill PID
# 强制杀死一个进程
sudo kill -9 PID
# 强制杀死uwsgi这个进程
sudo kill -9 uwsgi
# 查看进程中的 TCP 连接信息
sudo lsof -p PID | grep TCP
> sudo lsof /home/tu/.virtualenvs/mic/bin/uwsgi
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
uwsgi 2071 tu txt REG 253,17 1270899 13240576 /home/tu/.virtualenvs/mic/bin/uwsgi
uwsgi 13286 tu txt REG 253,17 1270899 13240576 /home/tu/.virtualenvs/mic/bin/uwsgi
uwsgi 13287 tu txt REG 253,17 1270899 13240576 /home/tu/.virtualenvs/mic/bin/uwsgi
uwsgi 13288 tu txt REG 253,17 1270899 13240576 /home/tu/.virtualenvs/mic/bin/uwsgi
sudo strace -p PID
> sudo netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 2070/uwsgi
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1575/redis-server 1
# 就能知道80端口的 nginx 是不是启动成功了,7001端口的uwsgi是不是启动成功了。
# 注意:如果PID和Program Name显示不出来,证明是权限不够,可以使用sudo运行
sudo lsof -i:80
# 端口80前面有个英文的冒号
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 4123 admin 3u IPv4 13031 0t0 TCP *:http (LISTEN)
nginx 4124 admin 3u IPv4 13031 0t0 TCP *:http (LISTEN)
# 我们可以通过这个方法查询出占用端口的程序,如果遇到端口已经被占用,原来的进程没有正确地终止,可以使
# 用kill命令停掉原来的进程,这样我们就又可以使用这个端口了。