我有点为难。我编写了一个自定义 PHP MVC 框架,并在其基础上构建了一个 CMS。我决定也尝试一下 nginx+fpm。这就是我为难的根源。有人要求我将一个 wordpress 博客合并到我的网站中(是的)。它包含大量内容,在如此短的时间内将所有内容都放入我的 CMS 中是不可行的。由于使用 Apache 多年,我承认,在使用 nginx 时有点不知所措。
我的网站有以下文件路径:
/opt/directories/mysite/public/
wordpress 文件位于:
/opt/directories/mysite/news/
我知道我只需要设置以 /news[/*] 为目标的位置,然后将所有匹配的 URI 强制到其中的 index.php。有人能给我指出正确的方向吗?
我的配置如下:
server {
listen 80;
server_name staging.mysite.com
index index.php;
root /opt/directories/mysite/public;
access_log /var/log/nginx/mysite/access.log;
error_log /var/log/nginx/mysite/error.log;
add_header X-NodeName directory01;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
try_files $uri $uri/ /index.php?route=$uri&$args;
}
location ~ /news {
try_files $uri $uri/ @news;
}
location @news {
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_split_path_info ^(/news)(/.*)$;
fastcgi_param SCRIPT_FILENAME /opt/directories/mysite/news/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
include fastcgi_params;
include php.conf;
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
access_log off;
expires 30d;
}
## Disable viewing .htaccess & .htpassword
location ~ /\.ht {
deny all;
}
}
我的 php.conf 文件:
location ~ \.php {
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_NAME $fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$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 GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
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_pass unix:/tmp/php-fpm.sock;
# If you must use PATH_INFO and PATH_TRANSLATED then add
# the following within your location block above
# (make sure $ does not exist after \.php or /index.php/some/path/ will not match):
#fastcgi_split_path_info ^(.+\.php)(/.+)$;
#fastcgi_param PATH_INFO $fastcgi_path_info;
#fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}
fastcgi_params 文件:
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
非常感谢@Kromey,我已经调整了我的位置/新闻/,但仍然没有得到想要的结果。
当我发现我的 php 位置首先被匹配时,我能够学会跟踪 ~ 我的 /news 位置。
通过此设置,我现在获得了 200 状态,但页面为空白。有什么想法吗?
答案1
这实际上非常简单,并且比 Apache 上 Wordpress 的类似设置紧凑得多(我运行了 2 个 Wordpress 博客,之前都在 Apache 上,最近都迁移到了 nginx+PHP(不是 FPM,虽然我确实运行了一段时间,后来才决定对我的低流量网站来说它有点大材小用))。
location /news/ {
#Need a new root to point to your "aliased" directory
root /opt/directories/news
# This is cool because no php is touched for static content
try_files $uri $uri/ /index.php;
}
正如评论所暗示的,任何存在于 Wordpress 路径中的静态内容(图像、CSS、JavaScript、robots.txt 等)都会直接提供,无需 PHP 参与;一切否则将被路由至index.php。
请注意,该try_files
指令是半新的(我认为是 0.8?),因此您可能必须升级您的 nginx;当我从 Ubuntu apt 存储库安装时,版本太旧了,无法执行此操作,并且配置非常复杂,所以我apt-get remove
这样做了并从源代码安装了 nginx(一个相当简单的操作)。