django入门(N):部署上线
部署前环境
GCP+CentOS7
BBR 开启(一键脚本)
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh
安装python3
系统环境准备
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
开始源码安装
wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz
tar -xzvf Python-3.6.3.tgz -C /tmp
cd /tmp/Python-3.6.3/
./configure --prefix=/usr/local
make
make altinstall
mv /usr/bin/python /usr/bin/python.bak
ln -s /usr/local/bin/python3.6 /usr/bin/python
ln -s /usr/local/bin/pip3.6 /usr/bin/pip
# 如此实现了 python 命令为版本3,python2 命令为版本2
# 但是 centos 系统的一些组件还需要 python2所以需要修复它们
修复依赖 python2 的系统组件
/usr/bin/yum
/usr/libexec/urlgrabber-ext-down
上面的文件第一行 python 改为 python2
到此处可以新建磁盘映像,以后方便使用,直接从这里开始即可。
nginx(mariadb) 安装
在django连接 mysql前需要安装 mysql 驱动,中间如果报 mysqlclient 相关问题:
# 安装mysqlclient出问题
# centos 7:
yum install python-devel mariadb-devel -y
# ubuntu:
sudo apt-get install libmysqlclient-dev
# 然后:
pip install mysqlclient
vitualenv 安装及初始配置
-
pip install virtualenv pip install virtualenvwrapper
-
nano ~/.bashrc # 在文件最后插入下面两行: export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh # 然后运行下面的命令 source ~/.bashrc
find / -name "virtualenv" ln -s 上一步结果 /usr/bin/virtualenv
-
使用方法
# 新建虚拟环境 mkvirtualenv 名称
# 切换虚拟环境 workon 名称
开发环境 pip 包的转移
在开发环境中:
pip freeze > r.txt
将 r.txt 转移到生产环境中,然后 pip 安装里面的包.
#如果开发环境中有 mysqlclient ,需要先在系统中安装依赖
yum install python-devel mariadb-devel -y
#然后:
pip install -r r.txt
正式部署 Django项目
用 git 传输项目目录到服务器
uwsgi
-
安装 uwsgi
pip install uwsgi
-
django原生服务器测试项目
python manage.py runserver 0.0.0.0:8000
访问测试,并debug。
理想情况是项目完全显示正常。
-
用 uwsgi 测试服务
uwsgi --http :8000 --module 项目中的wsgi 文件 # 最后的路径不用/ 用. 例如:(pwd 是在 django 项目的根目录,则 wsgi 的模块位置在项目名称.wsgi) uwsgi --http :8000 --module sspanel.wsgi
理想情况是除丢失静态文件以外均正常,此时 uwsgi 测试成功。
使用 nginx 处理请求
-
在项目中新建nginx配置文件***.conf,模板如下:
# the upstream component nginx needs to connect to upstream django { # server unix:///path/to/your/mysite/mysite.sock; # for a file socket server 127.0.0.1:8000; # for a web port socket (we'll use this first) } # configuration of the server server { # the port your site will be served on listen 80; # the domain name it will serve for server_name 你的ip地址 ; # substitute your machine's IP address or FQDN charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste # Django media location /media { alias 你的目录/Mxonline/media; # 指向django的media目录 } location /static { alias 你的目录/Mxonline/static; # 指向django的static目录 } # Finally, send all non-media requests to the Django server. location / { uwsgi_pass django; include uwsgi_params; # the uwsgi_params file you installed } }
修改:
- server_name
- media/static 目录绝对路径
-
将配置文件软链到 nginx 规定目录
ln -s ****.conf /etc/nginx/conf.d/ # 用绝对路径表示 conf 文件,减少麻烦 #重启 nginx service nginx restart
将 django 静态文件统一收集到 static 目录
# 在项目的 settings.py 加入静态根目录
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
# 同时注释掉开发时的STATICFILES_DIRS设置
# 顺便:
debug= false
#运行命令
python manage.py collectstatic
用配置文件的方式启动 uwsgi
-
在项目 conf 目录中新建 uwsgi.ini
# mysite_uwsgi.ini file [uwsgi] # Django-related settings # the base directory (full path) chdir = /projects/django-sspanel-backend # Django's wsgi file module = sspanel.wsgi # the virtualenv (full path) # process-related settings # master master = true # maximum number of worker processes processes = 10 # the socket (use the full path to be safe socket = 127.0.0.1:8000 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true virtualenv = /root/.virtualenvs/sscontrol #logto = /tmp/sspanel.log #有这个参数后日志不会出现在 bash 里
-
nginx 相关权限配置
nano /etc/nginx/nginx.conf #第一行配置了 nginx 使用的用户,该用户需要有项目目录的使用权限 #一种方法是直接改成 root,然后项目目录都使用 root 的身份和权限。 pkill -f nginx nginx #更改后需要用这种方法重启 nginx,如果用 centos7 的系统命令,权限可能有问题。
-
启动 uwsgi,测试。
uwsgi -i ***.ini pkill -f uwsgi 关闭后台的进程
-
正式上线,后台运行:
#将 uwsgi 配置文件中的 logto 设置好,后台启动: uwsgi -i ***.ini & #如果需要重启后台的 uwsgi: pkill -f uwsgi #之后后台会自动再次开启
uwsgi
#将 uwsgi 配置文件中的 logto 设置好,后台启动:
uwsgi -i ***.ini &
#查看日志
tail -f /tmp/xxx.log
#重启后台的 uwsgi
pkill -f uwsgi #或
uwsgi --reload='/tmp/django-sspanel.pid'
#关闭后台的 uwsgi
killall -9 uwsgi
总结&待学习
记得切换到虚拟环境下运行命令
各处命名问题,尽量保持一致,避免出错。
nginx权限问题
linux 后台知识:& ps grep
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。