Django 网站部署

378 阅读2分钟

1. 代码仓库

1.1 网站:github码云

1.2 工具:git客户端

2. 代码同步(window开发端与远程git仓库):

window开发端:

2.1 在仓库网站中创建 repo:DjangoBlog (远程仓)

2.2 创建同名文件(或将同名项目放在www文件夹下):www/DjangoBlog (本地仓)

2.3 导出该环境下所有依赖到requirements.txt文件: $ pip freeze > requirements.txt

2.4 打开git bash:

$ git init    # 初始化本地仓
$ git remote add origin    # 连接到远程仓 https://github.com/cooqes/DjangoBlog.git
$ git pull origin master    # 拉取远程代码到本地仓 [--allow-unrelated-histories 可选项] 

2.5 将项目代码放入本地仓中,并提交到远程仓【acp三连】:

$ git add .
$ git commit -m 'The first version --ver0.1'
$ git push origin master

3. 服务器部署

linux服务器:


可选操作项:


$ sudo passwd root 创建root用户密码

更新yum/rpm/apt国内源, 更新pip国内源(安装pip后)

安装 openssh-server openssh-client vim

3.0 同步代码到服务器(linux服务器与远程Git仓库)

  • 在 linux 中重复2.4的步骤,即:
$ git init    # 初始化本地仓
$ git remote add origin    # 连接到远程仓 https://github.com/cooqes/DjangoBlog.git
$ git pull origin master    # 拉取远程代码到本地仓 [--allow-unrelated-histories 可选项] 

3.1 安装 mysql 数据库

$ yum install mysql-server mysql-client

3.2 安装 memcached

3.3 安装 python 3.7

  • 安装依赖包
    yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make
  • 下载 python 安装包
$ wget https://www.python.org/ftp/3.7.3/Python-3.7.3.tgz
  • 将 python 安装包解压
$ tar -xvf Python-3.7.3.tgz
  • 配置编译
$ cd Python-3.7.3
$ ./configure --prefix=/usr/local/python373/   # [--enable-optimizations 可选项,会编译安装到 /usr/local/bin/ 下,且不用添加软连接或环境变量, 本次不选]
  • 编译和安装
$ make && make install
  • 设置软链
$ ln -s /usr/local/python373/bin/python3 /usr/bin/python3
  • 检查是否安装及安装版本
$ python3 -V     // output: Python 2.7.5
$ python -V      // output: Python 3.7.3

3.4 安装 pip

$ wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate #不检查证书
$ python get-pip.py

3.5 安装 virtualenv & virtualenvwrapper

$ pip install virtualenv
$ pip install virtualenvwrapper

- 设置 virtualenvwrapper 环境变量
$ vim ~/.bashrc
在文件末尾增加以下两行代码:
---
export WORKON_HOME=~/.virtualenvs
source /usr/bin/virtualenvwrapper.sh
---

- 重新激活下bashrc,使环境变量配置生效
$ source ~/.bashrc

$ mkvirtualenv DjangoBlog  # 新建一个名为 DjangoBlog 的虚拟环境
(DjangoBlog)$ deactivate  # 退出虚拟环境
$ lsvirtualenv   # 列出虚拟环境
$ rmvirtualenv DjangoBlog   # 删除虚拟环境
$ workon DjangoBlog   # 进入虚拟环境

3.6 安装 uwsgi (安装前需退出虚拟环境,在系统级别的python环境中安装)

$ pip install uwsgi
  • 创建 uwsgi 配置文件:DjangoBlog_uwsgi.ini
$ vim /srv/DjangoBlog/DjangoBlog_uwsgi.ini
  • 在DjangoBlog.ini中添加以下代码:
[uwsgi]
# 指定项目目录
chdir=/srv/DjangoBlog/
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 指定项目的application,此处是项目DjangoBlog
module=DjangoBlog.wsgi:application
# 指定python环境
# home=/root/.virtualenvs/DjangoBlog
# 指定sock的文件路径 (与nginx服务器进行socket通信)
socket=/srv/DjangoBlog/DjangoBlog.sock
# 设置 socket 权限
# chmod-socket=666
# 启用主进程
master=true
# 进程个数
workers=5
pidfile=/srv/DjangoBlog/uwsgi.pid
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=512
# 设置日志目录
daemonize=/srv/DjangoBlog/uwsgi.log

3.7 安装 nginx

$ yum -y install nginx
  • 启动/关闭/重启 nginx
$ systemctl start nginx # 启动nginx,启动后,访问网站会出现nginx页面则表示 nginx 安装成功
$ systemctl stop nginx # 关闭nginx
$ systemctl restart nginx # 重启nginx
  • 创建 nginx 配置文件:DjangoBlog_nginx.conf
