在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

实质:修改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,然后响应

6.Nginx的静态处理

之前在/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除了对请求的中转,还有其他的什么作用呢?请求过滤,缓存服务器,代理服务器,请求均匀分发(负载均衡),VPN等等都可以。

2.Uwsgi还可以对其他的web应用程序进行自动调用吗?flask,tornado都可以,在web服务器与web应用程序之间都能使用它

反正,Nginx和Uwsgi还有很多作用,靠你想象力了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值