python-3.x-使用gunicorn nginx的服务烧瓶应用程序显示404 [ec2]

前端之家收集整理的这篇文章主要介绍了python-3.x-使用gunicorn nginx的服务烧瓶应用程序显示404 [ec2] 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在尝试通过遵循此digitalocean tutorial提供简单的API.

为了进行测试,我之前是通过gunicorn为API提供服务的,

  1. $gunicorn --bind 0.0.0.0:5000 trumporate.wsgi:app

卷曲API端点在ec2框内起作用

  1. $curl -X GET http://0.0.0.0:5000/api/v1/trump/rant/
  2. {
  3. "foo": "bar"
  4. }

现在,我通过提供系统服务将这种gunicorn流程转换为在启动时运行

  1. # /etc/systemd/system/trumporate.service
  2. [Unit]
  3. Description=Gunicorn instance for trumporate
  4. After=network.target
  5. [Service]
  6. User=ubuntu
  7. Group=www-data
  8. WorkingDirectory=/var/opt/trumporate
  9. ExecStart=/usr/local/bin/gunicorn --workers 3 --bind unix:trumporate.sock -m 007 --access-logfile /var/log/trumporate/gunicorn-access.log --error-logfile /var/log/trumporate/gunicorn-error.log trumporate.wsgi:app
  10. [Install]
  11. WantedBy=multi-user.target

我已经创建了文件

> /var/log/trumporate/gunicorn-error.log
> /var/log/trumporate/gunicorn-access.log

并将所有权和组更改为ubuntu

启用服务并重新启动后,我检查了状态

  1. $sudo systemctl status trumporate.service
  2. trumporate.service - Gunicorn instance for trumporate
  3. Loaded: loaded (/etc/systemd/system/trumporate.service; enabled; vendor preset: enabled)
  4. Active: active (running) since Wed 2017-05-03 06:30:26 UTC; 1h 2min ago
  5. Main PID: 1122 (gunicorn)
  6. Tasks: 4
  7. Memory: 92.2M
  8. cpu: 1.390s
  9. CGroup: /system.slice/trumporate.service
  10. ├─1122 /usr/bin/python3 /usr/local/bin/gunicorn --workers 3 --bind unix:trumporate.sock -m 007 --access-logfile /var/log/trumporate/gunicorn-access.log --error-logfile /var/log/trumporate/gunic
  11. ├─1264 /usr/bin/python3 /usr/local/bin/gunicorn --workers 3 --bind unix:trumporate.sock -m 007 --access-logfile /var/log/trumporate/gunicorn-access.log --error-logfile /var/log/trumporate/gunic
  12. ├─1266 /usr/bin/python3 /usr/local/bin/gunicorn --workers 3 --bind unix:trumporate.sock -m 007 --access-logfile /var/log/trumporate/gunicorn-access.log --error-logfile /var/log/trumporate/gunic
  13. └─1267 /usr/bin/python3 /usr/local/bin/gunicorn --workers 3 --bind unix:trumporate.sock -m 007 --access-logfile /var/log/trumporate/gunicorn-access.log --error-logfile /var/log/trumporate/gunic
  14. May 03 06:30:26 ip-172-31-25-173 systemd[1]: Started Gunicorn instance for trumporate.

遵循DO教程之后,我尝试将Nginx配置为代理端口80上的传入请求

  1. $cat /etc/Nginx/sites-available/trumporate
  2. server {
  3. listen 80;
  4. server_name private_ip_address;
  5. location / {
  6. include proxy_params;
  7. proxy_pass http://unix:/var/opt/trumporate/trumporate.sock;
  8. }
  9. }

然后做了一个

$ln -s / etc / Nginx / sites-available / trumporate / etc / Nginx / sites-enabled

  1. $sudo Nginx -t
  2. Nginx: the configuration file /etc/Nginx/Nginx.conf Syntax is ok
  3. Nginx: configuration file /etc/Nginx/Nginx.conf test is successful

现在,如果我尝试从ec2框外向API端点执行GET请求

  1. $curl -X GET http://public_ip/api/v1/trump/rant
  2. <html>
  3. <head><title>404 Not Found</title></head>
  4. <body bgcolor="white">
  5. <center><h1>404 Not Found</h1></center>
  6. <hr><center>Nginx/1.10.0 (Ubuntu)</center>
  7. </body>
  8. </html>