$ vim /srv/DjangoBlog/DjangoBlog_nginx.conf
  • 在DjangoBlog_nginx.conf中添加以下代码:
server {
listen 80; # 监听哪个端口
server_name 192.168.0.102 ;  # 可以是公网ip地址或域名
access_log /var/log/nginx/access.log main;  # 日志记录
error_log /var/log/nginx/error.log;   # nginx错误日志,可自行设置,但必须保证提前建立好该目录和文件
charset utf-8;
# 允许上传的最大文件尺寸:
# client_max_body_size 75M
gzip on;
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-
php application/json text/json image/jpeg image/gif image/png application/octet-stream;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 指定uwsgi路径
location / {
    # include /srv/DjangoBlog/uwsgi_params; # 与uwsgi进行socket通信时,需要用到uwsgi参数
    include /etc/nginx/uwsgi_params;
    uwsgi_connect_timeout 30;
    uwsgi_pass unix:/root/.virtualenvs/DjangoBlog/DjangoBlog.sock; # 该路径需与uwsgi配置文件中的socket路径相同
}
# 指定静态文件路径
location /static/ {
    alias /srv/DjangoBlog/static/;   # 这里需要改为你的目录
    index index.html index.htm;
}
}
$ vim /etc/nginx/nginx.conf
  • 在/etc/nginx/nginx.conf文件的http 块中添加“include /etc/nginx/sites-enabled/*;”
...
# user nginx
user root
...
http {
    ...
    
    include /etc/nginx/conf.d/*.conf; #此行原文件中存在,有两个,http块中有两个这样的行,此处是上面的那个,并非是server{}中的那个
    include /etc/nginx/sites-enabled/*;

    ....
}
  • 将nginx 配置文件链接到 /etc/nginx/sites-enabled 文件夹下,这样nginx就配置完成
$ mkdir /etc/nginx/sites-enabled #如果存在此目录就不用创建
$ ln -s /srv/DjangoBlog/DjangoBlog_nginx.conf.conf /etc/nginx/sites-enabled/
  • 补充知识:centos 防火墙命令
firewall-cmd --query-port=80/tcp # 查看防火墙80端口状态
firewall-cmd --zone=public --add-port=80/tcp --permanent # 永久开启80端口(重启系统不失效)
firewall-cmd --zone=public --add-port=8989/tcp --permanent
firewall-cmd --remove-port=80/tcp --permanent # 关闭80端口
firewall-cmd --reload # 重新载入防火墙配置(关闭端口后需要重新载入配置才生效)

3.7 安装 supervisor(安装前需退出虚拟环境,在系统级别的python环境中安装)

$ pip install supervisor
  • 创建 uwsgi 配置文件:DjangoBlog_uwsgi.ini
$ vim /srv/DjangoBlog/DjangoBlog_supervisor.conf
  • 在DjangoBlog_supervisor.conf中添加以下代码:
# supervisor 程序名称
[program:DjangoBlog]
# supervisor 执行的命令
command=uwsgi --ini DjangoBlog_uwsgi.ini
# 项目的目录
directory=/srv/DjangoBlog
# 开始的时候等待多少秒
startsecs=0
# 停止的时候等待多少秒
stopwaitsecs=0  
# 自动开始
autostart=true
# 程序挂了后自动重启
autorestart=true
# 输出的log文件
stdout_logfile=/srv/DjangoBlog/log/supervisord.log
# 输出的错误文件
stderr_logfile=/srv/DjangoBlog/log/supervisord.err

[supervisord]
# log的级别
loglevel=info

# 使用supervisorctl的配置
[supervisorctl]
# 使用supervisorctl登录的地址和端口号
serverurl = http://127.0.0.1:9001

# 登录supervisorctl的用户名和密码
username = admin
password = 123

[inet_http_server]
# supervisor的服务器
port = :9001
# 用户名和密码
username = admin
password = 123

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
$ cd /srv/DjangoBlog
$ workon DjangoBlog
(DjangoBlog)$ systemctl restart nginx
$ supervisord -c DjangoBlog_supervisor.conf   # 启动 supervisor 服务
$ supervisorctl -c DjangoBlog_supervisor.conf    #登录到supervisorctl客户端
  • 进入supervisorctl客户端,然后可以执行相关的命令进行管理:
* status                # 查看状态
* start program_name    #启动程序
* restart program_name  #重新启动程序
* stop program_name     # 关闭程序
* reload                # 重新加载配置文件
* quit                  # 退出控制台
  • 补充知识
$ ps aux|grep supervisor 查找进程
nginx+uwsgi 的替代方案 nginx+gunicorn,配置更简单,有时间再学习