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