[英]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.