将一次通信转化为“对话”的过程
Nginx:hello wsgi,我刚收到一个请求,你准备下然后让django来处理吧
WSGI:好的nginx,我马上设置环境变量,然后把请求交给django
Django:谢谢WSGI,我处理完请求马上给你响应结果
WSGI:好的,我在等着
Django:搞定啦,麻烦wsgi吧响应结果传递给nginx
WSGI:太棒了,nginx,响应结果请收好,已经按照要求传递给你了
nginx:好滴。我把响应交给用户。合作愉快
一、首先创建一个虚拟环境
mkvirtualenv django22
二、在虚拟环境中安装django并创建项目
pip3 install django==1.11.15
创建一个项目
django-admin startproject mysite
在项目文件夹中创建app
python3 manage.py startapp app01
配置mysite/settings.py文件
ALLOWED_HOSTS = ['*']
注册app
配置mysite/urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello_django/', views.hello),
]
配置app01/views.py
from django.shortcuts import render,HttpResponse
# Create your views here.
def hello(request):
print('request is :',request)
return HttpResponse('django is ok ')
三、安装uWSGI
进入虚拟环境venv,安装uwsgi
pip3 install uwsgi
检查uwsgi版本
uwsgi --version
检查uwsgi python版本
uwsgi --python-version
-
运行简单的uWSGI
- 建一个测试py文件
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
- 启动一个python
uwsgi --http :8000 --wsgi-file test.py
-
http :8000
: 使用http协议,端口8000 -
wsgi-file test.py
: 加载指定的文件,test.py
-
-
运行django程序
要在项目文件夹下运行
uwsgi --http :8000 --module mysite.wsgi
- module mysite.wsgi: 加载指定的wsgi模块
-
uWsgi热加载python程序
在启动命令后面加上参数
uwsgi --http :8088 --module mysite.wsgi --py-autoreload=1
发布命令
command= /home/venv/bin/uwsgi --uwsgi 0.0.0.0:8000 --chdir /opt/mysite --home=/home/venv --module mysite.wsgi
此时修改django代码,uWSGI会自动加载django程序,页面生效 -
指定配置文件启动命令
在项目目录(与app同级目录)下创建一个uwsgi.ini文件
写入如下内容
[uwsgi]
#使用nginx连接时使用
socket=0.0.0.0:9000
#不用nginx直接当做web服务器使用
#http=0.0.0.0:9000
#项目目录绝对路径
chdir=/root/Envs/django15/mysite15
#wsgi文件路径,在项目底下
wsgi-file=mysite15/wsgi.py
#指定解释器目录,就是创建虚拟环境的目录
home=/root/Envs/django15
processes=4
threads=2
master=True
pidfile=uwsgi.pid
通过配置文件启动项目命令
uwsgi --ini uwsgi所在目录绝对路径/uwsgi.ini
四、配置nginx支持转发uwsgi请求
在server上边设置负载均衡池
upstream ss {
server 0.0.0.0:9000 weight=10; # 启动django项目是通过9000端口启动
}
虚拟主机标签段,在这定义mytb.com
server {
listen 80;
server_name www.mytb.com; # 代理域名,通过这个域名直接访问
location / {
include /opt/nginx1-12/conf/uwsgi_params;
uwsgi_pass ss; # 指定负载均衡池
#root /opt/static/mytb/;
#index index.html index.htm;
}
#nginx处理静态资源配置,首先要在项目目录下建一个static文件夹
location /static {
alias /opt/static/django;
}
配置完启动nginx
五、配置django项目,收集静态文件
关闭debug模式
debug=False
收集静态文件的目录,静态文件内容都放这里了
STATIC_ROOT='/opt/static/django' # 要与Nginx中配置路径一致
STATIC_URL = '/static/'
STATICFILES_DIRS=[
os.path.join(BASE_DIR,"static"),
]
执行命令统一收集静态文件,使得网站正常加载js,css
python3 manage.py collectstatic
六、supervisor基于 python 的任务管理工具
supervisor 是基于 python 的任务管理工具,用来自动运行各种后台任务,当然你也能直接利用 nohup 命令使任务自动后台运行,但如果要重启任务,每次都自己手动 kill 掉任务进程,这样很繁琐,而且一旦程序错误导致进程退出的话,系统也无法自动重载任务。所以就有了基于virtualenv的supervisor
安装supervisor
由于supervisor在python3下无法使用,因此只能用python2去下载
首先要退出虚拟环境,然后执行以下命令
yum install python-setuptools
easy_install supervisor
或者直接yum install supervisor
也可以
通过命令生成supervisor的配置文件
echo_supervisord_conf > /etc/supervisord.conf
然后再/etc/supervisord.conf末尾添加上如下代码!!!!!!
[program:my_django15]
command=/root/Envs/django22/bin/uwsgi --ini /data/mysite/uwsgi.ini
`
# 第一个路径是项目所在的虚拟环境的bin目录下的uwsgi --ini文件,
# 第二个路径是项目目录下的uwsgi.ini文件
最后启动supervisor,完成uWSGI启动django,nginx反向代理
supervisord -c /etc/supervisord.conf #启动supervisor
supervisorctl -c /etxc/supervisord.conf restart my #重启my项目
supervisorctl -c /etc/supervisord.conf [start|stop|restart] [program-name|all]
重新加载supervisor
一、添加好配置文件后
二、更新新的配置到supervisord
supervisorctl update
三、重新启动配置中的所有程序
supervisorctl reload
四、启动某个进程(program_name=你配置中写的程序名称)
supervisorctl start program_name
五、查看正在守候的进程
supervisorctl
六、停止某一进程 (program_name=你配置中写的程序名称)
pervisorctl stop program_name
七、重启某一进程 (program_name=你配置中写的程序名称)
supervisorctl restart program_name
八、停止全部进程
supervisorctl stop all
注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。