服务器如果是新做的一个系统, 先升级一下服务器的环境, yum 和 pip
- yum update
- pip install --upgrade pip
先安装 Python3
CentOS 安装 python3
然后用 pyvenv 做隔离, 因为我的服务器上跑的东西不多, 先用这个对付着, 服务器东西跑的多的, 最好还是用 Docker 隔离比较彻底
到项目目录后创建虚拟环境 venv 并激活
- cd /var/www/django_web/
- python3 -m venv venv
- cd venv/bin
- source activate
然后在开发环境打包一下需要的依赖包
pip3 freeze> requirements.txt 或 python3 -m pip freeze> requirements.txt
把这个 requirements.txt 上传到服务器上, 再按这个包安装环境
python3 -m pip install -r requirements.txt
安装的时候, 装到 mysqlclient 这个库的时候出错了, OSError: mysql_config not found
网上找了一下 mysql_config 要下面这些依赖, 安装上, 就可以了
yum install MySQL-devel gcc gcc-devel python-devel
ftp 上传项目文件, 然后生成数据库, django 官方推荐 migrations 放到版本控制中, 所以 migrations 文件我一并上传到服务器, 不需要再 make
python3 manage.py migrate
创建超级管理员帐号
python3 manage.py createsuperuser
运行 runserver 试一下
python3 manage.py runserver 0.0.0.0:8000
如果访问不了, 把防火墙 8000 端口打开一下再尝试
- firewall-cmd --zone=public --add-port=8000/tcp
- firewall-cmd --reload
没问题的话开始部署 gunicorn
之前的开发包里我已经安装了 gunicorn, 如果没安装就在服务器的虚拟环境里 pip 安装一下
把 gunicorn 添加到 django 的 settings.py 里的 INSTALLED_APPS 里
接着可以直接运行
gunicorn django_web.wsgi:application -b 0.0.0.0:8000
如果没问题, 可以接下去配置一个配置文件, 方便以后设置
- guni.conf.py
- import multiprocessing
- bind = '0.0.0.0:8000' #监听端口
- workers = 2 #负责处理请求的线程数, 一般设置成: 服务器 CPU 个数 + 1
- #worker_class = "gevent" #使用的网络模型, 默认 sync, 如果要性能好点就用 gevent, 我的项目暂时不用, 注释掉
- worker_connections = 200 #同时最大连接数
- #daemon = True #是否后台运行, 因为使用了 supervisor,gunicorn 不需要运行 daemon 模式
- pidfile = 'gunicorn.pid' #pid 文件
- proc_name = 'guni_web' #进程名称
- reload = True #当代码有更新的话自动重启 workers, 有点类似于调试模式
- errorlog = "/var/www/django_web/log/guni_error.log" #错误日志 #
- accesslog = "/var/www/django_web/log/guni_access.log" #访问日志
- #loglevel = 'debug'
用 -c 参数运行 gunicorn
gunicorn -c guni.conf.py django_web.wsgi:application #django_web.wsgi 为 django_web 目录下的 wsgi.py 文件 (由 django 生成)
Supervisor 安装
先退出虚拟环境再安装, 否则这个是装到虚拟环境下的
- deactivate
- pip install supervisor
配置文件, 先创建两个目录
- mkdir /etc/supervisor
- mkdir /etc/supervisor/conf.d
创建配置文件:/etc/supervisor/supervisord.conf
- [unix_http_server]
- file=/tmp/supervisor.sock ; the path to the socket file
- chmod=0700
- [supervisord]
- logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
- logfile_maxbytes=10MB ; max main logfile bytes b4 rotation; default 50MB
- logfile_backups=1 ; # of main logfile backups; 0 means none, default 10
- loglevel=info ; log level; default info; others: debug,warn,trace
- pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
- nodaemon=false ; start in foreground if true; default false
- minfds=1024 ; min. avail startup file descriptors; default 1024
- minprocs=200 ; min. avail process descriptors;default 200
- [rpcinterface:supervisor]
- supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
- [supervisorctl]
- serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
- [include]
- files = /etc/supervisor/conf.d/*.conf
创建子配置文件 /etc/supervisor/conf.d/webserver.conf
- [program:webserver]
- directory = /var/www/django_web
- command = /var/www/django_web/venv/bin/gunicorn -c /var/www/django_web/guni.conf.py lodgenotice.wsgi:application
- stdout_logfile = /var/www/django_web/log/supervisor.log
- autostart = true
- startsecs = 5
- autorestart = true
- startretries = 3
- user = root
- redirect_stderr = true
- stdout_logfile_maxbytes = 10MB
- stdout_logfile_backups = 1
用 - c 参数指定配置文件来运行 supervisor
supervisord -c /etc/supervisor/supervisord.conf
启动后可以用 supervisorctl 来管理
- # 停止某一个进程, program_name 为 [program:x] 里的 x
- supervisorctl stop program_name
- # 启动某个进程
- supervisorctl start program_name
- # 重启某个进程
- supervisorctl restart program_name
- # 结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)
- supervisorctl stop groupworker:
- # 结束 groupwor:name1 这个进程 (start,restart 同理)
- supervisorctl stop groupworker:name1
- # 停止全部进程, 注: start,restart,stop 都不会载入最新的配置文件
- supervisorctl stop all
- # 载入最新的配置文件, 停止原有进程并按新的配置启动, 管理所有进程
- supervisorctl reload
- # 根据最新的配置文件, 启动新配置或有改动的进程, 配置没有改动的进程不会受影响而重启
- supervisorctl update
创建一个 supervisor 服务, 这样服务器重启后会自动启动
创建文件 / usr/lib/systemd/system/supervisord.service
- # dservice for systemd (CentOS 7.0+)
- # by ET-CS (https://github.com/ET-CS)
- [Unit]
- Description=Supervisor daemon
- [Service]
- Type=forking
- ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
- ExecStop=/usr/bin/supervisorctl shutdown
- ExecReload=/usr/bin/supervisorctl reload
- KillMode=process
- Restart=on-failure
- RestartSec=42s
- [Install]
- WantedBy=multi-user.target
开启服务
systemctl enable supervisord
检查一下看看是否设置成功
systemctl is-enabled supervisord
Gunicorn 无法处理静态资源, 所以还需要 Nginx
先把 Django 项目的静态文件收集到一个地方
修改 settings.py , 这个路径就是我们要收集所有静态文件的路径, 到时候加到 nginx
STATIC_ROOT='/var/www/django_web/static/'
在虚拟环境下运行
python manage.py collectstatic
安装 Nginx
yum install nginx -y
配置文件 / etc/nginx/nginx.conf, 修改 server 字段的内容如下 (不要把下面的直接做一个文件, 要在原文件上修改)
server{
listen 80; 监听的端口
- server_name 127.0.0.1;
- server_name your_www;
- #当请求这些 server name 的时候, nginx 才会做反向代理, 0.0.0.0 是指全部
- location / {
- proxy_intercept_errors on;
- proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- }
- # location 顾名思义, 定位, 就是当访问 / 的时候, nginx 会将请求转给本地的 8080 端口, 而后面的设置都是一些基本的配置, 可以直接用
- location /static {
- alias /var/www/django_web/static;
- }
- # 这个就是配置静态文件的地方, 要用绝对地址, 你在开发的时候建议每个 App 的静态文件都用多了一层 app_name 的文件夹来包住.
- }
配置好后, 先检查一下对不对, 如果没有问题就可以运行了
nginx -t
运行 nginx 的命令很简单, 直接命令行输入 nginx 即可
nginx -s reload|reopen|stop|quit #重新加载配置 | 重启 | 停止 | 退出 nginx
如果有防火墙, 打开服务器 80 端口, 加上 --permanent 就是永久有效, 不加重启后会失效
- firewall-cmd --zone=public --add-port=80/tcp --permanent
- firewall-cmd --reload
阿里云还要开一个安全组的 80 端口
这样基本就部署完了, 用浏览器打开就可以访问到你的网页了.
如果怕 nginx 会运行中崩溃, 或者是想重启后自动开启, 直接加个文件到 supervisor 里面就可以自动监控了
创建子配置文件 /etc/supervisor/conf.d/nginx.conf
- [program:nginx]
- command = /usr/sbin/nginx -g 'daemon off;'
- autostart=true
- startsecs=5
- autorestart=true
- user = root
- stdout_logfile=/var/www/django_web/log/nginx_stdout.log
- stdout_logfile_maxbytes=10MB
- stderr_logfile=/var/www/django_web/log/nginx_stderr.log
- stderr_logfile_maxbytes=10MB
来源: http://www.jianshu.com/p/693e4bae5fac