nginx+uWSGI+django+virtualenv+supervisor发布web服务器 2018-11-14

将一次通信转化为“对话”的过程

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都不会自动重启。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容