Debian jessie nginx với openssl 1.0.2 để sử dụng ALPN thay vì NPN


14

Tôi đang chạy debian jessie trên máy chủ của mình và gần đây đã nâng cấp lên máy chủ web nginx mới với sự hỗ trợ http / 2 (nginx 1.10). Như ngày nay, nó hoạt động rất tốt và máy chủ web đang phân phối nội dung với giao thức http2.

Tôi đã đọc, chrome đang giảm hỗ trợ NPN và chỉ cho phép ALPN sau ngày 15,5.2016. ALPN là phần mở rộng, yêu cầu cài đặt openssl 1.0.2, nhưng trên debian jessie chỉ là openssl 1.0.1 (cũng trên backport debian và một kho lưu trữ khác, không có phiên bản openssl 1.0.2 cho debian này).

Và có một vấn đề - tôi đã nâng cấp từ SPDY lên http2 và trong vài ngày nữa, tôi sẽ phải tắt http2 và không thể sử dụng SPDY vì phiên bản nignx này chỉ có http2. Tôi cũng đã đọc, rằng phiên bản debian này sẽ bị kẹt với openssl 1.0.1 và chỉ có debian kéo dài mới có openssl 1.0.2. Nhưng đến ngày phát hành gần như là năm và chrome sẽ sớm ngừng hỗ trợ, vì vậy tôi không muốn mất lợi ích của giao thức http2.

Có giải pháp nào không, làm thế nào để cài đặt openssl 1.0.2 trên hệ thống này, mà không cần xây dựng bản dựng riêng (bảo trì kém) hoặc chờ kho lưu trữ backport có nó? Tôi cũng không muốn hai phiên bản openssl trên hệ thống của mình nếu một trong số chúng phải được liên kết và bảo trì thủ công.

Cảm ơn vì bất kì sự giúp đỡ.


Bạn có thể sử dụng apt pinningvà sử dụng opensslra Debian stretch.
gf_

@gf_ Có nguy cơ phá vỡ hệ thống của bạn rất cao. Rất nhiều thứ phụ thuộc vào OpenSSL.
Michael Hampton

@MichaelHampton Vâng, tôi không thể đánh giá về mức độ rủi ro, tôi nghi ngờ nó rất cao. Tôi đang đi với Kurt Roeckx, một trong những người bảo trì, người đã cố gắng 1.0.2vào jessiengay sau khi đóng băng (lúc đó đã bị từ chối): "Phiên bản này sẽ tương thích với phiên bản 1.0.1. Tôi không mong đợi gì cả để phá vỡ chuyển từ 1.0.1 sang 1.0.2. " (Tôi sẽ nhận thức rõ hơn libc6.)
gf_

@gf_ "Bắt nó vào" trong ngữ cảnh đó sẽ yêu cầu biên dịch lại mọi thứ sử dụng OpenSSL. Tôi không ngạc nhiên khi điều đó bị từ chối; Debian thích cũ và ổn định. Trong ngữ cảnh đề xuất của bạn, điều đó có nghĩa là cũng kéo theo mọi gói kéo dài sử dụng OpenSSL và đó là rất nhiều thứ.
Michael Hampton

@MichaelHampton Tôi khá hiểu về các chính sách của Debian và tôi cũng không ngạc nhiên khi điều này bị từ chối sau đó (không muốn nói điều này hoặc tạo ấn tượng này). Nhưng: (có thể từ ngữ của tôi không chính xác): Thực hiện apt-get install -t stretch nginx(trên vani Debian jessievới nginxcài đặt) sẽ kéo trong: nginx nginx-common nginx-full libnginx-mod-http-auth-pam libnginx-mod-http-geoip libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libssl1.0.2. (Đây là mười gói ..)
gf_

Câu trả lời:


16

