本文记录微信公众号后台在阿里云 ECS 服务器上部署运维时 Nginx 和 Supervisor 的配置、管理。

目录:

Nginx

Mac 安装

  • brew install nginx
  • brew link nginx 这一步可能会遇到权限错误,按提示给当前用户增加对应目录的读写权限即可,我的操作如下所示:
    • chmod u+rw /usr/local/share/man/man8
  • /usr/local/Cellar/nginx/1.12.1 默认安装目录
  • /usr/local/etc/nginx/nginx.conf 默认配置文件

Ubuntu 安装

  • sudo apt-get install nginx

常用命令

  • nginx 启动 Nginx
  • nginx -s reload 重新加载配置
  • nginx -s reopen 重启 Nginx
  • nginx -s quit 停止 Nginx,服务完所有的连接之后才关闭
  • nginx -s stop 停止 Nginx,直接中断所有的连接
  • nginx -t 检查 Nginx 的配置文件是否正确,修改配置文件之后可用该命令检查一下
  • ps -ef | grep nginx 查看 Nginx 进程

用 kill 关闭 Nginx

  • kill -QUIT master进程号 从容停止 Nginx,同 nginx -s quit
  • kill -TERM master进程号 快速停止 Nginx,同 nginx -s stop
  • kill -9 master进程号 强制停止 Nginx

我的配置

Nginx 中每个项目的配置可放到 Nginx 配置文件所在目录下 conf.d 目录中,如我的配置为:

/etc/nginx/conf.d/gzh.conf
1
2
3
4
5
6
7
8
9
10
server {
server_name gzh.com www.gzh.com; # 需要和访问的地方保持一致,要么域名,要么 ip
listen 80;
location / {
proxy_pass_header Server;
proxy_redirect off;
proxy_pass http://127.0.0.1:port;
}
}

注:

配置说明:

References

Supervisor

Supervisor

安装非常简单,只需 pip install supervisor

配置文件:

  • Mac:/usr/local/etc/supervisord.conf
  • Ubuntu:/etc/supervisord.conf

常用命令

  • sudo supervisord -c /etc/supervisord.conf 指定配置文件启动 Supervisor
  • sudo supervisorctl 进入控制台交互,若开启服务端密码,则执行时会要求输入密码
  • sudo supervisorctl shutdown 停止 Supervisor
  • sudo supervisorctl status 查看状态
  • sudo supervisorctl reload 重新加载配置文件
  • sudo supervisorctl start all 启动管理的所有进程
  • sudo supervisorctl stop all 停止管理的所有进程
  • sudo supervisorctl start program-name 启动指定进程
  • sudo supervisorctl stop program-name 关闭指定进程
  • sudo supervisorctl restart all 重启所有进程

我的配置

/etc/supervisord.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
; 开启web管理页面
[inet_http_server] ; inet (TCP) server disabled by default
port=*:9001 ; ip_address:port specifier, *:port for all iface
username=username ; default is no username (open server)
password=password ; default is no password (open server)
[program:wechat_gzh] ; 公众号服务端 配置
directory=/home/user_test/projects/gzh/server ; 项目的文件夹路径
command=/home/user_test/.pyenv/versions/gzh-3.6.2/bin/python main.py ; 程序启动命令
user=user_test ; 以什么身份执行 command
autostart=true
stdout_logfile=/home/user_test/logs/%(program_name)s/stdout.log ; log 日志
stderr_logfile=/home/user_test/logs/%(program_name)s/stderr.log ; 错误日志
stdout_logfile_maxbytes=1MB ; 每个 log 文件的最大容量
stdout_logfile_backups=30
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=30
[program:nginx] ;nginx 配置
directory=/
;command=/usr/sbin/nginx -c /etc/nginx/nginx.conf
command=nginx
user=root
stdout_logfile=/home/user_test/logs/%(program_name)s/stdout.log
stderr_logfile=/home/user_test/logs/%(program_name)s/stderr.log
autostart=true
autorestart=true
startsecs=10

注意事项:

  • 开启 Web 管理页面,即取消 [inet_http_server] 的注释,并设置对应参数;
  • 虚拟环境下 Python 运行环境指定;
  • Nginx 设置;
  • 日志重定向时,需要提前创建好日志文件所在的目录,否则会启动失败;

Python 虚拟环境

当采用虚拟环境中的 Python 运行程序时,若已经在项目所在目录配置了 Python 执行环境(比如通过 .python-version 文件配置),则 Supervisor 中有下面两种配置方式:

配置1:

/etc/supervisord.conf
1
2
3
4
[program:wechat_gzh]
directory=/home/user_test/projects/gzh/server
command=python main.py ; 程序启动命
; 其他配置

配置2:

/etc/supervisord.conf
1
2
3
4
[program:wechat_gzh]
directory=/home/user_test/projects/gzh/server
command=/home/user_test/.pyenv/versions/gzh-3.6.2/bin/python main.py
; 其他配置

两种配置的区别是,是否在 command 中指定 python 全路径,在不同系统下的表现为:

  • Mac 下上述两种配置均 ok;
  • Ubuntu 下只有配置2 能正确运行程序,配置1 会使用系统默认 Python 版本;

所以建议采用配置2,明确指定用哪个版本的 Python 执行程序;

Nginx 特殊配置

Nginx 默认启动是在 daemon 模式下,而 Supervisor 管理的程序必须是前台运行模式,所以需要在 Nginx 的配置文件中添加下面的配置,关闭后台运行模式:

/etc/nginx/nginx.conf
1
2
# 关闭后台运行功能,用 supervisor 管理
daemon off;

日志重定向

Supervisor 支持对应用日志进行重定向,输出到指定的文件中,还可以指定每个日志文件的最大值,历史日志数量等,默认按日志大小滚动;

如果想支持更丰富的日志滚动方案,可以借助于 logrotate/logrotate 完成,Nginx 配置之完整篇 一文中包含具体的配置实践。

References