【Django2.0学习笔记】39.用Nginx+uWSGI部署

39、用Nginx+uWSGI部署

1、web服务怎么提供服务

在这里插入图片描述

2、使用Nginx+uWSGI部署

  • 1)安装uwsgi
  • 2)测试uwsgi
  • 3)安装Nginx
  • 4)配置
    在这里插入图片描述

我们在git登录服务器后台
首先我们安装uwsgi:
输入pip3 install uwsgi。这里我们要注意一点,我们没有开启虚拟环境,而是直接安装到系统环境,公共环境,很多教程或者文章都是安装到虚拟环境,实际上我们正式用的时候是会放到外边的。
第二点,安装这个的时候,还要安装python的开发包(我们前面已经安装过,这里就不用安装了)
第三点,我们要安装到对应的Python版本上,这里我们用到的是python3,所以我们使用的是pip3来进行安装的

接着,我们测试uwsgi有没有安装完成:
可以查看django官网(https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/uwsgi/)
在这里插入图片描述
在这里插入图片描述
切到home目录,输入vim test.py创建test.py文件,将上面测试的代码复制粘贴进去。
在这里插入图片描述

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

保存退出
按照上面的代码,在命令行输入uwsgi --http :8001 --wsgi-file test.py,进行测试,启动没有错误。
【这里如果显示错误probably another instance of uWSGI is running on the same address (:8001).,说明我们开启了其它uwsgi的8001端口,我们需要输入ps -aux | grep uwsgi | awk '{print $2}' | xargs kill -9就可以把uwsgi相关的进程关掉】
在这里插入图片描述

但是我们访问47.113.107.189:8001,发现还是访问不了,因为我们服务器还没有开启8001这个端口,我们需要把这个端口开启一下,才能允许访问,

我们登陆自己的阿里云服务器,点击“安全组配置”——“配置规则”——“克隆”已有的某个安全组,把其中的“协议范围”改成“自定义TCP”,把“端口范围”改成8001,“优先级”填10就行——“确定”
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后我们访问47.113.107.189:8001,就可以看到显示“Hello World”,这就说明uwsgi是可以使用的,而且可以直接提供web服务。
在这里插入图片描述

也就是说我们前面那个关系图里,浏览器去访问web服务器,uwsgi充当了web服务器软件的功能,直接响应数据给到浏览器。而我们这里是需要让它去打开我们的网站,那它怎么去和我们的Django交互呢?这里有一个简单的测试,官网上也有说明
在这里插入图片描述
输入uwsgi --chdir /home/mysite --home /home/mysite_env/ --http :8001,指定项目路径、虚拟环境路径、端口号

然后刷新访问47.113.107.189:8001,可以看到有个错误,这个错误信息在git命令行也有显示“no python application found”,这个错误是因为我们没有给它指定wsgi文件,指定这个文件之后就可以使用这个文件,让django进行交互。
在这里插入图片描述

我们重新输入uwsgi --chdir /home/mysite --home /home/mysite_env/ --http :8001 --module mysite.wsgi:application,然后再刷新页面,可以正常访问了。
在这里插入图片描述
在这里插入图片描述

但我们发现页面什么样式都没有,因为wsgi只提供动态链接服务,其他静态文件它都没有。所以我们才需要Nginx完完整整的提供web服务,所以这里就产生了一个需求,需要安装Nginx,静态文件用Nginx去处理,而动态这些数据这些包让uwsgi去处理。

安装之前我们要先做一个处理,因为之前我们用了同一台服务器安装了apache,需要先把apache的服务关掉,它占用了80这个端口,输入apache2ctl stop,再输入apt-get update更新一下

然后再输入apt-get install nginx安装nginx,接着我们需要进一步配置,让uwsgi和nginx联系起来,完完整整地实现web服务器,通过WSGI规范,与Django程序进行交互。
在这里插入图片描述

首先,输入cd /etc/nginx/进入这个目录,sites-available是一些可用的配置、sites-enabled是一些已经启用的网站配置、nginx.conf是nginx主要配置文件(一般我们不修改)。
我们最好先删除掉sites-enabled目录的文件,输入rm mysite.conf(如果存在的话,则删除)、rm default(default是默认的有一个页面,可以让我们去访问,这个最好也删除掉,避免我们去使用)
在这里插入图片描述

接着,输入cd /sites-available进入可用网站配置,输入vim mysite.conf新建文件,写入如下代码(可参考官方文档):
listen 80:监听80这个端口
server_name:可自定义名称,一般写自己的网站、域名或是网站名称都可以
charset:字符编码集
client_max_body_size:客户端提交最大尺寸
location:指定静态和动态
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

server {
    listen 80;
    server_name mysite;
    charset utf-8;

    client_max_body_size 75M;

    location /static {
        alias /home/mysite/static;
    }

    location /media {
        alias /home/mysite/media;
    }

    location / {
        uwsgi_pass 127.0.0.1:8001;
        include /etc/nginx/uwsgi_params;
    }
}

保存退出
创建完成之后,我们就需要创建一个软链接,将这个文件放入到site-enabled这个目录里面,表示它已经启用。在/etc/nginx目录下输入ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf
在这里插入图片描述
我们做好了这个配置之后,但是uwsgi还没有做好准备去接收,上面的转发uwsgi_pass 127.0.0.1:8001;不是通过http协议,而是通过socket协议处理的,如果它是用http协议的话,就跟前面listen 80;这个80端口有冲突。

这里我们就需要配置一下uwsgi,这里配置的话,我们换一种方式,可以用ini文件对uwsgi进行配置,而不是通过命令行去启动uwsgi,通过命令行来进行的话,不方便我们去更改查看。

