我正在学习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
有何不同?何时分别使用它们?
答案 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.c和socket.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位!