Как настроить одновременную работу Django и PHP на сервере с Nginx?

У меня есть вопрос по настройке nginx, так как я не очень хорошо разбираюсь в этом. Как можно настроить доступ к PHP-скриптам в nginx? У меня на сервере уже развернут сайт на Django, и установлена версия PHP 8.1.2. Вот конфигурация nginx, которую я использую: 

<pre><code class="nginx">server {
    if ($host = www.mysite.ru) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = mysite.ru) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;

    server_name www.mysite.ru mysite.ru;


    location /media/ {
        root /home/mysite/web;
    }

    location /favicon.ico { 
	alias /home/mysite/web/mysite/static/img/favicon.ico;
    }

    location /static/ {
        root /home/mysite/web/mysite;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
    return 301 https://www.mysite.ru$request_uri;




}
server {

    listen 443 ssl;

    server_name www.mysite.ru mysite.ru;
    ssl_certificate /etc/letsencrypt/live/mysite.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mysite.ru/privkey.pem; # managed by Certbot
    location /media/ {
        root /home/mysite/web/mysite;
    }

    location /favicon.ico {
	alias /home/mysite/web/mysite/static/img/favicon.ico;
    }

    location /static/ {
        root /home/mysite/web/mysite;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

}</code></pre>
  • 29 декабря 2024 г. 23:03
Ответы на вопрос 2
Для настройки одновременной работы Django и PHP на одном сервере с использованием Nginx, вам нужно изменить конфигурацию Nginx так, чтобы он обрабатывал запросы к PHP-скриптам, параллельно с тем, как он обрабатывает запросы к специальным путям вашего Django-приложения.

### Шаги по настройке

1. **Убедитесь, что у вас установлен PHP-FPM:** 
   Убедитесь, что PHP-FPM (FastCGI Process Manager) установлен и работает. Это позволит Nginx передавать запросы к PHP-скриптам вашему PHP-приложению.

2. **Измените конфигурацию Nginx:** 
   Вам нужно добавить новую локацию для обработки PHP-скриптов. Например, предположим, что ваши PHP-скрипты находятся в каталоге `/var/www/php` (вы можете изменить этот путь на свой).

Вот пример исправленной конфигурации:

```nginx
server {
    if ($host = www.mysite.ru) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    if ($host = mysite.ru) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name www.mysite.ru mysite.ru;

    location /media/ {
        root /home/mysite/web;
    }

    location /favicon.ico { 
        alias /home/mysite/web/mysite/static/img/favicon.ico;
    }

    location /static/ {
        root /home/mysite/web/mysite;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

    # Обработка PHP-скриптов
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;  # Путь к сокету PHP-FPM
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    return 301 https://www.mysite.ru$request_uri;
}

server {
    listen 443 ssl;
    server_name www.mysite.ru mysite.ru;
    ssl_certificate /etc/letsencrypt/live/mysite.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mysite.ru/privkey.pem; # managed by Certbot

    location /media/ {
        root /home/mysite/web/mysite;
    }

    location /favicon.ico {
        alias /home/mysite/web/mysite/static/img/favicon.ico;
    }

    location /static/ {
        root /home/mysite/web/mysite;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

    # Обработка PHP-скриптов
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;  # Путь к сокету PHP-FPM
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
```

### Объяснение изменений:

- **location ~ \.php$**: Этот блок конфигурации обрабатывает запросы к файлам с расширением `.php`.
- **fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;**: Указывает, что запросы к PHP-скриптам будут передаваться процессу PHP-FPM через сокет.
- **include snippets/fastcgi-php.conf;**: Это включает стандартную конфигурацию для обработки FastCGI.
- **fastcgi_param SCRIPT_FILENAME**: Указывает путь к самому PHP-скрипту.

### Перезагрузка Nginx

Не забудьте перезагрузить Nginx после внесения изменений в конфигурацию:

```bash
sudo systemctl restart nginx
```

### Дополнительные замечания

- Убедитесь, что у вас правильно настроены права на файл и каталоги ваших PHP-скриптов.
- Если вы используете разные домены или поддомены для вашего Django и PHP-приложений, вы можете дополнительно настроить конфигурацию для отдельных серверов.
- Проверьте журналы ошибок Nginx, если что-то не работает, это может дать подсказки о том, что нужно исправить.
Очевидно, нужно заменить location / на два разных, в одном оставить proxy_pass на gunicorn, а во втором сделать на php-fpm. 

P.S. Ну и стоило бы убрать лишние директивы из первого блока server.
Похожие вопросы