nginx HTTPS phục vụ với cùng cấu hình với HTTP


195

Có cách nào để chia sẻ chỉ thị cấu hình trên hai server {}khối nginx không? Tôi muốn tránh trùng lặp các quy tắc, vì nội dung HTTPS và HTTP của trang web của tôi được cung cấp với cùng một cấu hình.

Hiện tại, nó như thế này:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

Tôi có thể làm gì đó dọc theo dòng:

server {
  listen 80, 443;
  ...

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

Câu trả lời:


262

Bạn có thể kết hợp điều này thành một khối máy chủ như vậy:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Cách làm chính thức


6
À, tôi không biết nginx đủ thông minh để bỏ qua các chỉ thị SSL nếu được tải qua cổng 80. Tuyệt vời!
ceejayoz

72
nginx là tất cả các loại THẮNG.
Jauder Hồ

5
và nếu bạn có một số trang web tại một máy chủ, điều đáng nói là "mặc định" không bắt buộc
luchaninov

4
Thật thanh lịch đến nỗi đau ...
Alix Axel

3
không hoạt động ở đây ... "Yêu cầu HTTP đơn giản đã được gửi đến cổng HTTPS"
gcstr


27

Tôi không biết một cách như bạn đề xuất, nhưng chắc chắn là một cách dễ dàng và có thể duy trì.

Di chuyển các cài đặt máy chủ phổ biến vào một tệp riêng, tức là "serverFoo.conf" và sau includeđó vào các server {}khối riêng biệt như vậy:

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

2
+1 = làm việc cho tôi. (Không thể làm cho nó hoạt động với phương thức khác.)

Ngoài ra, ví dụ khác không chiếm 'proxy_pass' nếu hoạt động như một bộ cân bằng tải.
Mike Purcell

Tùy chọn này rất tuyệt nếu bạn server_namekhác với mỗi cổng
iDev247

5
Đừng sử dụng ssl trên, hãy sử dụng listen 443 ssl;từ bây giờ.
nguy hiểm89

Đây dường như là giải pháp duy nhất đang hoạt động với nginx 1.10.1 gần đây. Vì một số lý do, hai listendòng không được giải thích chính xác, nhưng chuyển chúng sang các server{}bản sửa lỗi riêng biệt .
Artur Bodera

9

Mở rộng các câu trả lời đã có ích, đây là một ví dụ đầy đủ hơn:

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
Tôi biết đây là một câu trả lời khá cũ, nhưng vì nó rất đầy đủ nên tôi chỉ muốn chỉ ra cho những người khác có thể sử dụng nó rằng bạn nên vô hiệu hóa giao thức SSLv3 vì nó dễ bị tổn thương với lỗ hổng POODLE: disablessl3.com Thay vào đó hãy sử dụng: ssl_prot Protocol TLSv1 TLSv1 .1 TLSv1.2;
dùng147787

4

Chỉ cần thêm vào bài đăng của Igor / Jauder, nếu bạn đang nghe một IP cụ thể, bạn có thể sử dụng:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.