Django(uWSGI)和 php(fastcgi)NGINX

Django(uWSGI)和 php(fastcgi)NGINX

我是服务器配置新手,在使用 nginx 上的 UWSGI 让 php 与我的 django 应用协同工作时遇到了问题。使用 uwsgi 时,Django 运行良好,当我删除 django 站点配置时,php 运行良好,但是当我同时使用 django 和 php 时,php 文件不起作用(浏览器只会下载它们),有什么想法吗(请具体说明,我是这方面的新手)?我愿意听取建议,现在有点绝望了。谢谢

这是我的 django-site nginx 配置文件:

# mysite_nginx.conf
####################

# the upstream component nginx needs to connect to
upstream django {
# server unix:///home/appdeploy/uwsgi-tutorial/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}

# configuration of the server
server {
# the port your site will be served on
listen      80;
# the domain name it will serve for
server_name 173.10.235.37; # substitute your machine's IP address or FQDN
charset     utf-8;

# max upload size
client_max_body_size 75M;   # adjust to taste

# Django media
location /media  {
    alias /home/appdeploy/v1/website/media;
  # your Django project's media files - amend as required
}

location /static {
    alias /home/appdeploy/v1/website/static;
  # your Django project's static files - amend as required
}

# Finally, send all non-media requests to the Django server.
location / {
    uwsgi_pass  django;
    include     /home/appdeploy/v1/website/uwsgi_params; # the uwsgi_params file you             installed
}
error_page  404              /404.html;
location = /404.html {
  root /home/appdeploy/v1; ## or whereever You put it - will not be needed if 404.html    is where index.html is placed
}

}

以下是我正在运行的默认 conf 文件(使用 php fast cgi):

# default.conf

server {
listen       80;
server_name  localhost;

#charset koi8-r;
#access_log  /var/log/nginx/log/host.access.log  main;

location / {
    root   /home/appdeploy/v1/website;
    index  index.html index.htm index.php;
}

#error_page  404              /404.html;

# redirect server error pages to the static page /50x.html
#
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
#    proxy_pass   http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
#    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /home/appdeploy/v1/website$fastcgi_script_name;
    include        fastcgi_params;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
#    deny  all;
#}
}

答案1

从我在您的配置中看到的情况来看,PHP 不再受到管理,这会导致页面被下载。

在工作中,有一个 PHP 解释器定义在这里:

location ~ \.php$ {
#    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /home/appdeploy/v1/website$fastcgi_script_name;
    include        fastcgi_params;
}

在新的版本中,没有针对 php 页面的特定参数。仅适用于默认根:

location / {
    uwsgi_pass  django;
    include     /home/appdeploy/v1/website/uwsgi_params; # the uwsgi_params file you             installed
}

如果你尝试这个配置,它应该可以工作:

    location / {
    #uwsgi_pass  django;
    fastcgi_pass   127.0.0.1:9000;
    include     /home/appdeploy/v1/website/uwsgi_params; # the uwsgi_params file you             installed
}

(确保 fastcgi 进程监听端口 9000。如果它使用套接字,请输入套接字路径而不是 127.0.0.1:9000)。如果一切正常,请告知我们。

第2部分

您的 phpcgi 进程是如何管理的,通过文件(套接字)还是 Web 端口套接字?

我错过了你帖子中的一些内容,nginx 配置;

upstream django {
# server unix:///home/appdeploy/uwsgi-tutorial/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}

执行 lsof -i:8001,如果有东西正在监听,那应该是 fastcgi 进程。

如果是,您可以尝试这个配置吗(如果它没有出现在 nginx 配置中,则添加它)?

location ~ \.php$ {
fastcgi_pass   127.0.0.1:8001;
fastcgi_index  index.php; 
# or your index name
fastcgi_param  SCRIPT_FILENAME  /home/appdeploy/v1/website$fastcgi_script_name;
include        fastcgi_params;
}

如果没有,你的服务器可能使用了 cgi socket。你可以检查 socket 文件是否存在:

ps aufx | grep mysite.sock

在这种情况下,取消注释上游的第一行并注释第二行:

upstream django {
server unix:///home/appdeploy/uwsgi-tutorial/mysite/mysite.sock; # for a file socket
# server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}

并修改先前的 php 块为:

location ~ \.php$ {
fastcgi_pass   django;
fastcgi_index  index.php; 
# or your index name
fastcgi_param  SCRIPT_FILENAME  /home/appdeploy/v1/website$fastcgi_script_name;
include        fastcgi_params;
}

必须启动此套接字,请检查它们是否位于 /etc/init.d/ 文件夹中

如果有效请告诉我。

答案2

我认为这里的问题出在您的 server_name 配置条目上,它指定了应匹配以使用特定配置的域名。

PHP 的默认配置仅适用于 localhost,而 Django 配置适用于您指定的 IP 地址。

我假设您想在同一个虚拟主机/网站上运行 PHP/Django。然后您需要在与 Django 配置相同的配置中应用 PHP 位置块,然后确保您的 server_name 设置已被注释掉或与您的网站域匹配。

然后您必须禁用其他配置。

相关内容