Cập nhật 2016/08/08: nginx trong jessie-backports(phiên bản 1.9.10-1~bpo8+3đã được xây dựng openssl >= 1.0.2~. Bắt đầu ALPNlàm việc ngay bây giờ nếu chạy jessiechỉ yêu cầu các gói ra khỏi đó jessie-backports, không cần phải rút các gói ra khỏi đó stretchnữa.

-

Câu trả lời gốc: Vâng, đây là câu trả lời của tôi, theo ý kiến: Theo tôi, không có nhiều cách để giải quyết vấn đề này cho đến ngày hôm nay, 2016/05/09. Về cơ bản, bạn phải thử bằng cách nào đó để có được sự hiện đại nginxtrong hệ thống của bạn, được biên dịch lại >= openssl 1.0.2~.

Hai tùy chọn duy nhất tôi thấy hiện tại: Hoặc bạn tự biên dịch, điều mà bạn không muốn làm, điều này khá dễ hiểu hoặc bạn rút các gói hiện đại ra khỏi Debian stretchhệ thống của mình. Điều này liên quan đến một số rủi ro, bởi vì bạn đang trộn một môi trường ổn định với một môi trường khác, nhưng theo tôi thì những rủi ro này khá thấp, bạn đang sử dụng Debian.

Vì vậy, hãy đi và thử điều này:

  • Thêm Debian stretchkho lưu trữ của bạn apt sources. Đừng sử dụng /etc/apt/sources.listcho việc này mà thay vào đó hãy sử dụng một tệp chuyên dụng /etc/apt/sources.list.d/để giữ sạch sẽ, cá nhân tôi đang sử dụng stretch.list.

    Đặt những dòng này bên trong đó:

    deb http://httpredir.debian.org/debian/ stretch main contrib non-free
    deb-src http://httpredir.debian.org/debian/ stretch main contrib non-free
    
    deb http://security.debian.org/ stretch/updates main contrib non-free
    deb-src http://security.debian.org/ stretch/updates main contrib non-free
    
    # stretch-updates, previously known as 'volatile'
    deb http://httpredir.debian.org/debian/ stretch-updates main contrib non-free
    deb-src http://httpredir.debian.org/debian/ stretch-updates main contrib non-free
    
  • Thiết lập ghim apt để đảm bảo bạn chỉ lấy các gói trong Debian stretchđó bạn chỉ định. Các tập tin để sử dụng cho điều này là /etc/apt/preferences, bên trong đó, đặt:

    Package: *
    Pin: release n=jessie
    Pin-Priority: 900
    
    Package: * 
    Pin: release a=jessie-backports
    Pin-Priority: 500
    
    Package: *
    Pin: release n=stretch
    Pin-Priority: 100
    

    (Bạn có thể phải thay đổi các bộ và ưu tiên để phù hợp với môi trường của mình.)

  • Chạy apt-get update(thông qua sudo/ như root) để cập nhật bộ đệm gói.

  • Cài đặt nginxtừ Debian stretch: apt-get install -t stretch nginx(làm điều này qua sudo/ như root). Lợi nhuận!

  • Như tôi đã mô tả trong (các) nhận xét của mình, để thậm chí giảm các rủi ro liên quan, bạn có thể sử dụng một cái gì đó như chroot hoặc một giải pháp container như LXC . Trong trường hợp bạn muốn đi chroottheo con đường, bạn phải thiết lập giao diện mạng bên trong đó: Để làm điều này, hãy xem blogpost này , ví dụ , giới thiệu về nó network namespaces.

  • Hi vọng điêu nay co ich; trong trường hợp bạn có thêm câu hỏi, hãy liên hệ với tôi. Tôi sẽ đánh giá cao thông tin phản hồi và tôi quan tâm đến cách nó đi.


Tôi đã cài đặt nginx ngày hôm nay theo mô tả câu trả lời của bạn và mọi thứ dường như hoạt động rất tốt! Điều duy nhất, tôi cần phải làm thêm, là gỡ bỏ cài đặt nginx cũ, bởi vì tôi có nginx 1.10 từ kho nginx và phiên bản đó không tương thích với gói kho lưu trữ debian (nhưng tôi cũng đã làm điều này khi tôi đang nâng cấp từ debian nginx đến 1.10, vì vậy nó không thành vấn đề). Cảm ơn bạn đã nỗ lực và giúp đỡ của bạn!
Juraj Nemec

@JurajNemec Tuyệt vời! Cảm ơn rất nhiều về các thông tin phản hồi! Bạn đã kiểm tra ALPNhỗ trợ chưa?
gf_

Đúng. Đã kiểm tra nó bằng thử nghiệm http2thử nghiệm SSL Labs , cả hai tiểu bang, rằng có hỗ trợ ALPN. Cũng nginx -Vcung cấp thông tin, phiên bản được biên dịch với openssl 1.0.2+. Vì vậy, tôi nghĩ rằng nó đang hoạt động chính xác.
Juraj Nemec

@JurajNemec Tuyệt vời, nghe hay đấy! Nếu có thể cho bạn, tôi sẽ quan tâm để có được một bản cập nhật nhỏ sau khi bạn chạy thiết lập này trong một thời gian, có thể bốn hoặc tám tuần. Cảm ơn!
gf_

@JurajNemec Có vẻ như, Google đã thực hiện chuyển đổi và xóa NPN. Thiết lập của bạn vẫn hoạt động như mong đợi?
gf_

11

Một phương pháp khác là cài đặt OpenSSL 1.0.2 từ jessie-backports và sử dụng các bản dựng Ubuntu 16.04 LTS từ kho lưu trữ của nginx. Bằng cách đó, ít nhất bạn đang sử dụng gói OpenSSL được xây dựng cho Jessie.

Thêm vào /etc/apt/sources.list:

# jessie-backports, from stretch-level but with no dependencies
deb http://httpredir.debian.org/debian/ jessie-backports main contrib non-free
deb-src http://httpredir.debian.org/debian/ jessie-backports main contrib non-free

# Nginx repository - use Ubuntu 16.04 LTS Xenial to get packages compiled with OpenSSL 1.0.2
deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx

Sau đó chạy:

apt-get update
apt-get install -t jessie-backports openssl
apt-get install nginx

Điều này rõ ràng đặt bạn vào một cấu hình chính thức không được hỗ trợ, nhưng có lẽ tốt hơn là không có gói nào cả - và nó hoạt động với tôi. Ngoài ra, sử dụng repo của nginx có nghĩa là bạn nhận được các bản cập nhật mới.


Bạn có thể vui lòng giải thích / làm rõ lý do tại sao một người sẽ đi tuyến đường này? Về "Plus, sử dụng repo của nginx có nghĩa là bạn nhận được các bản cập nhật mới.": Bạn cũng đang nhận được "bản cập nhật mới" theo cách tôi đã mô tả.
gf_

Các gói của nginx được cập nhật cùng ngày với bản phát hành của chúng, vì chúng là một phần của quy trình phát hành, không phải là quy trình phát hành của Debian. Tôi đã bao gồm các gói chính, không phải các gói ổn định, nhưng bạn có thể ổn định bằng cách chỉ xóa / dòng chính trong các đường dẫn trên. Mà bạn thích là tùy thuộc vào bạn.
GreenReaper

Để mở rộng ở trên: kéo dài là bản phát hành 'thử nghiệm' hiện tại và do đó có độ trễ tối thiểu dựa trên thời gian cần thiết để chuyển từ thử nghiệm ; và đó là giả định rằng nó làm cho nó không ổn định ngay lập tức - ví dụ: 1.10.0 đã được phát hành vào ngày 26 tháng 4 , nhưng được đẩy lên không ổn định vào ngày 29 tháng 4di chuyển đến kéo dài vào ngày 5 tháng 5 ( xem PTS ).
GreenReaper

1
Tôi khá nhận thức được những sự thật này, cảm ơn. :) Tôi nghĩ rằng câu hỏi đặt ra nếu một người cần "gói mới" (chỉ vì (?)) Nếu cố gắng cung cấp dịch vụ ổn định. AFAIK, nhiều người chọn Debian (và đây là hệ điều hành câu hỏi) vì nó ổn định. Có khá nhiều rủi ro liên quan đến việc chạy các phiên bản phần mềm mới. Nhưng dù sao, tôi đoán không có quy tắc chung về cách người ta xử lý việc này, bởi vì môi trường, kỳ vọng và nhu cầu khác nhau. Bên cạnh đó: Cảm ơn bạn đã đóng góp, tôi chắc chắn nó có giá trị với mọi người; dòng của tôi trước đây không có nghĩa là bất kỳ loại vi phạm.
gf_

