我是服务器配置新手,在使用 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 设置已被注释掉或与您的网站域匹配。
然后您必须禁用其他配置。