Nginx 为 Flask 应用提供静态文件 404

Nginx 为 Flask 应用提供静态文件 404

我尝试了其他帖子中的许多解决方案,但似乎对我都不起作用,404当我尝试让nginx我的flask应用程序提供静态文件时,我总是会出错。在尝试运行它的所有过程中,我也遇到了一个403,但我无法重建它。这是我当前的设置:

该应用程序位于:~/development/Python/flask_nginx_gunicorn/,它应该是一个测试项目,用于让所有内容运行、了解 nginx 等。它具有以下结构:

项目结构

所以除了一个名为的文件之外,没有什么别的东西,它在文件夹中app.py配置了一些路线和一个。index.htmlstatic

我的配置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

我的猜测如下:

  1. 不知何故nginx没有被谈论并且它不知道对静态文件夹内容的请求。
  2. 不知何故,路径仍然不正确。
  3. 还有一些其他问题阻止它获取浏览器的文件并使其无法记录该文件。

我已经尝试让它运行了两天,但我发现的所有配置都不适合我。我还尝试了以下两个命令,它们是在其他地方建议的:

  1. 递归地更改目录的安全上下文:

    chcon -Rt httpd_sys_content_t /home/xiaolong/development/Python/flask_nginx_gunicorn/

  2. 允许 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/您带到静态内容。

相关内容