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
  }
}
ceejayoz
sumber

Jawaban:

262

Anda dapat menggabungkan ini menjadi satu blok server seperti:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Cara Resmi

Jauder Ho
sumber
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
87

Untuk mengklarifikasi jawaban yang diterima, Anda perlu menghilangkan

SSL on;

dan Anda hanya perlu yang berikut ini untuk versi nginx setelah 0.8.21

listen 443 ssl;

Referensi:

Nginx Documents - Mengkonfigurasi server HTTP / HTTPS tunggal

Sean Tan
sumber
2
Terima kasih! Saya tidak tahu mengapa tidak ada yang bekerja di http. Menghapus SSL aktif; bekerja.
Chris Cummings
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;
}
dwc
sumber
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;
}
Jonathan
sumber
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;
Matt Bostock
sumber