Настройка Nginx как reverse proxy

Если Aulynk работает за Nginx, необходимо правильно настроить проксирование HTTP, WebSocket и (опционально) федеративный порт.

Базовая конфигурация

Nginx принимает HTTPS-соединения и проксирует их на Go-бэкенд Aulynk, работающий на порту 8080.

server {
    listen 80;
    server_name aulynk.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name aulynk.example.com;

    ssl_certificate     /etc/letsencrypt/live/aulynk.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/aulynk.example.com/privkey.pem;

    client_max_body_size 100m;

    location / {
        proxy_pass http://127.0.0.1:8080;
        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;
    }
}

WebSocket

WebSocket-соединение устанавливается по адресу /api/ws. Для корректной работы необходимо проксировать заголовки Upgrade и Connection.

    location /api/ws {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        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_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }

Параметры proxy_read_timeout и proxy_send_timeout увеличены, чтобы Nginx не закрывал долгоживущие WebSocket-соединения.

Федерация (порт 8448)

Если включена Matrix-федерация, удалённые серверы обращаются по порту 8448. Можно проксировать этот порт через отдельный блок server.

server {
    listen 8448 ssl http2;
    server_name aulynk.example.com;

    ssl_certificate     /etc/letsencrypt/live/aulynk.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/aulynk.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8080;
        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;
    }
}

Альтернативно, в config.yaml можно указать federation.port: 443, тогда отдельный блок не нужен -- федеративные запросы пойдут по основному HTTPS-порту.

Let's Encrypt с certbot

Установка сертификата:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d aulynk.example.com

Certbot автоматически обновит конфигурацию Nginx и настроит автопродление. Для ручного обновления:

sudo certbot renew
sudo systemctl reload nginx

Полный пример конфигурации

upstream aulynk_backend {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name aulynk.example.com;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    server_name aulynk.example.com;

    ssl_certificate     /etc/letsencrypt/live/aulynk.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/aulynk.example.com/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;

    client_max_body_size 100m;

    location /api/ws {
        proxy_pass http://aulynk_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        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_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }

    location / {
        proxy_pass http://aulynk_backend;
        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;
    }
}

# Federation (Matrix S2S)
server {
    listen 8448 ssl http2;
    server_name aulynk.example.com;

    ssl_certificate     /etc/letsencrypt/live/aulynk.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/aulynk.example.com/privkey.pem;

    location / {
        proxy_pass http://aulynk_backend;
        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;
    }
}

При использовании Nginx отключите встроенный HTTPS в Aulynk:

server:
  httpAddr: ":8080"
  https:
    enabled: false