我尝试了其他帖子中的许多解决方案,但似乎对我都不起作用,404
当我尝试让nginx
我的flask
应用程序提供静态文件时,我总是会出错。在尝试运行它的所有过程中,我也遇到了一个403
,但我无法重建它。这是我当前的设置:
该应用程序位于:~/development/Python/flask_nginx_gunicorn/
,它应该是一个测试项目,用于让所有内容运行、了解 nginx 等。它具有以下结构:
所以除了一个名为的文件之外,没有什么别的东西,它在文件夹中app.py
配置了一些路线和一个。index.html
static
我的配置nginx
如下:
/etc/nginx/nginx.conf
内容如下:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
最后有一个包含sites-enabled
子目录的文件。在该目录中,我有一个名为的文件flask_project
。在该文件中,我的项目有以下配置:
server {
root /home/xiaolong/development/Python/flask_nginx_gunicorn/;
server_name localhost;
# LISTENING ON WHICH PORTS?
listen localhost:7777;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /static/ {
autoindex on;
root /home/xiaolong/development/Python/flask_nginx_gunicorn/;
}
}
我开始nginx
使用命令systemctl start nginx
。当它运行时,我执行了ps -aux | grep nginx
,我得到了以下输出:
root 17748 1.2 2.5 1607328 102772 pts/1 Sl 20:45 0:07 /usr/local/sublime_text_3/sublime_text /etc/nginx/nginx.conf
root 18762 0.0 0.0 122720 2880 ? Ss 20:53 0:00 nginx: master process /usr/sbin/nginx
nginx 18763 0.0 0.1 124808 7916 ? S 20:53 0:00 nginx: worker process
nginx 18764 0.0 0.1 124808 7916 ? S 20:53 0:00 nginx: worker process
nginx 18765 0.0 0.1 124808 7916 ? S 20:53 0:00 nginx: worker process
nginx 18766 0.0 0.1 124808 7916 ? S 20:53 0:00 nginx: worker process
root 18988 0.0 0.0 111032 1792 pts/0 S+ 20:54 0:00 tail -f 10 /var/log/nginx/error.log
root 19001 0.0 0.0 115820 2396 pts/1 S+ 20:55 0:00 grep --color=auto nginx
所以我知道它正在运行。我以前在日志中收到一个错误,告诉我nginx
无法绑定到特定端口,这是由于SELinux
只允许它绑定到某些端口造成的。我使用命令修复了这个问题semanage port --add --type http_port_t --proto tcp 7777
。
每次更改后我总是运行systemctl restart nginx
,以重新启动nginx
服务器,以便它可以重新加载其配置。
我用来gunicorn app:app -b localhost:8080
运行我的 flask 应用程序。
http://localhost:8080/static/
当我在浏览器中打开 URL 时,我得到了一个404
,并且我使用读取的日志tail -f 10 /var/log/nginx/error.log
表明没有新的错误。但是,Flask 应用程序正在运行,我可以通过以下方式验证:http://localhost:8080/
和http://localhost:8080/data
,它们都运行正常。但是,一旦静态目录中有静态内容,我就会得到404
。
我的猜测如下:
- 不知何故
nginx
没有被谈论并且它不知道对静态文件夹内容的请求。 - 不知何故,路径仍然不正确。
- 还有一些其他问题阻止它获取浏览器的文件并使其无法记录该文件。
我已经尝试让它运行了两天,但我发现的所有配置都不适合我。我还尝试了以下两个命令,它们是在其他地方建议的:
递归地更改目录的安全上下文:
chcon -Rt httpd_sys_content_t /home/xiaolong/development/Python/flask_nginx_gunicorn/
允许 http 守护进程使用网络连接(???)
setsebool -P httpd_can_network_connect 1
我的配置有什么问题?
附加信息
在我的/etc/nginx/
目录中,我有以下结构:
- 一个
nginx.conf
文件 sites-available
仅包含我的 flask 应用程序配置的子目录- 子目录
sites-enabled
包含指向我的 Flask 应用程序配置文件的链接sites-available
我正在Fedora 22
这里运行。
答案1
这件事已经过去一年多了,所以我相信你已经解决了这个问题,但万一其他人看到这个:
Nginx 正在监听localhost:7777
,但您的 URL 会将您带到 gunicorn 服务器所在的端口 8080。这就是您可以访问 Flask 应用程序(由 gunicorn 提供服务)但无法访问静态内容(由 ngninx 提供服务)的原因。这也是您在 nginx 日志中看不到任何内容的原因。如果您访问http://localhost:7777/
,nginx 应该会将您的请求传递到 Flask 应用程序,并将http://localhost:7777/static/
您带到静态内容。