1
Như bạn nói, đó là một câu hỏi về mức độ. Nếu bạn muốn ở bên cạnh chảy máu, bạn có thể biên dịch các bản dựng hàng ngày. Trong trường hợp của tôi, ít nhất là trên công nghệ tiên tiến hàng đầu là một lợi thế. Bản thân ALPN có lẽ không cần thiết cho hầu hết các trang web - nhưng nó rất được mong muốn bởi những người muốn sử dụng HTTP / 2 (đặc biệt là nếu trước đây bạn đã có nó trong khi sử dụng NPN); và nhóm mục tiêu này cũng có nhiều khả năng quan tâm đến loại tính năng xuất hiện trong dòng chính nginx trước khi ổn định. Tôi quản lý mười nút bộ đệm và thường thử nó trên một nút nhỏ hơn để kiểm tra dưới tải trước khi đưa nó ra xa hơn.
GreenReaper

0

Một phương pháp khác là sử dụng jessie-backports và sau đó xây dựng lại dễ dàng nginx

thêm vào /etc/apt/source.list backports

deb http://ftp.debian.org/debian jessie-backports main

và sau đó chạy như root

apt-get update
apt-get install -t jessie-backports openssl

và sau đó xây dựng lại nginx. Làm theo hướng dẫn trên https://wiki.debian.org/Bu kiếmAPackage


