django- nginx: [emerg] open() "/etc/nginx/proxy_params" 在 /etc/nginx/sites-enabled/myproje

Posted

技术标签:

【中文标题】django- nginx: [emerg] open() "/etc/nginx/proxy_params" 在 /etc/nginx/sites-enabled/myproject:11 中失败(2:没有这样的文件或目录)【英文标题】:django- nginx: [emerg] open() "/etc/nginx/proxy_params" failed (2: No such file or directory) in /etc/nginx/sites-enabled/myproject:11 【发布时间】:2017-07-24 04:58:11 【问题描述】:

我尝试使用 this tutorial 部署一个带有 nginx 和 Gunicorn 的 django 项目。我做了所有待办事项,但是,当我使用以下代码创建 /etc/nginx/sites-available/myproject 文件时:

server 
listen 80;
server_name server_domain_or_IP;

location = /favicon.ico  access_log off; log_not_found off; 
location /static/ 
    root /home/sammy/myproject;


location / 
    include proxy_params;
    proxy_pass http://unix:/home/sammy/myproject/myproject.sock;
 

然后运行sudo nginx -t 查找错误,我得到这个错误:

nginx: [emerg] open() "/etc/nginx/proxy_params" failed (2: No such file or directory) in /etc/nginx/sites-enabled/myproject:11
nginx: configuration file /etc/nginx/nginx.conf test failed

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

proxy_params 99% 的时间(根据我的经验)您的路径是错误的,proxy_params 文件的默认位置是/etc/nginx/proxy_params,但这对您来说似乎不一样.

proxy_params 文件包含以下内容:

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

这些参数用于将信息转发到您要代理的应用程序。我使用过没有proxy_params 文件的旧CentOS 服务器,我没有自己创建一个,而是直接包含这些参数;和位置块看起来像这样:

location / 
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass http://unix:/home/sammy/myproject/myproject.sock;
 

所以这取决于你。如果文件存在于其他位置,只需将其包含在正确的位置:

include /path/to/proxy_params

否则,您可以将参数直接包含在位置块中(就像我在上面所做的那样)

或者自己创建一个并将其放在/etc/nginx 中(如果您想坚持使用当前代码)

【讨论】:

proxy_set_header Host $http_host; 而不是 proxy_set_header Host $host; 是我需要的。我在一个运行良好的 docker 容器中运行它,除非我出于身份验证原因重定向。【参考方案2】:

在ubuntu上安装nginx时,正常情况下有proxy_params,路径为/etc/nginx/proxy_params。但是您的 ubuntu 没有它,所以制作 proxy_params 或添加 proxy_params 具有的代码是很好的解决方案,正如 danidee 回答的那样。

这一次,我制作了包含 nginx 和 alpine 的 docker 容器,这是 linux 发行版之一。但它没有 proxy_params 与 danidee 使用的 old CentOS 相同。所以我添加了proxy_params的代码,这比制作proxy_params更简单。

似乎某些 linux 发行版或某些旧的 linux 发行版可能没有proxy_params

另外,我见过你以前用过的the tutorial。对于nginx配置,你最好在/etc/nginx/conf.d/myproject.conf处只做一个myproject.conf(不要忘记myproject后面的.conf。没有.conf的文件nginx是找不到的)。在这种情况下,您不需要在/etc/nginx/sites-available/myproject/etc/nginx/sites-enabled/myproject 创建两个文件。

【讨论】:

【参考方案3】:

就我而言,我在目录/etc/nginx/sites-enabled 中有一个名为myproject 的文件。但是我在/etc/nginx/sites-available 目录中没有名为myproject 的文件。而且我实际上不需要那个 myproject 文件,因为我不是故意创建的。

所以我刚刚使用sudo rm myproject/etc/nginx/sites-enabled 目录中删除了myproject 文件,瞧!现在sudo nginx -t成功了!

【讨论】:

以上是关于django- nginx: [emerg] open() "/etc/nginx/proxy_params" 在 /etc/nginx/sites-enabled/myproje的主要内容,如果未能解决你的问题,请参考以下文章

如何更正'nginx:[emerg]“流”指令在这里不允许'

centos6.5腾讯云django环境部署---2Gunicorn+Django+nginx+mysql部署

[emerg]: getpwnam(“nginx”) failed

nginx - nginx:[emerg] bind()到[::]:80失败(98:地址已经在使用中)

启动Nginx报错nginx: [emerg] getpwnam(

Nginx 启动提示 [emerg] 配置中没有“事件”部分