VPS环境搭建详解 (Virtualenv+Gunicorn+Supervisor+Nginx)

自主搭建 VPN 环境详解。包括配置用户环境,为每个APP创建Virtualenv,安装Flask、Gunicorn、Supervisor、Nginx 等的具体操作。



来源:http://beiyuu.com/vps-config-python-vitrualenv-flask-gunicorn-supervisor-nginx/

新用户注册购买 DigitalOcean的VPS,现在使用我的 Refer注册,即刻获得$10赠送,低配的可用两个月。DO采取丧心病狂的低价竞争策略,每月$5即可享用全功能的SSD硬盘VPS,具体去看看 这里吧。
注册,选择套餐、机房、系统(我选默认Ubuntu 12),付款成功,可以开始配置了。
我们目标实现一个支持多个独立域名网站的线上Python环境,这会用到Virtualenv, FlaskGunicorn, Supervisor, Nginx
因为要跑多个站,所以最好将他们完全隔离,每个站对应一个用户,于是我们有了:
  1. User Site
  2. bob dylan ##bob用户有一个dylan的站
  3. michael jackson ##michael用户有一个jackson的站
注册成功后,会收到DO发来的root账户的密码邮件,ssh root@你的IP地址登录上去开始添加用户。
  1. ##推荐安装zsh作为默认shell
  2. sudo apt-get update
  3. sudo apt-get install zsh
  4. ##安装oh-my-zsh插件
  5. cd ~/.
  6. ##自动安装脚本
  7. wget --no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
  8. ##添加用户bob
  9. ##参数-d:指定用户目录
  10. ##参数-m:如果目录不存在则创建
  11. ##参数-s:只用用户使用的 shell
  12. useradd bob -d /home/bob -m -s /bin/zsh
  13. #添加用户michael
  14. useradd michael -d /home/michael -m -s /bin/zsh
  15. ##以上参数也可以修改passwd文件来调整
  16. sudo vim /etc/passwd
  17. ##sudo和用户组管理在
  18. visudo
  19. sudo vim /etc/sudoers
新增用户之后,需要解锁:
  1. ##为新增用户设置一个初始密码即可解锁
  2. passwd bob
  3. passwd michael
用ssh-keygen建立信任关系可以方便登录管理:
  1. ##本地机器
  2. ##会在~/.ssh目录下生成秘钥文件id_rsa、id_rsa.pub
  3. ssh-keygen -t [rsa|dsa]
  4. ##复制公钥文件id_rsa.pub
  5. scp ~/.ssh/id_rsa.pub bob@digitalocean:~/.ssh
  6. ##VPS上,添加本地机器的信任关系
  7. cd ~/.ssh
  8. cat id_rsa.pub >> ~/.ssh/authorized_keys
  9. ##OK,从本地机器登录到VPS的bob用户就不需要密码了
  10. ##同理,也可以添加到michael用户的.ssh目录下
更多资料可以阅读:
Virtualenv可以为每个Python应用创建独立的开发环境,使他们互不影响,Virtualenv能够做到:
  • 在没有权限的情况下安装新套件
  • 不同应用可以使用不同的套件版本
  • 套件升级不影响其他应用
安装Virtualenv
  1. ##先安装Python的包管理pip
  2. sudo apt-get install pip
  3. ##用pip安装virtualenv
  4. sudo pip install virtualenv
  5. ##建议用bob用户登录操作
  6. ##bob用户创建dylan的virtualenv
  7. cd /home/bob
  8. virtualenv dylan
  9. ##激活virtualenv
  10. cd /home/bob/dylan
  11. source ./bin/activate
  12. ##取消激活只需
  13. deactivate
  14. ##michael用户如法炮制即可
