Служите php-fpm через nginx для определенного пути в URL, принимающем значение по умолчанию к статическому содержанию

Я пытаюсь выполнить два веб-сайта на том же имени хоста, где каждый служит статическому содержанию (приложение AngularJS), и другой направляет все запросы к PHP (API записанное использование Apigility), но только для определенного пути в URL (больше на этом позже).

В данный момент у меня есть два nginx vhosts слушающий на двух различных доменах, который работает просто великолепно, однако клиентское приложение будет в конечном счете проходить проверку подлинности против API с помощью OAuth, и я не хочу хранить маркеры или любые другие уязвимые данные в cookie клиента, локальном устройстве хранения данных или где-либо еще. Эта статья объясняет обоснование позади него лучше, чем я мог объясниться.

С той проблемой в памяти я решил иметь сервер "прокси", который будет (важной) подачей по умолчанию любое статическое содержание, которое клиентский браузер запрашивает, однако если запрос прибывает в это, запускается с /api/ затем это должно быть перенаправлено к php-fpm.

Чтобы дать Вам пример, давайте предположим, что API имеет конечную точку /users. То, что я хочу смочь сделать, запущено мое приложение AngularJS, как я обычно был бы, например, на http://monkey.com/index.html но в то же время если я выполняю запрос Ajax к http://monkey.com/api/users это должно передать /users бит к PHP, который будет установлен в другом каталоге (ради этого вопроса предполагают, что приложение AngularJS установлено в /var/www/website и API находится в /var/www/api.

Это две конфигурации, которые я имею в данный момент и которые работают отдельными веб-сайтами:

Конфигурация приложения AngularJS:

server {
    listen      80;
    server_name monkey.com;

    root        /var/www/website;
    index       index.html

    location / {
        try_files $uri $uri/ /index.html =404;
    }
}

Конфигурация API:

server {
    listen      80;
    server_name api.monkey.com;

    root        /var/www/api/public;
    index       index.php

    include     /etc/nginx/fcgiwrap.conf;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

Для предотвращения беспорядка, я не отправлю свои неудачные попытки, но я могу только сказать, что попытался использовать root и alias напрасно. Я предполагаю, что моя самая большая проблема, я не уверен, как извлечь только часть, которая прибывает после /api и передайте его PHP, который, более того, находится в другом каталоге к $document_root.

Я видел довольно много статей и ответов на НАСТОЛЬКО упоминающем это наличие root внутри a location запись не является хорошей идеей, но я не думаю, что это может быть решено, не делая ее.

Я боролся с этой на вид простой проблемой некоторое время теперь, таким образом, я надеюсь, что кто-то может дать пример конфигурации, которая на самом деле работает.

0
задан 9 September 2015 в 22:19
2 ответа

После того, как я потратил значительное количество времени, пытаясь получить рабочую конфигурацию, я, кажется, наконец-то сумел это сделать.

Теперь я могу выполнять запросы на http://monkey.com/some/angular/path или http://monkey. com/api/users и обслуживать оба, статический контент или PHP-сайт, соответственно, из одного и того же домена.

В случае, если кто-то наткнется на этот вопрос, вот конфигурация, которую я закончил с:

server {
    listen      80;
    server_name monkey.com;

    location / {
        alias     /var/www/website/;
        try_files $uri $uri/ /index.html =404;
    }

    location /api/ {
        alias     /var/www/api/public;
        try_files /index.php =404;

        set $path $request_uri;
        if ($request_uri ~ ^/api/(.*)$ ) {
            set $path /$1;
        }

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass            unix:/var/run/php5-fpm.sock;
        fastcgi_index           index.php;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        fastcgi_param REQUEST_URI     $path;                                                                                                                                                                                                                                        
    }
}

Конфигурация выше убирает префикс /api/ и устанавливает REQUEST_URI на все, что за ним последовало. Например, если вы запросили monkey.com/api/users/1 вы бы в конечном итоге передали /users/1 на php-fpm.

Если вам не нужно изменить оригинальный URI запроса в любом случае и просто хотите передать весь URI запроса в PHP вы можете упростить (и, возможно, ускорить) конфигурацию следующим образом:

server {
    listen      80;
    server_name monkey.com;

    location / {
        alias     /var/www/website/;
        try_files $uri $uri/ /index.html =404;
    }

    location /api/ {
        alias     /var/www/api/public;
        try_files /index.php =404;

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass            unix:/var/run/php5-fpm.sock;
        fastcgi_index           index.php;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    }
}

Теперь на настройку проекта Guzzle для прокси-сайта!

.
1
ответ дан 4 December 2019 в 16:50

Первым делом: Этот код был бы невозможен без 'Andris', Google и других. Пожалуйста, сначала прочтите его код, а затем прочтите его, если это вам не удастся!
. Угловой или любой другой сервис может обслуживаться на порту 4200 и на пути по умолчанию / Например: http://example.com/ будет работать под углом.

Любой запрос типа http://example.com/api/index.php будет перенаправлен на соответствующий маршрут, удаляя '/api' из него. Поэтому http://example.com/api/index.php будет считаться http://example.com/index.php

Я только что проверил этот код, пожалуйста, ответьте вашим патчем и предложениями, если они есть!

 server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  localhost;
        #root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
           proxy_pass http://127.0.0.1:4200;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection 'upgrade';
           proxy_set_header Host $host;
           proxy_cache_bypass $http_upgrade;

        }
        location /api/ {
            root /var/www/api/public;
        try_files /index.php =404;

        set $path $request_uri;
        if ($request_uri ~ ^/api/(.*)$ ) {
        set $path /$1;
        }       

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;

        include fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME  $document_root$path;
            fastcgi_param REQUEST_URI   $path;
           # index  index.php index.html index.htm;
        }
    }
0
ответ дан 4 December 2019 в 16:50

Теги

Похожие вопросы