同样的情况,当我尝试从ec2容器内部执行时

  1. $curl -X GET http://localhost:80/api/v1/trump/rant/
  2. <html>
  3. <head><title>404 Not Found</title></head>
  4. <body bgcolor="white">
  5. <center><h1>404 Not Found</h1></center>
  6. <hr><center>Nginx/1.10.0 (Ubuntu)</center>
  7. </body>
  8. </html>

日志文件

  1. # /var/log/Nginx/access.log
  2. dev_Box_ip - - [03/May/2017:05:50:45 +0000] "GET /api/v1/trump/rant/ HTTP/1.1" 404 580 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/58.0.3029.81 Safari/537.36"
  3. 127.0.0.1 - - [03/May/2017:06:13:26 +0000] "GET /api/v1/trump/rant/ HTTP/1.1" 404 178 "-" "curl/7.47.0"
  4. dev_Box_ip - - [03/May/2017:07:42:42 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/58.0.3029.81 Safari/537.36"
  5. /var/log/Nginx$cat error.log
  6. /var/log/Nginx$
  7. /var/log/trumporate$cat gunicorn-access.log
  8. /var/log/trumporate$
  9. $cat gunicorn-error.log
  10. [2017-05-03 06:28:41 +0000] [1884] [INFO] Starting gunicorn 19.7.1
  11. [2017-05-03 06:28:41 +0000] [1884] [INFO] Listening at: unix:trumporate.sock (1884)
  12. [2017-05-03 06:28:41 +0000] [1884] [INFO] Using worker: sync
  13. [2017-05-03 06:28:41 +0000] [1889] [INFO] Booting worker with pid: 1889
  14. [2017-05-03 06:28:41 +0000] [1890] [INFO] Booting worker with pid: 1890
  15. [2017-05-03 06:28:41 +0000] [1891] [INFO] Booting worker with pid: 1891
  16. [2017-05-03 06:29:48 +0000] [1884] [INFO] Handling signal: term
  17. [2017-05-03 06:29:48 +0000] [1889] [INFO] Worker exiting (pid: 1889)
  18. [2017-05-03 06:29:48 +0000] [1890] [INFO] Worker exiting (pid: 1890)
  19. [2017-05-03 06:29:48 +0000] [1891] [INFO] Worker exiting (pid: 1891)
  20. [2017-05-03 06:29:49 +0000] [1884] [INFO] Shutting down: Master
  21. [2017-05-03 06:30:27 +0000] [1122] [INFO] Starting gunicorn 19.7.1
  22. [2017-05-03 06:30:27 +0000] [1122] [INFO] Listening at: unix:trumporate.sock (1122)
  23. [2017-05-03 06:30:27 +0000] [1122] [INFO] Using worker: sync
  24. [2017-05-03 06:30:27 +0000] [1264] [INFO] Booting worker with pid: 1264
  25. [2017-05-03 06:30:27 +0000] [1266] [INFO] Booting worker with pid: 1266
  26. [2017-05-03 06:30:28 +0000] [1267] [INFO] Booting worker with pid: 1267
  27. /var/log/trumporate$

编辑

Flask应用程序的相关部分

  1. @app.route('/api/v1/trump/rant/')
  2. def return_rant():
  3. foo = # logic
  4. return jsonify(rant=foo)
最佳答案
您是否做了Nginx -s reload&& systemctl重启Nginx

您可以尝试的另一件事是在http端口而不是套接字上进行绑定:

  1. --bind 127.0.0.1:6767 #in systemd config

并如下更改Nginx配置:

  1. location / {
  2. include proxy_params;
  3. proxy_redirect off;
  4. proxy_pass http://127.0.0.1:6767;
  5. }

另外,为什么在Nginx配置中有private_ip?

  1. server_name private_ip_address;

更改为

  1. server_name "_";
  2. # OR
  3. server_name PUBLIC_IP;

并从/ etc / Nginx / site-enabled中删除所有默认配置

1) use of server_name private_ip_address;?

Nginx使用server_name来检查传入请求的主机头,它不是私有地址. (您通常使用域名或URL栏中的公共地址访问)

2) I deleted /etc/Nginx/site-enabled/default dir to make things to get to working.

如果您的server_name设置不正确,Nginx将使用默认文件或包含default_server的服务器块处理请求.因此,我要求您删除文件,以防万一您的服务器名称^ _ ^有问题

Also,what difference would it make to the performance of the API if I am binding it to a port instead of the socket file as suggested by the blog post?

这通常是过早的优化,与flask / python尤其是数据库连接引起的瓶颈相比,您得到的任何差异都将在误差范围之内.尽管请带一点盐,但我没有可靠的消息来源可以引用.

猜你在找的Nginx相关文章