Flask是Python流行的一个web框架,但是Flask比Django轻量了许多,使用更加直观,这里并不展开讲Flask的细节,当做一个Hello Wordld来用就好了。
  1. ##安装Flask
  2. ##依然在virtualenv activate的环境下
  3. pip install Flask
  4. ##根目录下
  5. vim runserver.py
  6. ##写入Flask的Hello World
  7. from flask import Flask
  8. app = Flask(__name__)
  9. @app.route('/')
  10. def hello_world():
  11. return 'Hello World!'
  12. if __name__ == '__main__':
  13. app.run()
写入之后,如果在本地机器上可以运行python runserver.py,然后打开127.0.0.1:5000看到Hello World!了,但在VPS,这样不行,等待后面配置吧。
Gunicorn是用于部署WSGI应用的,任何支持WSGI的都可以,虽说直接python runserver.py这样网站也能跑起来,但那是方便开发而已,在线上环境,还是需要更高效的组件来做。
  1. ##安装Gunicorn
  2. ##依然在Virtualenv环境下
  3. pip install gunicorn
Gunicorn的配置是必须的,因为我们要上两个独立的站,所以不能都用默认的配置:
  1. ##在bob的dylan项目下
  2. cd /home/bob/dylan
  3. vim gunicorn.conf
  4. ##文件内写入以下内容
  5. ##指定workers的数目,使用多少个进程来处理请求
  6. ##绑定本地端口
  7. workers = 3
  8. bind = '127.0.0.1:8000'
  9. ##在michael的jackson项目下
  10. cd /home/michael/jackson
  11. vim gunicorn.conf
  12. ##写入文件内容
  13. ##与dylan的端口要不一样
  14. workers = 3
  15. bind = '127.0.0.1:8100'
最终的目录结构应该是这样的
  1. /home/
  2. └── bob //用户目录
  3. ├── logs
  4. └── dylan //项目目录
  5. ├── bin
  6.    ├── activate
  7.    ├── easy_install
  8.    ├── gunicorn
  9.    ├── pip
  10.    └── python
  11. ├── include
  12.    └── python2.7 -> /usr/include/python2.7
  13. ├── lib
  14.    └── python2.7
  15. ├── local
  16.    ├── bin -> /home/shenye/shenyefuli/bin
  17.    ├── include -> /home/shenye/shenyefuli/include
  18.    └── lib -> /home/shenye/shenyefuli/lib
  19. //以上目录是Virtualenv生成的
  20. ├── gunicorn_conf.py //Gunicorn的配置文件
  21. └── runserver.py //hello_world程序
  22. └── michael //用户目录
  23. ├── logs
  24. └── jackson //项目目录
  25. ├── bin
  26.    ├── activate
  27.    ├── easy_install
  28.    ├── gunicorn
  29.    ├── pip
  30.    └── python
  31. ├── include
  32.    └── python2.7 -> /usr/include/python2.7
  33. ├── lib
  34.    └── python2.7
  35. ├── local //以上这些文件都是Virtualenv需要的
  36.    ├── bin -> /home/shenye/shenyefuli/bin
  37.    ├── include -> /home/shenye/shenyefuli/include
  38.    └── lib -> /home/shenye/shenyefuli/lib
  39. //以上目录是Virtualenv生成的
  40. ├── gunicorn_conf.py //Gunicorn的配置文件
  41. └── runserver.py //hello_world程序
Supervisor可以同时启动多个应用,最重要的是,当某个应用Crash的时候,他可以自动重启该应用,保证可用性。
  1. ##安装Supervisor
  2. ##sudo安装
  3. sudo apt-get install supervisor
  4. ##启动服务
  5. sudo service supervisor start
  6. ##终止服务
  7. sudo service supervisor stop
  8. ##也可以直接kill pid
  9. ps -A | grep supervisor
