Назад | Перейти на главную страницу

Конфигурация Nginx: два приложения в одном домене

У меня есть два приложения: интерфейс HTML + JS и бэкэнд PHP. Я хотел бы настроить Nginx так, чтобы оба они обслуживались из одного домена. Запросы к бэкэнду выполняются с использованием URL-адресов, начинающихся с /api.

Моя попытка была такой:

server {
    root /path/to/frontend;
    index index.html;
    server_name example.com;

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

    location /api {
        alias /path/to/backend;
        index index.php;
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

Однако для всех запросов к бэкэнду я получаю 404: основной сценарий неизвестен.

Есть ли способ достичь того, что я пытаюсь сделать здесь? Как?

Вы совершили обычную ошибку, когда люди не понимали, как работает nginx. Помните следующее:

nginx всегда обслуживает запрос с не замужем location только блок.

Я предлагаю вам (пере) прочитать следующее: Как nginx обрабатывает запрос

Теперь, глядя на вашу конфигурацию, серверные запросы должны обслуживаться двумя местоположениями:

  1. location /api
  2. location ~\.php$

Следующий location документации, первая из них называется префикс место, а второй - регулярное выражение (регулярное выражение) один. nginx проверит оба, но в конечном итоге выберет только один, который в вашем случае является регулярным выражением.

Теперь при его обработке nginx перенаправит запрос на /path/to/frontend/<yourFile>.php в PHP, построив путь из root /path/to/frontend, так как это единственный определенный. Затем бэкэнд не может найти указанный файл.

Вы можете попробовать следующее:

location /api {
    alias /path/to/backend;
    index index.php;
    try_files $uri $uri/ /index.php;

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;

        # Useless? Request always ending up with '.php' here...
        fastcgi_index index.php;

        include fastcgi_params;

        # Try to secure this block, which might lead to arbitrary code execution.
    }
}

Что касается отсутствия безопасности, я провел доклад о nginx и PHP-FPM на nginx.conf 2014 в конце октября. Слайды доступны: https://rosset.net/LAMP_just_died.pptx. Видео скоро будет доступно.