[求助]Python项目在ubuntu下Nginx与uwsgi配置问题:使用uwsgi --http可以,但使用uwsgi --socket无法连接到服务器

按着文档 https://uwsgi.readthedocs.io/en/latest/tutorials/Django_and_nginx.html 做的

uwsgi --http :8000 --wsgi-file test.py

可以显示

 uwsgi --socket :8001 --wsgi-file test.py 

无法连接服务器

uwsgi log:

(venv) ubuntu[@VM-49-116-ubuntu](/user/VM-49-116-ubuntu):~/code/blog/mmxy$ uwsgi --socket :8001 --wsgi-file test.py
*** Starting uWSGI 2.0.17 (64bit) on [Wed Apr 11 02:19:40 2018] ***
compiled with version: 5.4.0 20160609 on 09 April 2018 17:37:14
os: Linux-4.4.0-91-generic #114-Ubuntu SMP Tue Aug 8 11:56:56 UTC 2017
nodename: VM-49-116-ubuntu
machine: x86_64
clock source: unix
detected number of CPU cores: 1
current working directory: /home/ubuntu/code/blog/mmxy
detected binary path: /home/ubuntu/code/blog/venv/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 3306
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to TCP address :8001 fd 3
Python version: 3.6.4 (default, Apr 10 2018, 00:02:46)  [GCC 5.4.0 20160609]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0xe92290
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72920 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0xe92290 pid: 8870 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 8870, cores: 1)

nginx 配置 mysite_nginx.conf

    upstream django {
        # server unix:///tmp/mmxy.sock;
        server 127.0.0.1:8001; # for a web port socket (we'll use this first)
    }
server {

    listen      8000;
    server_name 140.143.242.243;
    # server_name sususuus.xyz;
    charset     utf-8;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /media  {
        alias /home/ubuntu/code/blog/mmxy/media;
    }

    location /static {
        alias /home/ubuntu/code/blog/mmxy/static;
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /etc/nginx/uwsgi_params;
    }
}

直接访问服务器, 有 Nginx 的欢迎界面

尝试给 uwsgi --socket :8001 --wsgi-file test.py 加一些参数 --protocol=http -b 30000 limit 128 都是无法连接服务器

nginx 下的 /var/log/nginx/error.log 是个空文件, 不知道为什么

尝试了各种办法, 重装了两次系统了, /(ㄒoㄒ)/~~


[求助]Python项目在ubuntu下Nginx与uwsgi配置问题:使用uwsgi --http可以,但使用uwsgi --socket无法连接到服务器

5 回复

一言不合就重装系统…
你看看 Nginx 日志,

没记错的话,
应该是 socket 包大小限制了。


这个问题很常见,核心是Nginx和uwsgi之间的通信方式与权限问题。

uwsgi --http 是让uwsgi自己处理HTTP请求,相当于一个独立的Web服务器。而 uwsgi --socket 是让uwsgi通过一个socket文件(或TCP端口)与Nginx进行通信,这时Nginx负责处理HTTP协议,uwsgi只处理应用逻辑。

问题通常出在以下几点:

  1. Socket文件权限:Nginx的工作进程(通常是 www-data 用户)需要有权限读写uwsgi创建的socket文件。
  2. 配置不匹配:Nginx配置中 uwsgi_pass 指令指向的地址必须和uwsgi启动时 --socket 参数指定的地址完全一致。
  3. SELinux/AppArmor:在某些严格的安全策略下,可能会阻止进程间的socket通信。

检查步骤和解决方案:

首先,确认你的uwsgi启动命令和Nginx配置。 假设你的项目目录是 /home/myproject

一个典型的通过socket文件通信的配置如下:

uwsgi启动命令 (例如在 systemd 服务文件中):

uwsgi --socket /home/myproject/myapp.sock --chdir /home/myproject --module myproject.wsgi:application --master --processes 4 --threads 2 --uid www-data --gid www-data

关键参数

  • --socket /home/myproject/myapp.sock:指定socket文件位置。
  • --uid www-data --gid www-data非常重要。这会让uwsgi进程以 www-data 用户/组运行,确保它创建的socket文件Nginx能访问。

对应的Nginx站点配置 (/etc/nginx/sites-available/myproject):

server {
    listen 80;
    server_name your_domain.com;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/myproject/myapp.sock;
    }
}

关键指令

  • uwsgi_pass unix:/home/myproject/myapp.sock;:这里的路径必须和uwsgi命令中的 --socket 路径一模一样。

如果问题依旧,按顺序排查:

  1. 检查socket文件是否存在及权限

    ls -l /home/myproject/myapp.sock
    

    它应该属于 www-data 用户和组,并且有读写权限。如果不存在,说明uwsgi没启动成功;如果权限不对,可以手动更改:

    sudo chown www-data:www-data /home/myproject/myapp.sock
    sudo chmod 660 /home/myproject/myapp.sock
    
  2. 检查Nginx错误日志:这是最重要的信息来源。

    sudo tail -f /var/log/nginx/error.log
    

    常见的错误是 *1 connect() to unix:/home/myproject/myapp.sock failed (13: Permission denied),这明确指向权限问题。

  3. 检查uwsgi日志:查看uwsgi自身的输出,确认它是否在监听socket。

    sudo journalctl -u your-uwsgi-service-name
    
  4. 临时测试:可以尝试一个最简单的测试,排除配置复杂性。

    • 启动uwsgi:uwsgi --socket :8000 --protocol=http -w myproject.wsgi:application
    • 修改Nginx配置:uwsgi_pass 127.0.0.1:8000; 如果这样能通,那问题100%出在Unix socket的配置或权限上。

总结:先确保socket文件路径一致,再重点解决www-data用户的权限问题。

一句话建议:核对Nginx配置的uwsgi_pass路径和uwsgi启动的socket路径是否完全一致,并确保socket文件对www-data用户可读写。

用 socket 文件进行通信呢?

“无法连接服务器”是浏览器给出的提示(浏览器无法连接 nginx )
还是 nginx 给出的提示( nginx 无法连接 uwsgi )


Nginx 没有错误日志 🤔🤔🤔
<br>access.log<br>223.72.97.144 - - [11/Apr/2018:11:06:17 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.5"<br>223.72.97.144 - - [11/Apr/2018:11:06:21 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.5"<br>^[[A^C<br>(venv) ubuntuVM-49-116-ubuntu:/var/log/nginx$ tail -10f error.log<br>^C<br>(venv) ubuntuVM-49-116-ubuntu:/var/log/nginx$ ll error.log<br>-rw-r----- 1 www-data adm 0 Apr 10 01:45 error.log<br>

解决了, 通过 sudo nginx -t 测试 Nginx:
Nginx 的 error.log 无权限, /var/nginx/pid 无权限
都给了个 664 权限,
不知道为什么, Nginx 的 access.log 可以, error.log 却没权限

回到顶部