我正在按照这个在Ubuntu 16-04上部署一个烧瓶应用程序(简单的hello world)。 digital Ocean tutorial
一切正常,直到测试uWSGI服务。之后我按照描述的步骤进行操作,当我最终到达底部并检查服务器IP地址时,我得到了:
502 Bad Gateway
好的。我搜索并检查了我的错误日志,我得到了: -
2017/01/16 05:29:27 [crit] 20714#20714: *2 connect() to unix:/home/sajjan/project/project.sock failed (2: No such file or directory) while connecting to upstream, client: xx.9.xxx.xxx, server: 138.xxx.xx.xxx, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/home/sajjan/project/project.sock:", host: "xx.xx.xx.xx"
因此,在获取错误日志后,我手动创建了project.sock文件。再次转到服务器IP地址然后相同的错误“502 Bad Gateway”
再次检查错误日志并找到了这个
2017/01/16 06:07:11 [crit] 20874#20874: *1 connect() to unix:/home/sajjan/project/project.sock failed (13: Permission denied) while connecting to upstream, client: 47.9.237.113, server: XX.XX.XX.XX, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/home/sajjan/project/project.sock:", host: " XX.XX.XX.XX "
我想出了权限问题并使用以下命令更改权限
sudo chmod 666 project.sock
现在我检查了权限(使用ls -l filename)
-rw-rw-rw- 1 root root 0 Jan 16 05:31 project.sock
现在我回去查看服务器的IP,但发现了相同的“502 Bad Gateway”。我再次检查了错误日志,发现了这个:
017/01/16 06:13:31 [error] 20897#20897: *6 connect() to unix:/home/sajjan/project/project.sock failed (111: Connection refused) while connecting to upstream, client: 47.9.237.113, server: XX.XX.XX.XX, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://unix:/home/sajjan/project/project.sock:", host: " XX.XX.XX.XX ", referrer: "http:// XX.XX.XX.XX /"
我用Google搜索了上面的错误,在过去的两天里看了很多,但似乎没什么可以帮我的。我检查了这些答案,但没有帮助stackanswer-1 stackanswer-2和这些我检查了所有的数字海洋社区线程,但似乎没有任何工作。
我完全是服务器的开端,并不太了解ubuntu。如果你能帮助我找出我做错了什么或建议一些更好的教程/方法来部署我的烧瓶应用程序,那么我会很高兴。
这些是我的文件
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "<h1 style='color:blue'>Hello There!</h1>"
if __name__ == "__main__":
app.run(host='0.0.0.0')
[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = /home/sajjan/project/project.sock
chmod-socket = 660
vacuum = true
die-on-term = true
from hello import app
if __name__ == "__main__":
app.run()
server {
listen 80;
server_name 138.197.28.107;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/sajjan/project/project.sock;
}
}
当我运行命令时:
sudo service uwsgi restart
输出:
Failed to restart wsgi.service: Unit wsgi.service not found.
而输出
sudo service nginx status/restart
然后这表明nginx正在运行。
帮助我,如果您想知道其他任何事情,请告诉我。谢谢
编辑:
我创建了一个project.service文件,其内容是:
[Unit]
Description=uWSGI instance to serve project
After=network.target
[Service]
User=sajjan
Group=www-data
WorkingDirectory=/home/sajjan/project
Environment="PATH=/home/sajjan/project/venv/bin"
ExecStart=/home/sajjan/project/venv/bin/uwsgi --ini project.ini
[Install]
WantedBy=multi-user.target
我想我必须在命令下运行:
sudo systemctl start project
输出是:
Warning: project.service changed on disk. Run 'systemctl daemon-reload' to reload units.
当我跑
sudo systemcl reload project
然后输出:
Failed to reload project.service: Job type reload is not applicable for unit project.service.
See system logs and 'systemctl status project.service' for details.
当我检查“systemctl status project.service”时
● project.service - uWSGI instance to serve project
Loaded: loaded (/etc/systemd/system/project.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Mon 2017-01-16 17:49:29 UTC; 6min ago
Main PID: 27157 (code=exited, status=203/EXEC)
Jan 16 17:49:29 learningwithpython systemd[1]: Started uWSGI instance to serve project.
Jan 16 17:49:29 learningwithpython systemd[1]: project.service: Main process exited, code=exited, status=203/EXEC
Jan 16 17:49:29 learningwithpython systemd[1]: project.service: Unit entered failed state.
Jan 16 17:49:29 learningwithpython systemd[1]: project.service: Failed with result 'exit-code'.
我使用指南遇到了同样的问题。据我读过; 502坏网关是Nginx无法正确连接到uwsgi的症状。更改套接字的权限解决了我的问题。
sudo chmod 777 /home/sajjan/project/project.sock
sudo systemctl restart nginx
777的情况有点过分,但它是一种快速而肮脏的方式来验证它是否实际上是权限问题
Nginx无权写入套接字。用下面的命令授予适当的模式,帮助了我。
chmod 0755 /to/project
尝试运行sudo /etc/init.d/nginx start
然后尝试打开http://server_domain_or_IP
如果有效,请键入which uwsgi
以找到正确的uwsgi路径并更改“/etc/systemd/system/myproject.service”
更改
Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
ExecStart=/home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini
进入真正的道路而不是env路径。
我通过这些命令找出了这个问题。
同样的问题。
但我给了666许可并重新启动所有,它的工作原理。
我认为错误日志只显示问题的可能原因。虽然,journalctl -u <yourproject>.service
命令有助于提出另一个原因。
我的错误日志也告诉我他找不到“myproject.socket”。但.ini已经帮助我们构建了它。然后我得到这个错误:myproject.service:步骤USER产生失败〜/ bin / uwsgi:没有这样的过程
也许这是许可的问题。
尝试运行myapp/bin/uwsgi --ini myapp.ini
以查看阻止uwsgi运行的实际错误。
在我的情况下.ini配置文件中的5个进程要处理我的cpu,这是我的错误输出。
your processes number limit is 3900
your memory page size is 4096 bytes
detected max file descriptor number: 1024
如果是这种情况,可以将.ini文件中的进程数减少到2。
正如许多人已经提到的,502错误是关于套接字权限(您可能会在Permission denied
中看到/var/log/nginx/error.log
错误)。但是,这一切似乎都必须起作用
your_user:www-data
www-data:www-data
一起使用(它在nginx .conf文件中配置)真正的问题是nginx无法连接到主目录中的套接字!
因此解决方案很简单 - 只需将套接字文件移动到其他位置即可。例如,到/tmp/
或/var/www/...
文件夹。
解:
创建目录
sudo mkdir /var/www/your_project
sudo chown your_user:www-data /var/www/your_project
修改your_project.ini
socket = /var/www/your_project/your_project.sock
修改nginx服务器块
uwsgi_pass unix:///var/www/your_project/your_project.sock;
重启uWSGI和nginx
sudo systemctl restart your_project_service
sudo systemctl restart nginx
这一切都必须现在工作。