Как я могу настроить nginx, чтобы он обрабатывал как VLESS, так и тестовый сайт через один порт, при этом используя docker compose? Я привел свой пример конфигурации docker compose ниже: <br/> <pre><code class="yaml">services: helloworld: container_name: helloworld-2 image: crccheck/hello-world expose: - 8000 nginx: image: nginx-stream container_name: nginx-stream ports: - 80:80 - 443:443 volumes: - ./http.conf.d:/opt/nginx/http.conf.d - ./stream.conf.d:/opt/nginx/stream.conf.d - ./certbot/conf:/etc/letsencrypt - ./certbot/www:/var/www/certbot restart: unless-stopped cerbot: image: certbot/certbot container_name: certbot volumes: - ./certbot/conf:/etc/letsencrypt - ./certbot/www:/var/www/certbot command: certonly --webroot -w /var/www/certbot --keep-until-expiring --email mail@test.ru --domain exemple.com --agree-tos x-ray: image: teddysun/xray container_name: x-ray-nginx volumes: - /etc/xray2:/etc/xray2 - ./certbot/conf:/etc/letsencrypt expose: - 9001 restart: always</code></pre> <br/> Также я пересобрал контейнер nginx, чтобы включить поддержку stream таким образом: <br/> <pre><code>FROM debian:bookworm RUN apt-get update && apt-get -y upgrade && \ apt-get install -y wget libpcre3-dev build-essential libssl-dev zlib1g-dev && \ rm -rf /var/lib/apt/lists/* WORKDIR /opt RUN wget http://nginx.org/download/nginx-1.27.3.tar.gz && \ tar -zxvf nginx-1.*.tar.gz && \ cd nginx-1.* && \ ./configure --prefix=/opt/nginx --user=nginx --group=nginx --with-http_ssl_module --with-ipv6 --with-threads --with-stream --with-stream_ssl_module --with-h
Чтобы настроить работу вашего VLESS-сервиса и тестового сайта через один порт с использованием NGINX и Docker, вам нужно будет настроить NGINX для обработки как HTTP-запросов (для вашего сайта), так и TCP/UDP-запросов (для VLESS) в режиме Stream. Обычно это делается с использованием разных местоположений в конфигурации NGINX.
Вот основные шаги, которые вам нужно выполнить:
### 1. Настройте NGINX
Создайте конфигурационные файлы для NGINX. Например, `http.conf.d/default.conf` для HTTP и `stream.conf.d/default.conf` для VLESS.
#### HTTP конфигурация (http.conf.d/default.conf)
```nginx
server {
listen 80;
server_name exemple.com;
location / {
proxy_pass http://helloworld:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
```
#### Stream конфигурация (stream.conf.d/default.conf)
```nginx
stream {
upstream vless {
server x-ray-nginx:9001;
}
server {
listen 443; # Порт, на котором будет работать VLESS
proxy_pass vless;
}
}
```
### 2. Обновите вашу конфигурацию Docker Compose
Ваш файл `docker-compose.yml` должен выглядеть примерно так:
```yaml
version: '3.8'
services:
helloworld:
container_name: helloworld-2
image: crccheck/hello-world
expose:
- 8000
nginx:
image: nginx:latest # Используйте официальный образ NGINX
container_name: nginx-stream
ports:
- "80:80" # HTTP
- "443:443" # VLESS
volumes:
- ./http.conf.d:/etc/nginx/conf.d
- ./stream.conf.d:/etc/nginx/conf.d/default.conf # Замените путь к вашему Stream конфигу
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
restart: unless-stopped
certbot:
image: certbot/certbot
container_name: certbot
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
command: certonly --webroot -w /var/www/certbot --keep-until-expiring --email mail@test.ru --domain exemple.com --agree-tos
x-ray:
image: teddysun/xray
container_name: x-ray-nginx
volumes:
- /etc/xray2:/etc/xray2
- ./certbot/conf:/etc/letsencrypt
expose:
- 9001
restart: always
```
### 3. Соберите и запустите ваши контейнеры
После того как вы все настроили, выполните команды:
```bash
docker-compose build
docker-compose up -d
```
### 4. SSL сертификаты
Убедитесь, что ваш `certbot` корректно создает сертификаты для вашего домена `exemple.com`. Убедитесь, что ваши DNS-записи уже настроены на ваш сервер.
Также, если вы используете протоколы TLS/SSL, добавьте необходимые SSL параметры, такие как `ssl_certificate` и `ssl_certificate_key` в соответствующие части конфигурации NGINX.
### Примечание
- Если у вас возникают проблемы с доступом к VLESS, убедитесь, что ваши порты открыты в фаерволе сервера.
- Также проверьте версию NGINX и убедитесь, что она поддерживает все необходимые модули для работы с `stream`.
В итоге нашел в чем была проблема - proxy_protocol.
Чтобы заработало нужно из /opt/nginx/stream.conf.d/*.conf удалить строчку:
proxy_protocol on;
А из /opt/nginx/http.conf.d/*.conf удалить всё что связано с proxy_protocol (для наглядности закомментировал ненужное):
server_tokens off; charset utf-8; server { listen 80 default_server; server_name _; return 301 https://$host$request_uri; } server { listen 7443 ssl; # listen 7443 ssl proxy_protocol; # set_real_ip_from 127.0.0.1; # real_ip_header proxy_protocol; http2 on; ssl_certificate /etc/letsencrypt/live/exemple.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/exemple.com/privkey.pem; server_name sandro.run; root /var/www/html; index index.php index.html index.htm; location ~ /.well-known/acme-challenge/ { root /var/www/certbot; } location /test { proxy_pass http://helloworld:8000/; } }
После этого заработал, но есть и проблема. Из-за отключения proxy_protocol в логах обращений к сайту IP посетителей пишутся как 127.0.0.1. Пример решения этой проблемы, вроде, есть, но буду заниматься этим чуть позже и если решу проблему, то дополню ответ.
P.S.
Спасибо автору статьи https://coyotle.ru/posts/xray-and-nginx/ из которой были взяты конфиги nginx, xray.