Pertanyaan nginx HTTPS melayani dengan konfigurasi yang sama dengan HTTP


Apakah ada cara untuk berbagi arahan konfigurasi di dua nginx server {} blok? Saya ingin menghindari duplikasi aturan, karena HTTPS dan konten HTTP situs saya disajikan dengan konfigurasi yang sama persis.

Saat ini, seperti ini:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

Dapatkah saya melakukan sesuatu di sepanjang baris:

server {
  listen 80, 443;
  ...

  if(port == 443) {
    ssl on; #etc
  }
}

174
2018-05-21 16:18






Jawaban:


Anda dapat menggabungkan ini menjadi satu blok server seperti ini:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Petunjuk Resmi


238
2018-05-21 18:54



Ah, saya tidak tahu nginx cukup cerdas untuk mengabaikan arahan SSL jika dimuat melalui port 80. Keren! - ceejayoz
nginx adalah segala macam WIN. - Jauder Ho
dan jika Anda memiliki beberapa situs di satu server, ada baiknya menyebutkan bahwa "default" tidak wajib - luchaninov
Sangat elegan rasanya ... - Alix Axel
tidak berfungsi di sini ... "Permintaan HTTP polos dikirim ke port HTTPS" - gcstr


Untuk memperjelas jawaban yang diterima, Anda perlu menghilangkannya

SSL on;

dan Anda hanya perlu yang berikut untuk versi nginx setelah 0.8.21

listen 443 ssl;

Referensi:

Nginx Docs - Mengkonfigurasi server HTTP / HTTPS tunggal


81
2018-06-13 06:19



Terima kasih! Saya tidak tahu mengapa tidak ada yang bekerja di http. Menghapus SSL; bekerja. - Chris Cummings


Saya tidak tahu cara seperti yang Anda sarankan, tetapi pasti ada cara yang mudah dan dapat dipertahankan.

Pindahkan pengaturan server umum ke file terpisah, yaitu "serverFoo.conf" dan kemudian include itu terpisah server {} blok seperti ini:

server {
    listen 80;
    include serverFoo.conf;
}
server {
    listen 443 ssl;
    include serverFoo.conf;
}

25
2018-05-21 18:38



+1 = bekerja untuk saya. (Tidak bisa membuatnya bekerja dengan metode lain.) - lackey
Juga, contoh lain tidak memperhitungkan 'proxy_pass' jika bertindak sebagai penyeimbang beban. - Mike Purcell
Pilihan ini sangat bagus jika Anda server_name berbeda untuk setiap port - iDev247
Jangan gunakan ssl, gunakan listen 443 ssl; mulai sekarang satu. - danger89
Ini tampaknya menjadi satu-satunya solusi yang bekerja dengan nginx 1.10.1 terbaru. Untuk beberapa alasan dua listen garis tidak ditafsirkan dengan benar, tetapi memindahkannya untuk dipisahkan server{} memperbaikinya. - Artur Bodera


Memperluas jawaban yang sudah membantu, berikut adalah contoh yang lebih lengkap:

server {

    # Listen on port 80 and 443
    # on both IPv4 and IPv6
    listen 80;
    listen [::]:80 ipv6only=on;
    listen 443 ssl;
    listen [::]:443 ipv6only=on ssl;

    # Set website folder
    root /path/to/your/website;

    # Enable SSL
    ssl_certificate your-cert.pem;
    ssl_certificate_key your-cert.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;
}

7
2018-05-10 17:48



Saya tahu ini adalah jawaban yang cukup lama, tetapi karena sangat lengkap, saya hanya ingin menunjukkan kepada orang lain yang mungkin menggunakannya bahwa Anda harus menonaktifkan protokol SSLv3 karena rentan terhadap kerentanan POODLE: disablessl3.com  Sebagai gantinya gunakan: ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - user147787


Hanya untuk menambah posting Igor / Jauder, jika Anda mendengarkan IP spesifik yang dapat Anda gunakan:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;

4
2018-02-25 13:11