You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx代理uWSGI Socket时域名无法访问(AWS EC2 Ubuntu环境)

AWS EC2 Ubuntu 22.04 下 uWSGI + Nginx 配置权限与访问问题

环境与初始测试

  • 服务器:Amazon EC2,Ubuntu 22.04
  • 项目:基于虚拟环境的uWSGI应用,存放在sudo用户ubuntu的主目录,测试代码如下:
def application(environ, start_response):
   start_response('200 OK', [('Content-Type', 'text/html')])
   return [b"<h1 style='color:blue'>Hello There!</h1>"]
  • 初始验证:执行命令uwsgi --socket 0.0.0.0:8080 --protocol=http -w main启动应用,AWS安全组开放8080端口后,可通过IP+端口正常访问。

配置详情

uWSGI配置文件(uwsgi.ini)

[uwsgi]
socket = main.sock
chmod-socket = 664
protocol = http
module = main
chdir = /home/ubuntu/operatorAPI
master = true
processes = 5
vacuum = true
die-on-term = true
logto = /home/ubuntu/operatorAPI/log/uwsgi_operator_api.log

systemd服务文件(/etc/systemd/system/operator_api.service)

[Unit]
Description=uWSGI instance to serve operator api
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/operatorAPI
Environment="PATH=/home/ubuntu/operatorAPI/venv/bin"
ExecStart=/home/ubuntu/operatorAPI/venv/bin/uwsgi --ini uwsgi.ini

[Install]
WantedBy=multi-user.target

Nginx站点配置

server {
    listen 80;
    server_name uniapi.example.com;

    access_log /home/ubuntu/operatorAPI/log/nginx_access.log; 
    error_log /home/ubuntu/operatorAPI/log/nginx_error.log;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/ubuntu/operatorAPI/main.sock;
    }
}

问题现象

重启Nginx并启动operator_api服务后,域名uniapi.example.com无法访问,Nginx错误日志显示:

2023/11/22 12:56:03 [crit] 48800#48800: *126 connect() to unix:/home/ubuntu/operatorAPI/main.sock failed (13: Permission denied) while connecting to upstream, client: *****, server: uniapi.example.com, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/home/ubuntu/operatorAPI/main.sock:", host: "uniapi.example.com"

已确认Socket文件已创建,且权限为664。

后续尝试将uWSGI配置改为socket = 0.0.0.0:44444,开放EC2安全组对应端口后,IP+44444可正常访问,但修改Nginx的uwsgi_pass为0.0.0.0:44444;后,域名仍无法访问,即使将服务用户改为root也无效。此前在其他主机环境下可正常配置,疑问:AWS环境是否需要额外操作?

解决方案

解决Unix Socket权限拒绝问题

  1. 修复目录访问权限:Nginx进程需要能进入/home/ubuntu/operatorAPI目录,执行以下命令给www-data组添加目录执行权限:
chmod g+x /home/ubuntu/operatorAPI
  1. 调整Socket归属或权限:
    • 方案一:在uWSGI配置文件中添加chown-socket = ubuntu:www-data,确保Socket文件归www-data组所有,配合已设置的664权限,Nginx即可正常读取;
    • 方案二:临时测试可将chmod-socket改为666(不推荐用于生产环境);
    • 方案三:修改Nginx配置(/etc/nginx/nginx.conf)中的用户行,将Nginx加入ubuntu组:user www-data ubuntu;,修改后重启Nginx:systemctl restart nginx。

解决TCP端口模式下域名无法访问问题

  1. 检查EC2安全组:确保安全组允许80端口的入站流量(域名访问走80端口,而非uWSGI的44444端口),规则设置为允许0.0.0.0/0或指定客户端IP;
  2. 验证本地防火墙:Ubuntu 22.04默认启用ufw,执行以下命令允许80端口:
ufw allow 80/tcp
  1. 检查Nginx监听配置:确保Nginx监听所有接口,可将listen 80;改为listen 0.0.0.0:80;,执行nginx -t验证配置语法,无误后重启Nginx;
  2. 确认uWSGI监听范围:执行netstat -tulpn | grep 44444,确保uWSGI监听的是0.0.0.0:44444而非仅127.0.0.1:44444;
  3. 验证DNS解析:执行nslookup uniapi.example.com,确认域名已正确解析到EC2的公网IP。

内容的提问来源于stack exchange,提问作者cheerful_weasel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:53:24