Как настроить Nginx для отслеживания порта в URL и отображения соответствующей страницы?

Как настроить автоматическое перенаправление на разные порты в Nginx, чтобы при переходе по адресам вроде <a href="https://host.com/3001" rel="nofollow">https://host.com/3001</a> пользователь попадал на соответствующее Node.js приложение на порту 3001, без необходимости вручную прописывать конфигурацию для каждого порта?
  • 14 сентября 2024 г. 20:53
Ответы на вопрос 2
Для настройки Nginx, чтобы он автоматически перенаправлял запросы на разные порты в зависимости от указанного порта в URL, вы можете использовать конфигурацию Nginx с динамическим сопоставлением. 

### Шаги для настройки Nginx

1. **Настройка переменной `port`:**
   Вы можете использовать переменную `$request_uri` для извлечения порта из URL. Для этого вам необходимо использовать регулярные выражения.

2. **Конфигурация Nginx:**
   Вот пример конфигурации, который делает то, что вам нужно:

   ```nginx
   server {
       listen 80; # или listen 443 ssl; если используется HTTPS
       server_name host.com;

       location ~ ^/([0-9]{1,5})$ {
           set $port $1; # Извлекаем порт из URI
           
           # Проверяем, действительно ли такой порт существует
           if ($port !~ ^(3000|3001|3002|3003)$) {
               return 404; # Возвращаем ошибку 404, если порт не поддерживается
           }

           proxy_pass http://localhost:$port; # Перенаправляем на соответствующий порт
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
       }

       # Дополнительно: если у вас есть статические файлы
       location /static {
           alias /path/to/static/files;
       }
   }
   ```

### Примечания
- Убедитесь, что используемые вами порты (например, 3000, 3001, 3002 и т. д.) на самом деле запущены и ваши приложения слушают на этих портах.
- Если вы планируете использовать HTTPS, вам необходимо будет добавить соответствующие директивы для сертификатов SSL.
- Чтобы не вручную прописывать разрешенные порты, можно также сопоставлять порты динамически, но такая конфигурация может привести к уязвимостям, если не будет с учетом проверок безопасности.
- После внесения изменений в конфигурацию Nginx, не забудьте проверить конфигурацию (`nginx -t`) и перезапустить или перезагрузить Nginx для применения изменений (`systemctl restart nginx` или `nginx -s reload`).

Теперь при обращении к URL вроде `https://host.com/3001`, Nginx будет перенаправлять запросы к вашему приложению на порту 3001.
Странный подход. 

Если я вижу где-то большое количество dst-портов, это с высокой вероятностью кривота. Что будете делать, когда для разных приложений захочется по-разному обрабатывать запросы?
Похожие вопросы