nginx HTTPS melayani dengan konfigurasi yang sama seperti HTTP


195

Apakah ada cara untuk membagikan arahan konfigurasi di dua server {}blok nginx ? Saya ingin menghindari duplikasi aturan, karena konten HTTPS dan 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
  }
}

Jawaban:


262

Anda dapat menggabungkan ini menjadi satu blok server seperti:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Cara Resmi


6
Ah, saya tidak tahu nginx cukup pintar untuk mengabaikan arahan SSL jika dimuat melalui port 80. Luar biasa!
ceejayoz

72
nginx adalah segala macam MENANG.
Jauder Ho

5
dan jika Anda memiliki beberapa situs di satu server, perlu disebutkan bahwa "default" tidak wajib
luchaninov

4
Sangat elegan hingga menyakitkan ...
Alix Axel

3
tidak berfungsi di sini ... "Permintaan HTTP polos telah dikirim ke port HTTPS"
gcstr


27

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

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

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

2
+1 = bekerja untuk saya. (Tidak bisa mendapatkannya bekerja dengan metode lain.)

Juga, contoh lain tidak menjelaskan 'proxy_pass' jika bertindak sebagai penyeimbang beban.
Mike Purcell

Opsi ini bagus jika Anda server_nameberbeda untuk setiap port
iDev247

5
Jangan gunakan ssl aktif, gunakan listen 443 ssl;mulai sekarang.
hazard89

Ini tampaknya menjadi satu-satunya solusi yang bekerja dengan nginx 1.10.1 terbaru. Untuk beberapa alasan dua listenbaris tidak diinterpretasikan dengan benar, tetapi memindahkannya untuk memisahkannya server{}.
Artur Bodera

9

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;
}

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

4

Hanya untuk menambah posting Igor / Jauder, jika Anda mendengarkan IP tertentu Anda dapat menggunakan:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.