[英]Nginx Symfony2 Staging Config
我正在尝试将 nginx 配置为为一个 symfony 项目的多个版本提供服务。
发布文件夹结构:
/var/www/my-project/releases/24/
/var/www/my-project/releases/46/
/var/www/my-project/releases/47/
我想调用一个像“http://my-server/my-project/release/47”这样的 URL,它应该访问服务器上的 /var/www/my-project/releases/47/web/app.php .
我现在尝试了一段时间,但找不到最终解决方案,任何帮助都会很棒!
我的最后一次尝试:
server {
server_name my-server;
location / {
# try to serve file directly, fallback to app.php
try_files $uri $uri$2app.php$is_args$args;
}
location ~ /my-project/release/([-a-zA-Z0-9]+)/app\.php(/|$) {
root /var/www/my-project/releases/$1/web;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/app.php;
fastcgi_param HTTPS off;
error_log /var/log/nginx/my-project_$1_error.log;
access_log /var/log/nginx/my-project_$1_access.log;
# Prevents URIs that include the front controller. This will 404:
# http://domain.tld/app.php/some-path
# Remove the internal directive to allow URIs like this
internal;
}
}
此配置产生以下错误:
[错误] 2272#0:*169 重写或内部重定向循环,同时内部重定向到“/my-project/release/47app.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.php”
您的server
容器中缺少root
指令—— /var/www
是您架构的默认设置吗? 否则,添加一个根指令:
root /var/www;
try_files
无法找到匹配项,并将通过向其附加app.php
来重写 URL。 生成的 URL 与您的其他位置块不匹配,因此它会一次又一次地被重写。
try_files
指令的最后一个术语是错误的。 你有$2
应该放在/web/
地方(可能是从之前的实验中继承的)。
使用try_files
进行一般重写是一个坏主意,因为任何错误输入的 URL 都可能导致重写循环。 尝试:
location / {
rewrite ^(/my-project/release/[-a-zA-Z0-9]+)$ $1/app.php;
}
我把配置改成这样:
server {
server_name my-server;
root /var/www;
location / {
rewrite ^(/my-project/release/[-a-zA-Z0-9]+)$ $1/app.php;
}
location ~ /my-project/release/([-a-zA-Z0-9]+)/app\.php(/|$) {
alias /var/www/my-project/releases/$1/web;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/app.php;
fastcgi_param HTTPS off;
error_log /var/www/my-project/releases/$1/app/logs/nginx_error.log;
access_log /var/www/my-project/releases/$1/app/logs/nginx_access.log;
# Prevents URIs that include the front controller. This will 404:
# http://domain.tld/app.php/some-path
# Remove the internal directive to allow URIs like this
internal;
}
}
现在像“ http://my-server/my-project/release/47 ”这样的调用正确指向“/var/www/my-project/releases/47/web/app.php”。
现在的问题是 url "my-project/release/47" 到达 symfony 路由器,它找不到到这个 url 的路由。
现在让 url 在浏览器中显示为“//my-server/my-project/release/47”但到达 symfony 为“//my-server/”的正确方法是什么?
谢谢大家的帮助,不幸的是我无法让它工作。 我想我必须了解更多关于 nginx 配置的信息才能处理这些问题,然后才能在生产中使用它。
我的问题的解决方法是为每个版本创建一个自己的 nginx conf。 该文件将在构建过程中创建,然后传输到网络服务器,复制到/etc/nginx/conf.d/[releasename].conf
并由sudo service nginx reload
激活。
当不再需要发布时,发布目录中的卸载脚本会删除源和配置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.