项目路径:/home/zyh/projects/mytestProject1/mysite
切换到项目路径
cd /home/zyh/projects/mytestProject1/mysite
新建虚拟环境python3_venv
python -m venv python3_venv
激活
source python3_venv/bin/activate
下载项目所需第三方库
pip install -r requirements.txt
虚拟环境中安装gunicorn
pip install gunicorn
测试开启服务(可选):
cd /home/zyh/projects/mytestProject1/mysite
gunicorn mysite.wsgi:application --bind 127.0.0.1:9000 # 9000 为gunicorn端口
编写gunicorn脚本文件(linux中:set ff=unix)
1. cd /home/zyh/projects/mytestProject1/mysite
2. touch gunicorn_start.sh # 新建gunicorn文件
插入代码
#!/bin/bash
NAME="mysite"
DIR=/home/zyh/projects/mytestProject1/mysite
USER=zyh
GROUP=zyh
WORKERS=3
BIND=127.0.0.1:9000
DJANGO_SETTINGS_MODULE=mysite.settings
DJANGO_WSGI_MODULE=mysite.wsgi
LOG_LEVEL=error
cd $DIR
source ../python3_venv/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DIR:$PYTHONPATH
exec ../python3_venv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $WORKERS \
--bind=$BIND \
--log-level=$LOG_LEVEL \
--log-file=-
修改权限为可执行模式
sudo chmod u+x bin/gunicorn_start
虚拟环境中安装supervisor
pip install supervisor
生成配置文件
cd /etc/supervisor
echo_supervisord_conf > /etc/supervisord.conf
sudo vim supervisord.conf
修改代码
[unix_http_server]
file=/var/run/supervisor.sock (修改成当前)
[inet_http_server] ; inet (TCP) server disabled by default
port=0.0.0.0:8080 通过网页管理
username=admin
password=admin
[supervisord]
logfile=/var/log/supervisord.log(修改成当前)
pidfile=/var/run/supervisord.pid(修改成当前)
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock(修改成当前)
最后一行改为:files = /etc/supervisor/conf.d/*.conf
编辑自己的mysite.conf文件
cd conf.d
touch mysite.conf
插入代码
[program:mysite]
directory=工作目录
command=/home/zyh/projects/mytestProject1/mysite/gunicorn_start.sh(执行gunicorn文件)
user=zyh
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/home/zyh/projects/mytestProject1/mysite/logs/robot.log
stderr_logfile=/home/zyh/projects/mytestProject1/mysite/logs/err.log
[program:celery]
directory=/data_1/var/www/service_brain_model
# -P为gevent或eventlet时,需要将beat和worker独立启动,-p=solo时不需要
command=/bin/bash -c "source /data_1/var/www/venv/service_brain/bin/activate&&celery -A service_brain_model worker -B -l info -P solo --without-gossip --without-mingle --without-heartbeat --logfile=logging/celery.log --pidfile="
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/data_1/var/www/service_brain_model/logging/supervisor_celery_worker_access.log
stderr_logfile=/data_1/var/www/service_brain_model/logging/supervisor_celery_worker.log
environment=website_env=prod
environment=PYTHONWARNINGS=ignore
stopasgroup=true
killasgroup=true
***********
也可以直接在supervisord.conf中插入代码
删除最后一行files = /etc/supervisor/conf.d/*.conf
[program:mysite]
command =/home/zyh/projects/mytestProject1/mysite/gunicorn_start.sh(执行gunicorn文件)
user = zyh
autostart=true
autorestart=true
redirect_stderr = true
stdout_logfile =/home/zyh/projects/mytestProject1/mysite/logs/robot.log
stderr_logfile=/home/zyh/projects/mytestProject1/mysite/logs/err.log
新建logs文件夹
cd /home/zyh/projects/mytestProject1/mysite
mkdir logs
调试
启动
$ supervisord -c /etc/supervisor/supervisord.conf
$ sudo supervisorctl reread
mysite: available
$ sudo supervisorctl update
mysite: added process group
查看所有服务状态
$ sudo supervisorctl status
mysite RUNNING pid 18020, uptime 0:00:50
停止服务
$ sudo supervisorctl stop mysite
mysite: stopped
开启服务
$ sudo supervisorctl start mysite
mysite: started
重启服务
$ sudo supervisorctl restart mysite / reload(全部)
mysite: stopped
mysite: started
# 规则示范
访问测试uriA: /api/docs/
访问测试uriB: /media/xxx.png/
访问测试uriC: /frontC/login/
访问测试uriD: /frontD/login/
location / {
proxy_pass http://127.0.0.1:9000/; # A实际访问http://127.0.0.1:9000/api/docs/
}
location /api/ {
proxy_pass http://127.0.0.1:9000/; # A实际访问http://127.0.0.1:9000/docs/
}
location /api/ {
proxy_pass http://127.0.0.1:9000/api/; # A实际访问http://127.0.0.1:9000/api/docs/
}
location /media/ {
alias /home/zyh/mysite/meida/; # B实际访问/home/zyh/mysite/meida/xxx.png
}
location /media/ {
alias /home/zyh/mysite/meida/; # B实际访问/home/zyh/mysite/meida//xxx.png
}
location /media/ {
root /home/zyh/mysite/meida/; # B实际访问/home/zyh/mysite/meida/meida/xxx.png
}
location /media {
root /home/zyh/mysite/meida/; # B实际访问/home/zyh/mysite/meida/meida//xxx.png
}
location / {
root /usr/share/nginx/html/test;
index login.html index.htm;
}
location /frontC {
alias /usr/share/nginx/html/project01/;
index login.html index.htm;
}
location /frontD {
alias /usr/share/nginx/html/project02/;
index login.html index.htm;
}
总结1.localtion 中末尾带/ 转发的末尾也要带/。
总结2.alias访问的是什么文件名就去指定目录里找,location的路径不存在时使用;
root访问的需要去指定目录末尾再加一级location去找,location的路径存在时使用。
下载
sudo apt install nginx
新建dj.conf文件
cd /etc/nginx/sites-available/
touch dj.conf
插入代码
server {
listen 8000; # 监听端口(前端访问端口)
server_name 192.168.153.189; # IP或者域名(前端访问)
charset utf-8;
client_max_body_size 75M;
location / {
proxy_pass http://127.0.0.1:9000; # gunicorn的bind
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static { #这里做了访问静态目录不走uwsgi/gunicorn
#expires 30d;
#autoindex on;
#add_header Cache-Control private;
alias /home/zyh/projects/mytestProject1/mysite/staticfiles/; # django setting中static_root的路径
}
}
创建软连接
sudo ln -s /etc/nginx/sites-available/dj.conf /etc/nginx/sites-enabled/dj.conf # 必须为绝对路径
删除默认文件
sudo rm /etc/nginx/sites-enabled/default
重启nginx
sudo service nginx restart或sudo service nginx start
7.开机自启(可能已经自动添加了)
vim /usr/lib/systemd/system/nginx.service
写入:
########################################
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#########################################
[Unit]:服务的说明
Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
开机自启:systemctl enable nginx.service
查看状态:systemctl status nginx.service/sudo service nginx status
DEBUG = False
项目下新建static,staticfiles文件夹
setting.py:
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
url.py:
from django.urls import path, re_path, include
from django.conf.urls import url
from django.contrib import admin
from django.views import static
from django.conf import settings
urlpatterns = [
#re_path(r'^admin/', admin.site.urls),
#path('polls/', include('polls.urls')),
url(r'^static/(?P.*)$', static.serve, {'document_root': settings.STATIC_ROOT}, name='static') 或
]
urlpatterns+=static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT),
urlpatterns+=static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
设置nginx
cd /etc/nginx/conf/
vim xx.conf
将所有.conf文件中server下添加:
location /static { #这里做了访问静态目录不走uwsgi/gunicorn
expires 30d; # 可选
autoindex on; # 可选
add_header Cache-Control private; # 可选
alias /home/zyh/projects/mytestProject1/mysite/staticfiles/;(django setting中static_root对应) }
收集静态文件:
python manage.py collectstatic
sudo service nginx restart # 重启nginx
配置系统文件
cd /lib/systemd/system
vim supervisord.service
插入代码(可能已经自动添加了)
[Unit]
Description=Supervisord Service
[Service]
Type=forking
ExecStart=/home/zyh/projects/mytestProject1/python3_venv/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/home/zyh/projects/mytestProject1/python3_venv/bin/supervisorctl $OPTIONS shutdown
ExecReload=/home/zyh/projects/mytestProject1/python3_venv/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
重新加载
sudo systemctl daemon-reload
激活开机启动
sudo systemctl enable supervisord.service
后台运行‘cmd’
$ nohup ‘cmd’
查看端口
netstat -nlpt | grep 9090
查看关键字
ps -aux | grep gunicorn
kill 端口
sudo fuser -k 8000/tcp
客户通过nginx:8000端口提交请求,nginx将动态请求分给gunicorn:9000端口,gunicorn通过Django执行后台程序后返回response给nginx,再返回给客服端;将静态请求设置缓存。supervisor检测gunicorn是否一直处于运行状态。