"[...] Hoặc là bạn tự biên dịch, điều mà bạn không muốn làm [...]"
gf_

0

Đối với tôi cách dễ nhất để khắc phục điều này là sử dụng hình ảnh Nginx Docker khác, xem bản dựng Nginx chính thức trên Docker Hub . Bản dựng Docker Nginx mặc định sử dụng Debian Jessie để không khắc phục vấn đề của bạn, nhưng họ cũng cung cấp bản dựng thay thế dựa trên Alpine Linux . Các bản dựng mới nhất của nó sử dụng OpenSSL 1.0.2!

Do đó, giải pháp này giả định rằng bạn đã cài đặt Docker và vẫn ổn khi chạy Nginx trên Alpine Linuxthay vì Debian Jessie.

Để bắt đầu container Nginx của bạn:

sudo docker run --name nginx-container -p 80:80 -p 443:443 -v /path/to/your/nginx/directory/:/etc/nginx/ /path/to/your/files/to/serve/:/usr/share/nginx/html/ -d nginx:1.11-alpine

Giải thích ngắn để giúp bạn bắt đầu với Docker:

  • docker run: tải xuống hình ảnh Docker (trong trường hợp này nginx:1.11-alpine) nếu bạn chưa có nó và bắt đầu một Docker container dựa trên hình ảnh này
  • --name nginx-container: đặt tên cho bộ chứa Docker (bạn có thể xem tất cả các bộ chứa Docker đang chạy bằng cách sử dụng sudo docker pshoặc sử dụng sudo docker ps -ađể xem các bộ chứa đã dừng)
  • -p 80:80 -p 443:443: liên kết các cổng 80 và 443 trên máy chủ của bạn với các cổng 80 và 443 tương ứng trong bộ chứa Docker
  • -v /path/to/your/nginx/directory/:/etc/nginx/: gắn kết thư mục trên hệ thống máy chủ chứa cấu hình Nginx của bạn vào /etc/nginx/thư mục trong bộ chứa Docker
  • /path/to/your/files/to/serve/:/usr/share/nginx/html/: gắn kết một thư mục trên hệ thống máy chủ của bạn có chứa các tệp bạn muốn Nginx phục vụ
  • -d: khởi động container trong nền (bạn có thể dừng container bằng cách sử dụng docker stop nginx-container)
  • nginx:1.11-alpine: sử dụng hình ảnh này để bắt đầu container của bạn từ ( hình ảnh Nginx Docker chính thức được liệt kê ở đây )

Cũng hữu ích:

  • sử dụng sudo docker exec nginx-container <command>để chạy lệnh trong vùng chứa, ví dụ sudo docker exec nginx-container nginx -s reloadđể tải lại Nginx sau khi bạn thay đổi tệp cấu hình trên hệ thống máy chủ
  • Hoặc sử dụng sudo docker exec -it nginx-container bashđể nhập vỏ bash trong thùng chứa để bạn có thể làm việc trực tiếp ở đó (không được đề xuất, nhưng đôi khi hữu ích)

0

Một cách khác là sử dụng BoringSSL thay vào đó, điều này không ảnh hưởng đến môi trường xung quanh OpenSSL. Dưới đây là chi tiết để tham khảo, https://www.admon.org/hardwares/enable-http2-support-for-nginx-on-debian-jessie


1
Câu trả lời chỉ liên kết có xu hướng trở nên ít hữu ích hơn sau khi liên kết hết hạn. Vui lòng bao gồm phần có liên quan của trang được liên kết vào câu trả lời của bạn.
sendmoreinfo

0

Trong tình huống của tôi, tôi đã sử dụng kho lưu trữ apt Dotdeb. Các hướng dẫn của trang web này cung cấp tùy chọn để thêm một kho lưu trữ cho phép bạn cài đặt Nginx với sự hỗ trợ đầy đủ của HTTP HTTP2. Phiên bản hiện tại là 1.14, một phần nhỏ phía sau bản phát hành cuối cùng, vì vậy bạn sẽ không bị bỏ lại quá xa (backport hiện tại là 1.10).

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.