# Nginx ters proxy: Node.js ya da Python uygulamasını Nginx arkasında yayınlama

https://kervanhosting.com/bilgi-bankasi/makale/nginx-reverse-proxy-node-js-uygulamasini-nginx-arkasinda-yayinlama

Node.js, Python (Gunicorn, Uvicorn), bir Docker konteyneri ya da herhangi bir uygulama genellikle `3000` veya `8000` gibi bir portta dinler. Bu portu doğrudan internete açmak yerine Nginx'i önüne koymak üç kazanç sağlar: alan adı üzerinden normal `80/443` portlarıyla erişirsiniz, https sertifikasını Nginx karşılar ve birden fazla uygulamayı tek IP'de barındırabilirsiniz. Nginx'in bu rolüne **ters proxy** denir.

## Uygulamanız hazır olsun

Önce uygulamanın arka planda çalıştığından emin olun (ör. `systemd` servisi): [Node.js veya Python uygulamasını yayınlama](https://kervanhosting.com/bilgi-bankasi/makale/node-js-veya-python-uygulamami-sunucuda-nasil-yayinlarim). Uygulamanın yalnızca yerel adreste (`127.0.0.1`) dinlemesi önerilir; böylece dışarıdan yalnızca Nginx üzerinden erişilir. Kontrol: `curl -I http://127.0.0.1:3000`.

## Nginx ayarı

```
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 80;
    server_name app.ornek.com;
    client_max_body_size 50M;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        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;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_read_timeout 120s;
    }
}
```

Dosyayı `/etc/nginx/sites-available/app.ornek.com` içine yazıp [bağlantısını etkinleştirin](https://kervanhosting.com/bilgi-bankasi/makale/nginx-ile-birden-fazla-web-sitesi-server-block-sanal-host) ve `sudo nginx -t && sudo systemctl reload nginx` çalıştırın. `map` bloğu `server` bloğunun dışında, `http` bağlamında olmalıdır; `sites-available` dosyalarının en üstüne yazmak bu bakımdan doğrudur.

## Başlıklar ne işe yarar?

- `Host`: Uygulamanın hangi alan adıyla çağrıldığını bilmesi için.
- `X-Forwarded-For` ve `X-Real-IP`: Ziyaretçinin gerçek IP adresi. Bunlar olmazsa uygulamanız her isteği `127.0.0.1`'den geliyormuş gibi görür (günlük ve hız sınırı işe yaramaz).
- `X-Forwarded-Proto`: İstek https ile geldiyse uygulamaya söyler; aksi halde uygulama https yönlendirmesi yapıp sonsuz döngüye girebilir ya da yanlış (http) bağlantılar üretir. Uygulama çerçevenizin "proxy'e güven" ayarını (Express'te `app.set('trust proxy', 1)`) açın.
- `Upgrade` ve `Connection`: WebSocket bağlantıları için (canlı sohbet, bildirim, oyun). Olmadan WebSocket bağlanamaz.

## https

Ayar çalıştıktan sonra: `sudo certbot --nginx -d app.ornek.com`. Sertifika Nginx'e eklenir, uygulamanıza yine http ile (yerel) bağlanılır; uygulamanın kendisinin sertifikaya ihtiyacı yoktur.

## Sık hatalar

- **502 Bad Gateway:** Uygulama çalışmıyor ya da farklı bir portta. `sudo ss -tlnp | grep 3000`: [502 makalesi](https://kervanhosting.com/bilgi-bankasi/makale/nginx-502-bad-gateway-hatasi-nedenleri-ve-cozumu).
- **504 Gateway Timeout:** Uygulama çok yavaş yanıt veriyor. `proxy_read_timeout` değerini artırabilir ama asıl yavaşlığı bulmalısınız.
- **`proxy_pass` sonuna `/` koymak:** `proxy_pass http://127.0.0.1:3000/;` ile `proxy_pass http://127.0.0.1:3000;` yol işleme bakımından farklıdır. Alt yolda proxy yapıyorsanız (`location /api/`) bu farkı bilin; düz `location /` için ikisi aynıdır.
- **Dosya yüklemede 413:** [413 hatası](https://kervanhosting.com/bilgi-bankasi/makale/nginx-413-request-entity-too-large-hatasi).

Bot hosting paketimiz bu işi sizin yerinize halleder ve ters proxy kurmanızı gerektirmez: [Bot ve Uygulama Hosting](https://kervanhosting.com/bot-hosting). Kendi sunucunuz için [Linux VDS](https://kervanhosting.com/linux-vds).

## Sık sorulanlar

### Uygulamayı doğrudan 3000 portundan yayınlasam olmaz mı?

Olur ama alan adı adresinde port numarası görünür, https sertifikasını uygulamanın kendisi yönetmek zorunda kalır ve güvenlik duvarında bir portu daha dışarı açarsınız. Nginx önünde tutmak daha düzenli ve güvenlidir.

### Birden fazla uygulamayı tek alan adında nasıl yayınlarım?

Farklı yollara farklı portlar atayın: `location /api/ { proxy_pass http://127.0.0.1:4000/; }` ve `location / { proxy_pass http://127.0.0.1:3000; }`. Her biri için gerekli başlıkları ekleyin.

### WebSocket hâlâ bağlanmıyor.

`map` bloğunun varlığını ve `proxy_http_version 1.1;` ile iki `Upgrade/Connection` başlığını kontrol edin. Önünde Cloudflare varsa WebSocket'in açık olduğundan emin olun.

**İlgili makaleler**

- [Node.js veya Python uygulamamı sunucuda nasıl yayınlarım?](https://kervanhosting.com/bilgi-bankasi/makale/node-js-veya-python-uygulamami-sunucuda-nasil-yayinlarim)
- [Nginx 502 Bad Gateway hatası: nedenleri ve çözümü](https://kervanhosting.com/bilgi-bankasi/makale/nginx-502-bad-gateway-hatasi-nedenleri-ve-cozumu)
- [Bir programı arka planda sürekli çalıştırma (screen, systemd)](https://kervanhosting.com/bilgi-bankasi/makale/bir-programi-arka-planda-surekli-calistirma-screen)

*Sorununuz çözülmediyse [destek talebi açın](https://kervanhosting.com/destek-taleplerim). Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.*
