2014-12-24 4 views
3

Я видел, что у многих людей возникла проблема с настройкой одного сервера nginx на несколько приложений symfony2. Тем не менее, никто не хотел того же самого и имел ту же проблему, что и я. Я хочу сделать несколько приложений в одном домене. Одно основное приложение ответит непосредственно на домен, а остальные будут в подкаталоге псевдонима. со схемой:nginx с несколькими приложениями symfony2

http://mydomain/   -> main app 
http://mydomain/subdir1 -> another app 
http://mydomain/subdir2 -> yet another app 

Я пытался сам сделать это, и главное приложение работает отлично. Но подкаталоги большую часть времени перехватываются основным приложением, которое выдает 404. Когда я пытаюсь добавить app.php в URL-адрес подкаталога (например, http://mydomain/subdir1/app.php/my/route), сервер возвращается 404.

Это то, что я до сих пор:

server { 
    listen 80; 
    server_name mydomain; 
    root /server/www/main-app/web; 

    location/{ 
     # try to serve file directly, fallback to app.php 
     try_files $uri /app.php$is_args$args; 
     # PROD 
     location ~ ^/app\.php(/|$) { 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      fastcgi_split_path_info ^(.+\.php)(/.*)$; 

      include fastcgi_params; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      fastcgi_param HTTPS off; 
     } 
    } 

    location /subdir1/ { 
     alias /server/www/other-app1/web; 
     # try to serve file directly, fallback to app.php 
     try_files $uri /server/www/other-app1/web/app.php$is_args$args; 
     # PROD 
     location ~ ^/other-app1/app\.php(/|$) { 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      fastcgi_split_path_info ^(.+\.php)(/.*)$; 

      include fastcgi_params; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      fastcgi_param HTTPS off; 
     } 
    } 
} 

Спасибо, что обратились за помощью!

EDIT 26/12/2014: Для тех, кто не понял, что именно я хочу: Я хочу разместить несколько приложений Symfony2 на такое же доменное имя без субдомена. Без субдомена я должен использовать подкаталог. До этого я пробовал nginx, я использовал Apache2, и было легко сделать трюк с Alias.

Я сделал больше поиска и узнал, что «псевдоним» и «try_files» не очень хорошие друзья (см. Этот отчет об ошибке: http://trac.nginx.org/nginx/ticket/97). Поэтому я активировал режим отладки и много тестов. Теперь я почти сделал это. Основные приложения больше не перехватывают подкаталоги, а остальные приложения отвечают. Но те другие приложения ответили на 404, поэтому я посмотрел их журналы. И я узнал, что они искали шаблон URL с подкаталогом в нем. Например, они искали /subdir1/login вместо /login. Так что это моя новая конфигурация:

server { 
    listen 80; 
    server_name mydomain; 
    root /server/www/main-app/web; 

    location @rewriteapp { 
     rewrite ^(.*)$ /app.php/$1 last; 
    } 

    location /subdir1/ { 
     set $root "/server/www/other-app1/web"; 
     # try to serve file directly, fallback to app.php 
     try_files $uri @rewriteapp; 
    } 

    location/{ 
     index app.php; 
     set $root "/server/www/main-app/web"; 
     # try to serve file directly, fallback to app.php 
     try_files $uri @rewriteapp; 
    } 

    # PROD 
    location ~ ^/app\.php(/|$) { 
     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 

     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $root$fastcgi_script_name; 
     fastcgi_param SCRIPT_NAME $fastcgi_script_name; 
     fastcgi_param PATH_INFO $fastcgi_path_info; 
    } 
} 

Как вы можете видеть, хитрость заключается в том, чтобы не использовать $ DOCUMENT_ROOT для SCRIPT_FILENAME и я создал свой собственный вместо. Я не знаю, как маршрутизатор symfony2 просматривает шаблон в URL-адресе, но с моей предыдущей конфигурацией (Apache2) у меня никогда не было этой проблемы. Так что, может быть, это еще один трюк, чтобы отправить правильный путь к скрипту app.php.

Еще раз благодарю вас за помощь!

ответ

3

После многих часов отладки, я, наконец, решить эту проблему. Это моя окончательная конфигурация:

server { 
    listen 80; 
    server_name mydomain; 
    root /server/www; 

    location @rewriteMainApp { 
     rewrite ^(.*)$ /app.php/$1 last; 
    } 

    location @rewriteOtherApp1 { 
     rewrite ^(.*)$ /subdir1/app.php/$1 last; 
    } 

    location /subdir1 { 
     alias /server/www/other-app1/web; 
     index app.php; 
     set $subfolder "other-app1/web"; 
     try_files $uri @rewriteOtherApp1; 
    } 

    location/{ 
     root /server/www/main-app/web; 
     index app.php; 
     set $subfolder "main-app/web"; 
     try_files $uri @rewriteMainApp; 
    } 

    # PROD 
    location ~ /app\.php(/|$) { 
     fastcgi_pass unix:/var/run/php5-fpm.sock; 

     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root/$subfolder/app.php; 
    } 
} 

Спасибо вам всем за помощь!

+0

Благодаря вашей помощи я пришел к аналогичному решению. Я попробовал миллион вещей, но это было то, что работало (см. Отдельный ответ) – Nilz11

1

Отделите свои приложения с помощью другого тега сервера в файле с поддержкой сайтов.

Например:

#site 1

server { 
#Configuration 
} 

server { 
#Configuration 2 
} 

server { 
#Configuration 3 
} 

Пример конфигурации:

server { 
    listen 80; 
    root /var/www/yourdomain.com/web; 
    server_name yourdomain.com www.yourdomain.com; 
    add_header X-UA-Compatible "IE=Edge,chrome=1"; 

    location ~* \.(css|js|gif|jpe?g|png)$ { 
     expires 1y; 
     add_header Pragma public; 
     add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 
    } 

    location/{ 
     try_files $uri @rewriteapp; 
    } 

    location @rewriteapp { 
     rewrite ^(.*)$ /app_dev.php/$1 last; 
    } 

    location ~ ^/(app|app_dev|config)\.php(/|$) { 
     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_param HTTPS off; 
    } 

    error_log /var/log/nginx/yourdomain.com.error.log; 
    access_log /var/log/nginx/yourdomain.com.access.log; 
} 

server { 
    listen 80; 
    root /var/www/yourdomain.com/anotherproject/web; 
    server_name sub1.yourdomain.com www.sub1.yourdomain.com; 
    add_header X-UA-Compatible "IE=Edge,chrome=1"; 

    location ~* \.(css|js|gif|jpe?g|png)$ { 
     expires 1y; 
     add_header Pragma public; 
     add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 
    } 

    location/{ 
     try_files $uri @rewriteapp; 
    } 

    location @rewriteapp { 
     rewrite ^(.*)$ /app_dev.php/$1 last; 
    } 

    location ~ ^/(app|app_dev|config)\.php(/|$) { 
     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_param HTTPS off; 
    } 

    error_log /var/log/nginx/sub1.yourdomain.com.error.log; 
    access_log /var/log/nginx/sub1.yourdomain.com.access.log; 
} 
+0

Ok если я создать несколько серверов, как я могу указать разные подкаталоги? И возможно ли иметь несколько серверов с одним и тем же доменным именем и одним и тем же портом? – Claros

+0

Как поддомен? Да. Я приведу пример ожидания. –

+0

обновил мой ответ. –

3

Это решило это для меня (спасибо Кларосу), после миллионов вещей, которые я пробовал.Подобно этому, как URLs следующие работы:

/абв/путь/к/оконечных

но не /abc/app.php/path/to/endpoint. Config.php и App_dev.php, если в веб-папке возвращены в виде обычного текста.

Я все еще пытаюсь выяснить, чтобы получить/abc для работы (/ abc/works but/abc not). Там я получаю исключение Symfony, что route/abc не может быть найден.

Также некоторые URL-адреса шрифтов (для бутстрапа) по-прежнему являются неправильными, но стили, маршрутизация и т. Д.

location /abc { 
    set $subpath /abc; 
    set $sfPath /var/www/abc/current/web; 

    alias  $sfPath; 

    try_files $uri @rewrite; 

    } 

    location/{ 
    set $subpath ""; 
    set $sfPath /var/www/def/current/web; 

    alias  $sfPath; 

    try_files $uri @rewrite; 
    } 

    location @rewrite { 
    rewrite ^(.*)$ $subpath/app.php$1 last; 
    } 

    location ~ /app\.php(/|$) { 
    internal; 
    include  /etc/nginx/fastcgi_params; 

    fastcgi_index app.php; 
    fastcgi_pass unix:/var/run/php5-fpm.sock; 
    fastcgi_param DOCUMENT_ROOT $sfPath; 
    fastcgi_param SCRIPT_FILENAME $sfPath/app.php; 
    fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    } 

Если вы хотите также app_dev.php работать в демо-среде, лучший способ я нашел следующий (чтобы иметь PHP блок каждый раз внутри блока местоположения):

location /xyz { 
    set $subpath /xyz; 
    set $sfPath /var/www/xyz/current/web; 

    alias  $sfPath; 

    try_files $uri @rewrite; 

    #Change the match for app_dev.php to work 
    location ~ /(app|app_dev|config)\.php(/|$) { 
     #Drop the internal for App_dev.php to work 
     #internal; 
     include  /etc/nginx/fastcgi_params; 

     fastcgi_index app.php; 
     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     fastcgi_param DOCUMENT_ROOT $sfPath; 
     fastcgi_param SCRIPT_FILENAME $sfPath/app.php; 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    } 
} 
Смежные вопросы