1 项目代码打包部署
包压缩技巧:( zip / unzip linux 下的zip文件的压包和解包命令 )
tar -cjvf python3.6_env.tar.bz2 python3.6_env/
tar xjvf python3.6_env.tar.bz2
一。压缩拷贝代码:
(1)进入工程主目录
cd SHDjangoLesson
(2)产生依赖库 pip freeze > requirements.txt
(3)压缩
cd SHDjangoLesson
zip -r SHDjangoLesson.zip SHDjangoLesson/
二。远程拷贝
服务器端(ubuntu):
nc -l 11111 > SHDjangoLesson.zip
客户端:
nc IP 11111 < SHDjangoLesson.zip
三。配置环境, 解压
python依赖的环境: python3.5 或者 python3.6
安装并配置虚拟环境: virtualenv –no-site-packages venv -p /usr/bin/python3.6
source venv/bin/activate
进入虚拟环境
pip install -r requirements.txt
查看环境依赖:pip list
四。启动服务
确认redis, mysql安装良好,能访问
setings.py 中 ALLOWS = [‘*’]
启动服务
python manage.py runserver 0.0.0.0:8000
(无问题情况,在后台运行:
nohup python manage.py runserver 0.0.0.0:8000 &
)
备注:
如果出现如下问题:
DjangoUeditor ModuleNotFoundError: No module named ‘widgets’
解决方案:
(1)从https://github.com/twz915/DjangoUeditor3.git重新下载到本地
(2)修改DjangoUeditor下的views.py中的240行,添加:
output_path = "/static/" + urljoin(USettings.gSettings.MEDIA_URL, OutputPathFormat)
return_info = {
# 保存后的文件名称
#'url': urljoin(USettings.gSettings.MEDIA_URL, OutputPathFormat),
'url': output_path,
(3)编译 进入到DjangoUeditor工程目录 python setup.py install
- 建议: 将DjangoUeditor3/DjangoUeditor项目移动到 extapps/目录下, 修改它的models.py文件:
# 修改 from .widgets import .... 为下面的widgets位置
from DjangoUeditor.widgets import ....
2 项目分布式部署的整体框架图
提供两种方案,一个备选方案:
方案1:
client —> Nginx(openresty) —> gunicorn (通过wsgi启动托管) —> django (应用服务)
方案2:
Nginx(openresty, upstream) —> supervisor (monitor ) ——> gunicorn (同uwsgi) —> django (应用服务)
备选:
按照原来的HTTP启动的方式
nohup python manage.py runserver 0.0.0.0:9001 &
Nginx(openresty, upstream) —> supervisor(minitor) HTTP —> django (HTTP)
使用如下框架和工具
反向代理负载均衡服务器: Nginx (Openresty)
gunicorn (代替uwsgi)
django
supervisor (监控并拉起失败服务)
1 安装项目依赖包
pip list
采用pip freeze产生项目依赖包,输出到 requirements.txt
pip freeze > requirements.txt
拷贝requirements.txt文件到线上服务器,并在虚拟环境下安装
将线下项目工程目录打包,并用nc上传到服务器上。
假设线上的工程目录放在了
2 安装gunicorn(或uwsgi)
gunicorn是一个python Wsgi http server,只支持在Unix系统上运行,来源于Ruby的unicorn项目。Gunicorn使用prefork master-worker模型(在gunicorn中,master被称为arbiter),能够与各种wsgi web框架协作。
在虚拟环境下安装上述的requirements.txt中对应的依赖包
(1)pip install -r requirements.txt
注:
pip install future -i https://pypi.douban.com/simple (可能会安装)
确保DjangoUeditor3安装成功,之前讲过从git下载安装
(2)pip install gunicorn -i https://pypi.douban.com/simple
(3)启动gunicorn, 命令如下:
具体chdir是项目的basedir目录
nohup gunicorn --chdir /home/apple/www/TAdminPro/ TAdminPro.wsgi:application --bind 0.0.0.0:9000 --workers=1 &
nohup gunicorn --chdir /home/apple/artproject/ artproject.wsgi:application --bind 0.0.0.0:9000 --workers=2 &
# 启动项目, 服务器8000
nohup gunicorn --chdir /home/apple/www/xsapp/ XSproject.wsgi:application --bind 0.0.0.0:8000 --workers=2 &
注: 重新安装DjangoUeditor项目,可以先试着python manage.py runserver 是否能正常启动django项目
3 关于静态资源管理
将分散在各个app应用中的静态资源集中管理,采用如下命令:
python manage.py collectstatic
此时会在base_dir目录下产生statics文件夹
后面nginx静态文件配置就可以指定此路径
4 配置Nginx服务器
在nginx服务器配置中修改配置目录
将nginx.conf修改为:
# user nobody;
# user nginx;
worker_processes 2; #cat /proc/cpuinfo
# worker_cpu_affinity 0001 0010 0100 1000;
error_log logs/error.log notice;
# error_log logs/error.log debug;
pid logs/nginx.pid;
events
{
use epoll;
multi_accept on;
accept_mutex_delay 50ms;
worker_connections 65535; #每个worker支持最大网络连接数
}
http
{
include mime.types;
# default_type application/octet-stream;
default_type text/html;
# log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"'
# '"$upstream_addr" "$upstream_status" "$upstream_response_time" '
# '$request_time -- $http_cookie -- $cookie_pin';
# access_log logs/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 0;
gzip on;
gzip_min_length 1k;
# gzip_buffers 48k; # 注意,可能会出现无效的数值
gzip_http_version 1.1;
gzip_types text/plain application/x-javascript text/css text/shtml application/xml;
proxy_intercept_errors on;
charset utf-8;
######################
include conf.d/*.conf;
######################
}
创建目录conf.d, 并添加如下信息到project.conf:
proxy_next_upstream error;
server
{
listen 80; #nginx提供对外的端口是80, 通过路由 / 转发到127.0.0.1:8000/art/index 服务,而8000端口是上述gunicorn提供的端口
server_name localhost;
client_max_body_size 50M;
#配置项目静态资源目录
location /static {
alias /home/apple/artproject/static;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.htlml {
root html;
}
}
重启Nginx服务,生效。
通过以上的配置信息,基本已经完成了nginx + gunicorn + django的配置
测试:http://127.0.0.1:8000/, 可以看到项目的效果图
5 安装Supervisor与配置
supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中就好了。此时被管理进程被视为supervisor的子进程,若该子进程异常终端,则父进程可以准确的获取子进程异常终端的信息,通过在配置文件中设置autostart=true,可以实现对异常中断的子进程的自动重启。
(1)安装supervisor
(python3.6_env) apple@ubuntu:~$ sudo apt install supervisor
上述方法我们直接管理gunicorn,让它启动和暂停,现在我们希望采用supervisor来管理gunicorn
(2)配置supervisor
将supervisor设置为管理启动监控 gunicorn
新增文件 /etc/supervisor/conf.d/xs.conf ,配置信息如下
[group:xsapp]
programs=xs-1, xs-2
[program:xs-1]
command=gunicorn --chdir /home/apple/www/xsapp XSproject.wsgi:application --bind 0.0.0.0:8001 --workers=1
directory=/home/apple/www/xsapp
user=apple
autorestart=true
redirect_stderr=true
stdout_logfile=log/xs1.log
loglevel=info
stopsignal=INT
[program:xs-2]
command=gunicorn --chdir /home/apple/www/xsapp XSproject.wsgi:application --bind 0.0.0.0:8002 --workers=1
directory=/home/apple/www/xsapp
user=apple
autorestart=true
redirect_stderr=true
stdout_logfile=log/xs2.log
loglevel=info
stopsignal=INT
创建log文件夹,存放日志文件
修改 /etc/supervisor/supervisord.conf 文件:
[unix_http_server]
file=log/supervisor.sock ; (the path to the socket file)
chmod=0700 ; sockef file mode (default 0700)
chown=apple:apple ; 文件的所属用户和组
[supervisord]
nodaemon=false
logfile=log/supervisord.log
loglevel=info
pidfile=log/supervisord.pid
[supervisorctl]
serverurl=unix://log/supervisor.sock ; use a unix:// URL for a unix socket
在nginx配置文件project.conf (或 xs.conf文件 )中加入如下信息
upstream xsapp{
#ip_hash; or 轮询(默认) or url_hash
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
server {
...
location / {
#(2) method2: use proxy_pass upstream to the supervisor who manage the gunicorn
proxy_pass http://xsapp;
...
}
}
添加好上述配置信息后
(1)启动nginx
(2)通过supervisor启动gunicorn
注意: 先确认gunicorn 进程是否已启动
ps -ef | grep gunicorn
ps -ef | grep supervisor
supervisord -c supervisor.conf # 建议复制/etc/supervisor/supervisord.conf 到 项目所在位置
或 supervisord -n 启动, 默认conf文件是/etc/supervisor/supervisord.conf
页面通过http://127.0.0.1:8000/art/index进行页面访问,观看效果。
综合上述,nginx做反向代理和负载均衡,将请求upstream转发给一个Supervisor监管的Gunicorn进程,而Gunicorn进程拖管了Django工程代码。
至此,Nginx + Gunicorn + Supervisor + Django 线上环境部署都已经完成!
supervisord常用命令
supervisord : 启动supervisor, -h 查看帮助
supervisorctl reload :修改完配置文件后重新启动supervisor
supervisorctl status :查看supervisor监管的进程状态
supervisorctl start 进程名 :启动XXX进程
supervisorctl stop 进程名 :停止XXX进程
supervisorctl stop all:停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
supervisorctl update:根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
解决 “Error: Cannot open an HTTP server: socket.error reported errno.EACCES (13)” 错误:
主要是supervisor.socket文件的权限问题, 可以调整它的位置,或设置它们的权限。