uWSGI中ini文件中的http和socket之间有什么区别?

时间:2019-07-19 12:22:20

标签: python django nginx uwsgi

我正在学习nginx和uwsgi来部署我的Django Web应用程序。 在学习它们的同时,我对“套接字”和“ http”感到困惑。

我想我应该像下面这样写.ini

当我仅使用uwsgi时 ... http = 127.0.0.1:8001 ...

当我使用uwsgi和nginx时,我想使客户端通过nginx连接到我的服务器 ... 套接字= 127.0.0.1:8001 ...

当我仅使用uwsgi运行服务器时,我想应该使用“ http”而不是“ socket” 在.ini文件中 http=127.0.0.1:8001 因为如果我使用“ socket”,当客户端连接到我的服务器时,它将发出错误,就像这样。 invalid request block size: 21573 (max 4096)...skip

但是,当我在uwsgi中使用nginx时,应该使用socket而不是http。 如果我使用http,则可能是服务器发出了超时错误。

我的代码

这是我的有效代码 在/etc/nginx/sites-available/blog.conf

upstream blog{
    server 127.0.0.1:8001;
}

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

    client_max_body_size 75M;   # adjust to taste

    location /static {
        alias /django_static/djProject;
    }

    location / {
        include /etc/nginx/uwsgi_params;
        uwsgi_pass  blog;
    }
}

在项目目录中,app.ini

[uwsgi]
plugins=python3
chdir={myProject location}
module=djProject.wsgi:application
# Settings module, relative to the chdir path
env='DJANGO_SETTINGS_MODULE=djProject.settings'
# Python virtual env path
home=/home/su/uwsgi/uwsgi-tutorial
# File used for uwsgi to send signals and start/stop

socket=127.0.0.1:8001
#http=127.0.0.1:8001
master=True
processes=4
harakiri=20
max-requests=5
vacuum=True
enable-threads=true

static-map = /static=/django_static/djProject

总结

http文件中使用socket.ini有何不同?何时分别使用它们?

2 个答案:

答案 0 :(得分:1)

不要混淆这两个不同的项目(uwsgi和http)。

正如您已经提到的,您正在使用uwsgi和nginx服务器部署python应用程序。

在继续之前,请查看对服务器(nginx)的客户端请求

浏览器<-> nginx <->套接字<-> uwsgi <-> python应用程序。

Nginx负责服务器html,javascript和css文件。

Nginx无法直接与python应用程序通信。因为python应用程序是通过Web服务器发布应用程序的标准方式,所以它就是WSGI。这就是为什么我们需要一个uwsgi服务器。基本上可以与python应用程序进行通信,并处理来自Web服务器nginx的请求和响应。

Web服务器/ HTTP服务器通过套接字连接与uwsgi服务器通信。

  

但是,当我在uwsgi中使用nginx时,应该使用套接字而不是http。如果使用http,则可能是服务器发出了超时错误。

是你的权利。

答案 1 :(得分:1)

扩展Ranjeet所说的内容,您需要确保所有内容都使用兼容协议进行通信。 Nginx的uwsgi_pass选项告诉它使用“特殊” uwsgi协议。尽管uWSGI的socket选项被记录为使用其“默认协议”,这实际上意味着它使用了相同的“特殊” uwsgi协议,但是您可以使用DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss.SS"); LocalDateTime now = LocalDateTime.now(); System.out.println(dtf.format(now)); 选项来使其更明确。 >

通过uwsgi来查看uwsgi.csocket.c中的代码,很明显uwsgi-socket只是uwsgi-socket的别名。如果文档也这么说,那就太好了!

如果您使用socket选项配置uWSGI,则告诉它使用http协议,这不会做任何有用的事情,因为NGINX试图使用上述特殊的uwsgi协议与其进行对话。请注意,您还可以将NGINX配置为使用HTTP与uWSGI进行通信,但这会丢失信息,因为您基本上是在进行代理,因此NGINX必须重写标头以说它正在代理,并且基本上会做更多的工作

另请参阅https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html,其中有很多东西相互关联的内容,您可以忽略Django位!