修改了程序代码,或者修改了配置,需要手动重启supervisor服务,尤其是摸不着头脑的错误的时候,重启最能解决问题!
安装好之后,开始配置各应用的supervisor服务:
  1. ##supervisor的配置文件位置在:
  2. /etc/supervisor/supervisor.conf
  3. ##为了代码好看一些,我们分别放置各项目的配置文件
  4. ##新建bob的dylan项目配置文件
  5. touch /etc/supervisor/conf.d/dylan.conf
  6. ##文件内容
  7. [program:dylan]
  8. ##注意项目目录和gunicorn的配置文件地址
  9. command=/home/bob/dylan/bin/gunicorn runserver:app -c /home/bob/dylan/gunicorn.conf
  10. directory=/home/bob/dylan
  11. user=bob
  12. autostart=true
  13. autorestart=true
  14. ##log文件的位置
  15. stdout_logfile=/home/bob/logs/gunicorn_supervisor.log
  16. ##新建michael的jackson项目配置文件
  17. touch /etc/supervisor/conf.d/jackson.conf
  18. ##文件内容
  19. [program:jackson]
  20. command=/home/michael/jackson/bin/gunicorn runserver:app -c /home/michael/jackson/gunicorn.conf
  21. directory=/home/michael/jackson
  22. user=michael
  23. autostart=true
  24. autorestart=true
  25. stdout_logfile=/home/michael/logs/gunicorn_supervisor.log
写好配置之后:
  1. ##重新读取配置
  2. sudo supervisorctl reread
  3. ##启动服务
  4. sudo supervisorctl start dylan
  5. sudo supervisorctl start jackson
  6. ##停止服务
  7. sudo supervisorctl stop dylan
  8. sudo supervisorctl stop jackson
  9. ##有问题就重启supervisor的总服务
  10. sudo service supervisor stop
  11. sudo service supervisor start
有了GunicornSupervisor,本地的环境的算是搭好了,但是我们需要让VPS上的网站从外网可以访问,这时候需要Nginx。
Nginx是轻量级、性能强、占用资源少,能很好的处理高并发的反向代理软件,是我们的不二选择:
  1. ##安装Nginxx
  2. sudo apt-get install nginx
  3. ##启动服务
  4. sudo service nginx start
  5. ##查看VPS的IP地址
  6. ifconfig eth0 | grep inet | awk '{ print $2 }'
  7. ##重启和暂停服务
  8. sudo service nginx restart
  9. sudo service nginx stop
Nginx的配置文件和Supervisor类似,不同的程序可以分别配置,然后被总配置文件include:
  1. ##Nginx的配置文件地址
  2. /etc/nginx/nginx.conf
  3. ##新建bob的dylan项目配置文件
  4. ##在sites-available目录下
  5. touch /etc/nginx/sites-available/dylan.com
  6. ##文件内容
  7. server {
  8. listen 80; //端口
  9. server_name dylan.com; //访问域名
  10. root /home/bob/dylan/;
  11. access_log /home/bob/logs/access.log;
  12. error_log /home/bob/logs/access.log;
  13. location / {
  14. proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
  15. proxy_set_header Host $http_host;
  16. proxy_redirect off;
  17. if (!-f $request_filename) {
  18. proxy_pass http://127.0.0.1:8000; //这里是dylan的gunicorn端口
  19. break;
  20. }
  21. }
  22. }
  23. ##michael的jackson项目
  24. touch /etc/nginx/sites-available/jackson.com
  25. ##文件内容
  26. server {
  27. listen 80; //端口
  28. server_name jackson.com; //访问域名
  29. root /home/michael/jackson/;
  30. access_log /home/michael/logs/access.log;
  31. error_log /home/michael/logs/access.log;
  32. location / {
  33. proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
  34. proxy_set_header Host $http_host;
  35. proxy_redirect off;
  36. if (!-f $request_filename) {
  37. proxy_pass http://127.0.0.1:8100; //这里是jackson的gunicorn端口
  38. break;
  39. }
  40. }
  41. }
配置完成之后,'sudo service nginx restart'重启一下服务,再配置一下本地的Hosts,打开浏览器应该就能看到了。
至此,一个完整的环境搭建就完成了,推荐试用DigitalOcean的VPS看看,用我的Refer注册立刻可以得到$10的Credit赠送。
发表评论