Menjalankan server websocket dan server http pada server yang sama

8

Saya menggunakan nginx untuk melayani instance aplikasi PHP, dan juga menjalankan aplikasi Ratchet untuk mendengarkan koneksi websocket. Masalahnya adalah, kedua instance ini menggunakan port yang sama (80).

Bagaimana cara mengatur server sehingga saya dapat melayani keduanya?

Sunting: Baru saja kembali untuk melihat pertanyaannya telah diturunkan beberapa kali, dapat dimengerti, saya tidak benar-benar mengajukan pertanyaan dengan jelas. Saya minta maaf untuk itu. Saya melakukan uji tuntas saya. Saya akan mencoba mengklarifikasi apa yang saya tanyakan, saya mungkin telah salah paham beberapa aspek dari protokol websocket, dalam hal ini, tolong perbaiki saya:

Saya tahu betul bahwa hanya ada satu proses mendengarkan port tertentu, apa yang sebenarnya saya hadapi adalah seluruh masalah websocket, dari apa yang saya pahami, permintaan websocket dimulai dengan handshake HTTP, setelah itu akan ada mekanisme untuk 'meningkatkan' sesi itu ke port tertentu.

Dari apa yang saya baca, sepertinya mekanisme upgrade ini ditangani oleh server web. Jadi, bagaimana cara mengkonfigurasi nginx untuk menangani proses ini?

Semua dalam semua, satu hal yang saya khawatirkan menjalankan server websocket pada port selain 80, adalah kemungkinan port diblokir. Apakah kekhawatiran ini tidak berdasar? Adakah saran tentang bagaimana saya harus mengatur ini?

hndr
sumber
that_guy - tinjau serverfault.com/help/how-to-ask - pastikan Anda melakukan uji tuntas sebelum mengirim. Meskipun kami menyukai orang-orang yang mengajukan pertanyaan, kami juga menyukai orang-orang untuk mengerjakan pekerjaan rumah mereka.
ETL

Jawaban:

16

Pertanyaan yang sangat ditulis, tetapi istilah yang saya cari adalah proxy terbalik.

Pada dasarnya, sama seperti bagaimana nginx dapat meneruskan permintaan yang berbeda ke beberapa instance aplikasi web berdasarkan path atau nama host, itu juga dapat dikonfigurasi untuk "meneruskan" permintaan ke instance server websocket. misalnya:

location /socket {
    proxy_pass http://websocket;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

upstream websocket{
    server localhost:8000;
}

map $http_upgrade $connection_upgrade {
    default Upgrade;
    '' close;
}

Permintaan HTTP untuk http://hostnameakan dilayani halaman html biasa, sementara koneksi websocket ke wss://hostname/socketakan diteruskan ke contoh websocket pada server yang sama mendengarkan pada port 8000.

hndr
sumber
Bantuan besar !! Thanxx
gunjot singh
Opsi lain yang bermanfaat di dalam blok lokasi itu adalah proxy_read_timeoutdan proxy_write_timeoutuntuk mencegah terputusnya aktivitas.
Vi.
Tidak memperbaiki masalah yang dibutuhkan bantuan!
Nɪsʜᴀɴᴛʜ
2

Server tidak dapat memiliki dua perangkat lunak berbeda yang mendengarkan pada port / alamat IP yang sama. Jika tidak, bagaimana lalu lintas akan dialihkan ke Aplikasi XYZ jika beberapa aplikasi dapat mengikat ke port yang sama?

Anda dapat mempelajari lebih lanjut tentang port dari Port (jaringan komputer)

Yang perlu Anda lakukan adalah salah satu dari opsi berikut:

  1. Gunakan port lain untuk salah satu dari dua aplikasi dan biarkan melalui firewall Anda.
  2. Gunakan dua alamat IP yang berbeda - dan ikat masing-masing aplikasi ke alamat IP masing-masing.

Firewall Anda hanya perlu dikonfigurasi sesuai dengan apa yang Anda atur.

ETL
sumber
dapatkah Anda memberikan informasi lebih lanjut? apakah itu akan menyebabkan masalah dengan firewall? bukankah salah satu keuntungan dari websocket adalah untuk menghindarinya?
hndr
5
Berbagi port dimungkinkan karena Anda dapat memiliki server HTTP dan server Websocket dalam satu proses.
Pacerier
0

Anda memiliki dua opsi:

  1. Ikat satu ke port lain (mis. 8000)
  2. (jika mungkin) tambahkan alamat IP tambahan ke server dan ikat server web dan server websocket ke IP yang berbeda
Teun Vink
sumber