我有一个 docker 容器,它在端口上运行一个 php fastcgi 应用程序9000
。
根路径安装在/var/www/my_app
并包含所有资产,如图像和 javascript。
我想使用 nginx 作为反向代理。我当前的 nginx 配置文件如下所示:
server {
listen 80;
server_name my_app.example.org;
root /var/www/my_app;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_intercept_errors on;
fastcgi_index index.php;
fastcgi_pass my_app_upstream;
include fastcgi_params;
}
}
不幸的是,这不起作用。我收到所有网站/资源的 404 错误。
我可以通过将配置文件更改为以下内容来修复此问题:
server {
(...)
root /var/www/html; #changed
index index.php index.html index.htm;
location / {
root /var/www/my_app/; #changed
}
(...)
}
为什么它的表现如此奇怪?第二种方法安全吗?
答案1
因此,您的上游对相同文件具有不同的根路径。您所做的是将/var/www/my_app/
静态文件(由nginx
实例提供服务)的根路径设置为,并将FastCGI 实例的根路径设置$document_root
为。/var/www/html
您说它正在运行,因此您的静态文件必须在 下可用/var/www/my_app/
,并且您的 PHP 文件必须在 下可用/var/www/html
。
像这样构造可能更有意义:
server {
...
root /var/www/my_app;
location / {
...
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
root /var/www/html;
}
}
FastCGI 的特殊根是硬连线的,但在检查文件是否存在之前不会try_files
使用将不受控制的请求传递给 PHP。