在Liunx下通过Nginx, Uwsgi和Django配置一台web服务器
配置总说明
原理说明
废话不多说,直接上图陈述。
首先,我们通过浏览器输入http://183.232.231.137:8080来发送请求给服务器,服务器即PC-0中的Nginx程序接收到请求后,将请求转发给服务器PC-x中的某台机器的uwsgi程序来处理,uwsgi程序收到请求后,自动调用django程序来处理该请求并返回结果。
请求经过路线
浏览器 - Nginx - Uwsgi - Django - Uwsgi - Nginx - 浏览器
处理流程
处理步骤说明(由Django向浏览器辐射处理)
1.保证Django的可运行状态
2.保证Uwsgi的可运行状态
3.实现Django与Uwsgi的连接,访问Uwsgi便可以直接访问到django的处理结果
4.保证Nginx的可运行状态
5.实现Uwsgi与Nginx的连接,访问Nginx便可以直接访问到Uwsgi,然后得到Django的处理结果
6.Nginx静态文件的处理
7.测试结果
具体步骤实现
1.保证Django的可运行状态
关于Django的安装和项目的创建等,这里不多说,我们直接到项目的目录,我的项目在 /root/Envs/myweb/web/下,里面有一个manage.py文件,我们直接输入命令
python manage.py runserver 8000
结果如图所示:
此时,在浏览器中输入 127.0.0.1:8000
如果结果如上面两图所示,Django能成功响应你的请求,那么你这步是完成了。
2.保证Uwsgi的可运行状态
安装Uwsgi: pip install uwsgi
安装的uwsgi是直接在你的python目录的bin目录下,可通过查看which命令查看
你要确保你之后运行的uwsgi命令是运行你python目录下的uwsgi,不然之后都会出现no found application等错误,这里我踩了好久的坑
接下来,写在/root/Envs/myweb/web/ 目录下新建一个test.py文件,写一个application函数,内容如下:
def application(env,start_response):
start_response('200 OK',[('Content_Type','text/html')])
return b"Congraduation!!! uWSGI Testing OK!!!"
写好后,直接在/root/Envs/myweb/web/ 目录下运行命令:
uwsgi --http-socket :8000 --wsgi-file test.py
之后后进入阻塞状态,新建一个shell窗口,输入:
curl http://127.0.0.1:8000
得到如下结果:
结果跟图中一样,即表示你的Uwsgi是可用的
3.连接Django和Uwsgi
连接实质:调整Uwsgi命令的参数即可。
Uwsgi有个便捷的使用方法,就可以把你的命令行参数放到一个文件中,然后直接通过配置文件来运行该程序即可。
在/root/Envs/myweb/web/ 目录下新建一个web.ini文件,内容如下:
[uwsgi]
socket = 127.0.0.1:1314 //socket参数表示Uwsgi提供一个入口,该入口允许所有的请求进入,127.0.0.1即表示允许连接的ip地址,允许所有的ip连接去掉127.0.0.1即可,直接保留 :1314 , 而1314即是进入Uwsgi的端口号,这个要记住,之后要用。
chdir = /root/Envs/myweb/web // 你的Django项目路径
module = web.wsgi // 使用Django提供的wsgi.py文件,相当于让Uwsgi自动调用Django程序,项目名.wsgi
master = true //监控Uwsgi程序的程序,如果Uwsgi程序意外停止,则监控程序会自动重新开启Uwsgi程序process = 2 //运行Uwsgi开启的Django进程数
写入文件时,直接去掉//后面的注释,保存后,通过配置文件启动uwsgi,运行命令:
uwsgi web.ini
此时,程序进入阻塞状态。开启另外一个shell,运行命令:
curl http://127.0.0.1:1314
得到如上结果,响应的意思是服务器返回空响应。这个是没问题的,因为之前我们的配置文件中的socket = 127.0.0.1:1314,这个表示接受与响应都是socket,这个是不会返回任何数据的。你也可以改成http-socket=127.0.0.1:1314,再执行命令:curl http://127.0.0.1:1314,此时会返回Django的http数据,你的请求通过Uwsgi程序,然后调用Django处理该请求返回数据,Django返回的数据就也是curl命令返回的数据。不过测试完会记得改回来socket = 127.0.0.1:1314,即可继续下一步。
4.保证Nginx的可运行状态
安装Nginx:yum install nginx //使用yum还是apt-get看系统
nginx是以服务的形式开启的,所以需要用到service命令来启动Nginx:
service nginx start
然后,你会得到一个欢迎页面Welcome to nginx的页面,类似于下面的页面
此时,表示你的Nginx可以正常使用了,这一步完成
5.连接Uwsgi与Nginx
6.Nginx的静态处理实质:修改Nginx的配置,让其动态连接转到Uwsgi
Nginx的全局配置文件在 /etc/nginx/nginx.conf 中,我们之间打开编辑:
user nginx; //找到这行,在前面加上#号注释掉,然后在下面添加一行 user root; 这是涉及到程序的权限问题,不修改的话,后面会报类似于权限错误
// 找到server段,按照注释修改
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name localhost; //这个是标识服务器的名称,无所谓。
root /root/project/proxies/; //这个表示你的HTML存放的文件夹路径,之后的html文件都是从该文件夹中取,我们的Nginx只是做一个请求中转的作用,不需要用到HTML文件,这个可不管。
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
uwsgi_pass 127.0.0.1:1314; //uwsgi_pass顾名思义,就是讲请求转发给uwsgi程序的,后面是指定uwsgi所在的ip地址和端口,根据之前uwsgi的配置可确定是127.0.0.1:1314
include /etc/nginx/uwsgi_params; //这个是请求转发时,也把请求的一些参数(get请求的参数等),同时转发给Uwsgi。
# index index.html; //浏览器访问http://ip/index路径的时候,Nginx进行匹配,根据匹配到的返回数据,这里不用返回HTML,用不到,可注释掉。
}
location /static {
alias /root/Envs/myweb/web/static; //这里是静态文件的直接响应,如果请求是静态文件,则Nginx会直接从/root/Envs/myweb/web/static该目录取出静态文件返回。}
修改成上面的配置文件,命令行重启Nginx服务即可,输入命令:
service nginx restart
然后你直接访问127.0.0.1:80, 即可接受到django的处理结果,请求经过nginx - uwsgi - django,然后响应
之前在/etc/nginx/nginx.conf配置文件中,我们设置了location /static{...}静态文件加载时访问的路径,接下来我们还需要对django进行静态文件的收集,以便给nginx处理。
首先,我们打开django项目的settings.py文件,/root/Envs/myweb/web/web/settings.py,在最后添加一行:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
记住,如果在该文件中存在STATICFILES_DIRS变量,这两个不能有相同的文件夹路径。
之后,我们来到manage.py所在的目录/root/Envs/myweb/web/,输入命令:
python manage.py collectstatic
接着输入yes来收集静态文件以便给Nginx处理,此步完成。
7.测试结果
在/root/Envs/myweb/web/web目录下,启动uwsgi程序,输入命令:
uwsgi web.ini
接着进入阻塞状态,直接在浏览器上输入127.0.0.1即可看到django的完整页面。
小思考:
1.Nginx除了对请求的中转,还有其他的什么作用呢?请求过滤,缓存服务器,代理服务器,请求均匀分发(负载均衡),v*n等等都可以。
2.Uwsgi还可以对其他的web应用程序进行自动调用吗?flask,tornado都可以,在web服务器与web应用程序之间都能使用它
反正,Nginx和Uwsgi还有很多作用,靠你想象力了。