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权限拒绝问题
- 修复目录访问权限:Nginx进程需要能进入
/home/ubuntu/operatorAPI目录,执行以下命令给www-data组添加目录执行权限:
chmod g+x /home/ubuntu/operatorAPI
- 调整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。
- 方案一:在uWSGI配置文件中添加
解决TCP端口模式下域名无法访问问题
- 检查EC2安全组:确保安全组允许80端口的入站流量(域名访问走80端口,而非uWSGI的44444端口),规则设置为允许0.0.0.0/0或指定客户端IP;
- 验证本地防火墙:Ubuntu 22.04默认启用ufw,执行以下命令允许80端口:
ufw allow 80/tcp
- 检查Nginx监听配置:确保Nginx监听所有接口,可将
listen 80;改为listen 0.0.0.0:80;,执行nginx -t验证配置语法,无误后重启Nginx; - 确认uWSGI监听范围:执行
netstat -tulpn | grep 44444,确保uWSGI监听的是0.0.0.0:44444而非仅127.0.0.1:44444; - 验证DNS解析:执行
nslookup uniapi.example.com,确认域名已正确解析到EC2的公网IP。
内容的提问来源于stack exchange,提问作者cheerful_weasel
相关产品推荐
相关产品推荐