我们先退回到home目录,这里我们要专门写一个文件,方便去管理,输入mkdir mysite_uwsgi创建目录,输入cd mysite_uwsgi进入到这个文件目录,输入vim mysite.ini新建一个ini文件,写入如下代码(可以参考官网)
在这里插入图片描述

chdir:django程序所在目录
home:指定虚拟环境目录
module:指向uwsgi文件
master:启动主程序
processes:使用的进程数
harakiri:每个请求超时时间
max-requests:最大请求数(每个请求最多请求5000个, 超过后这个进程就会进行重启,以防内存泄露)
socket:用scoket这个协议监听或者使用8001这个端口
uid gid:使用nginx用户组,不用root用户
pidfile:主进程
daemonize vacuum:让它后台运行的参数
在这里插入图片描述
在这里插入图片描述

[uwsgi]
chdir = /home/mysite
home = /home/mysite_env
module = mysite.wsgi:application

master = True
processes = 4
harakiri = 60
max-requests = 5000

socket = 127.0.0.1:8001
uid = 1000
gid = 2000

pidfile = /home/mysite_uwsgi/master.pid
daemonize = /home/mysite_uwsgi/mysite.log

vacuum = True

保存退出

接下来我们要启动一下uwsgi,这里我们通过ini文件去启动,输入uwsgi --ini /home/mysite_uwsgi/mysite.ini,然后可以通过命令ps -aux | grep uwsgi检查一下是否启动成功,如果只有一个的话,就说明时候是没有启动。这里我们可以看到有好多个,因为刚刚ini文件里面是有一个主进程四个子进程进行处理的
在这里插入图片描述
在这里插入图片描述

那现在uwsgi已经通过ini文件启动了,使用的是socket协议。那现在我们还要重启nginx服务,让它可以使用,不过重启前,我们可以在nginx目录下利用参数t,输入nginx -t查看下有没有问题,发现是ok,没有问题的。没有问题之后,我们再重启nginx服务,输入service nginx restart,重启之后,我们访问47.113.107.189(之前我们是通过uwsgi去使用8001这个端口,直接用http协议。那现在不用输入8001,直接输入ip地址),可以看到页面正常显示
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
但是访问网页后台admin的话,显示不正常,因为admin中的有些静态文件还没有收集起来,这个问题在下节课进行优化

最后我们需要熟悉一些命令

  • 重启或者停止nginx服务:
    service nginx restart
    service nginx stop

  • uwsgi重新加载或关闭:
    uwsgi --reload /home/mysite_uwsgi/master.pid
    uwsgi --stop /home/mysite_uwsgi/master.pid

  • 查看和关闭相关进程:
    ps -aux | grep uwsgi
    ps -aux | grep uwsgi | awk '{print $2}' | xargs kill -9


第39节相关命令:

1、安装uwsgi
注意:
	1)在系统环境安装,非虚拟环境
	2)使用对应python版本安装
	3)要先安装python开发包

pip3 install uwsgi


2、测试 uwsgi 是否正常:
新建 test.py 文件,内容如下:
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World"

然后在终端运行:
uwsgi --http :8001 --wsgi-file test.py
注意:需要开启端口才可以正常访问


3、可以用uwsgi的http协议访问django写的网站
执行如下命令可以测试自己的项目
uwsgi --http :8001 --chdir /home/mysite --home /home/mysite_env --module mysite.wsgi:application

* 参数说明:
    chdir:指向程序的根目录
    home:虚拟环境的路径,若没有虚拟环境,可以不写该参数
    module:要使用的wsgi模块

* 特别说明
    和Lucas的一次调试,发现命令行有时需要用env参数,设置环境遍历。例如
    uwsgi --http :8001 --chdir /home/mysite --home /home/mysite_env --module mysite.wsgi:application --env DJANGO_SETTINGS_MODULE=mysite.settings


4、安装nginx
若有安装过apache,要先把apache服务关闭(apache2ctl stop)
apt-get update
apt-get install nginx

移除default
/etc/nginx/sites-enabled/default

进入sites-available创建新的配置
cd /etc/nginx/sites-available/
vim mysite.conf

配置可以参考下面:
server {
    listen 80;
    server_name mysite;
    charset utf-8;

    client_max_body_size 75M;

    location /static {
        alias /home/mysite/static;
    }

    location /media {
        alias /home/mysite/media;
    }

    location / {
        uwsgi_pass 127.0.0.1:8001;
        include /etc/nginx/uwsgi_params;
    }
}

再设置软链接到sites-enabled
ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf


5、配置uwsgi,创建ini文件方便处理。ini参考如下:
[uwsgi]
chdir = /home/mysite
home = /home/mysite_env
module = mysite.wsgi:application

master = True
processes = 4
harakiri = 60
max-requests = 5000

socket = 127.0.0.1:8001
uid = 1000
gid = 2000

pidfile = /home/mysite_uwsgi/master.pid
daemonize = /home/mysite_uwsgi/mysite.log
vacuum = True


6、启动uwsgi
uwsgi --ini /home/mysite_uwsgi/mysite.ini


7、重启nginx
service nginx restart


=======================
其他参考:
nginx测试命令:nginx -t
查看uwsgi进程:ps -aux | grep uwsgi
正常关闭uwsgi进程:uwsgi --stop /home/mysite_uwsgi/master.pid
强制关闭全部uwsgi进程:ps -aux | grep uwsgi |awk '{print $2}'|xargs kill -9
重新加载uwsgi:uwsgi --reload /home/mysite_uwsgi/master.pid

参考文档:
(Django官网)https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/uwsgi/
(uwsgi中文)https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/tutorials/Django_and_nginx.html
(uwsgi英文)https://uwsgi.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
(自强学堂)https://code.ziqiangxuetang.com/django/django-nginx-deploy.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值