Debian jessie nginx dengan openssl 1.0.2 untuk menggunakan ALPN daripada NPN

14

Saya menjalankan debian jessie di server saya dan baru-baru ini ditingkatkan ke server web nginx baru dengan dukungan http / 2 (nginx 1.10). Seperti hari ini, ini berfungsi dengan baik dan server web mengirimkan konten dengan protokol http2.

Saya telah membaca, bahwa chrome menjatuhkan dukungan NPN dan hanya memungkinkan ALPN setelah 15.5.2016. ALPN adalah ekstensi, yang membutuhkan openssl 1.0.2 diinstal, tetapi pada debian jessie hanya openssl 1.0.1 (juga pada backport debian dan repositori lain, tidak ada versi openssl 1.0.2 untuk debian ini).

Dan ada masalah - saya telah meningkatkan dari SPDY ke http2 dan dalam beberapa hari, saya harus mematikan http2 dan tidak dapat menggunakan SPDY karena versi nignx ini hanya memiliki http2. Saya juga telah membaca, bahwa versi debian ini akan macet dengan openssl 1.0.1 dan hanya debian stretch yang akan memiliki openssl 1.0.2. Tetapi untuk tanggal rilis ada hampir setahun dan chrome akan segera menjatuhkan dukungan, jadi saya tidak ingin kehilangan manfaat dari protokol http2.

Apakah ada solusi, bagaimana cara menginstal openssl 1.0.2 pada sistem ini, tanpa membangun build sendiri (pemeliharaan buruk) atau menunggu repositori backports untuk memilikinya? Saya juga tidak ingin dua versi openssl di sistem saya jika salah satunya harus ditautkan dan dikelola secara manual.

Terima kasih atas bantuannya.

Juraj Nemec
sumber
Anda dapat menggunakan apt pinningdan menggunakan openssldari Debian stretch.
gf_
@ gf_ Beresiko merusak sistem Anda. Banyak hal tergantung pada OpenSSL.
Michael Hampton
@MichaelHampton Ya, saya tidak bisa menilai tentang tingkat risikonya, saya ragu ini sangat tinggi. Saya akan menggunakan Kurt Roeckx, salah satu pengelola, yang mencoba 1.0.2masuk jessietidak lama setelah pembekuan (yang ditolak saat itu): "Versi ini harus kompatibel dengan versi 1.0.1. Saya tidak mengharapkan apa-apa untuk istirahat bergerak dari 1.0.1 ke 1.0.2. " (Saya akan lebih sadar libc6.)
gf_
@ gf_ "Masuk" dalam konteks itu akan membutuhkan kompilasi ulang semua yang menggunakan OpenSSL. Saya tidak terkejut bahwa itu ditolak; Debian suka yang lama dan stabil. Dalam konteks saran Anda, itu berarti juga menarik setiap paket stretch yang menggunakan OpenSSL, dan itu banyak hal.
Michael Hampton
@MichaelHampton Saya cukup sadar akan kebijakan Debian dan saya tidak terkejut juga bahwa ini ditolak saat itu (tidak ingin mengatakan ini atau membuat kesan ini). Tapi: (mungkin kata-kata saya salah): Melakukan apt-get install -t stretch nginx(pada vanili Debian jessiedengan nginxdiinstal) akan menarik: 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. (Ini adalah sepuluh paket ..)
gf_

Jawaban:

16

Perbarui 2016/08/08: nginx dalam jessie-backports(versi 1.9.10-1~bpo8+3dibangun terhadap openssl >= 1.0.2~. MulaiALPN bekerja sekarang jika berjalan jessiehanya membutuhkan paket keluar jessie-backports, tidak perlu lagi menarik paket stretch.

-

Jawaban orisinal: Baiklah, begini jawabannya, menurut komentar: Menurut pendapat saya, tidak ada banyak cara untuk menyelesaikan masalah ini hingga hari ini, 2016/05/09. Pada dasarnya Anda sudah mencoba entah bagaimana untuk mendapatkan yang modern nginxke dalam sistem Anda, dikompilasi terhadap >= openssl 1.0.2~.

Hanya dua opsi yang saya lihat saat ini: Entah Anda mengkompilasi untuk diri sendiri, yang tidak ingin Anda lakukan, yang cukup dimengerti, atau Anda menarik paket modern keluar dari Debian stretchke dalam sistem Anda. Ini melibatkan beberapa risiko, karena Anda mencampur lingkungan yang stabil dengan yang lain, tetapi menurut saya risiko ini cukup rendah, karena Anda menggunakannya Debian.

Jadi, mari kita pergi dan coba ini:

  • Tambahkan Debian stretchrepositori ke apt sources. Jangan gunakan /etc/apt/sources.listuntuk ini, tetapi gunakan file khusus di dalam /etc/apt/sources.list.d/untuk menjaganya tetap bersih, secara pribadi saya menggunakan stretch.list.

    Letakkan garis-garis ini di dalam sana:

    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
    
  • Siapkan pinning yang tepat untuk memastikan Anda hanya menarik paket Debian stretchyang Anda tentukan. File yang akan digunakan untuk ini adalah /etc/apt/preferences, di dalam sana, masukkan:

    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
    

    (Anda mungkin harus mengubah suite dan prioritas agar sesuai dengan lingkungan Anda.)

  • Jalankan apt-get update(via sudo/ as root) untuk memperbarui cache paket.

  • Instal nginxdari Debian stretch: apt-get install -t stretch nginx(lakukan ini via sudo/ sebagai root). Keuntungan!

  • Seperti yang saya jelaskan dalam komentar saya, untuk mengurangi risiko yang terlibat, Anda dapat menggunakan sesuatu seperti chroot atau solusi wadah seperti LXC . Jika Anda ingin melanjutkan chroot, Anda harus mengatur antarmuka jaringan di dalam sana: Untuk melakukan ini, lihat blogpost ini misalnya , yang memberikan pengantar untuk network namespaces.

  • Semoga ini membantu; jika Anda punya pertanyaan lebih lanjut, jangan ragu untuk menghubungi saya. Saya akan menghargai umpan balik dan saya tertarik dengan kelanjutannya.

gf_
sumber
Saya telah menginstal nginx hari ini dengan uraian jawaban Anda dan semuanya tampak bekerja hebat! Satu-satunya hal, saya perlu melakukan ekstra, adalah menghapus instalasi nginx lama, karena saya punya nginx 1.10 dari repositori nginx dan versi itu tidak kompatibel dengan paket repositori debian (tapi saya telah melakukan ini juga ketika saya memutakhirkan dari debian nginx ke 1.10, jadi itu tidak masalah). Terima kasih atas usaha dan bantuan Anda!
Juraj Nemec
@JurajNemec Hebat! Terima kasih banyak atas umpan baliknya! Apakah Anda sudah memeriksa ALPNdukungan?
gf_
Iya. Diperiksa dengan uji http2 dan uji Lab SSL , keduanya menyatakan, bahwa ada dukungan ALPN. Juga nginx -Vmemberikan info, bahwa versi ini dikompilasi dengan openssl 1.0.2+. Jadi saya pikir itu berfungsi dengan benar.
Juraj Nemec
@JurajNemec Hebat, kedengarannya bagus! Jika memungkinkan untuk Anda, saya akan tertarik untuk mendapatkan pembaruan kecil setelah Anda menjalankan pengaturan ini untuk sementara waktu, mungkin empat atau delapan minggu. Terima kasih!
gf_
@JurajNemec Tampaknya, Google beralih dan menghapus NPN. Apakah pengaturan Anda masih berfungsi seperti yang diharapkan?
gf_
11

Metode lain adalah menginstal OpenSSL 1.0.2 dari jessie-backports dan menggunakan Ubuntu 16.04 LTS build dari repositori nginx sendiri. Dengan begitu Anda setidaknya menggunakan paket OpenSSL yang dibuat untuk Jessie.

Tambahkan ke /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

Lalu lari:

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

Ini jelas menempatkan Anda ke dalam konfigurasi yang secara resmi tidak didukung, tetapi mungkin itu lebih baik daripada tidak memiliki paket sama sekali - dan itu berhasil untuk saya. Plus, menggunakan repo nginx berarti Anda mendapatkan pembaruan baru.

GreenReaper
sumber
Bisakah Anda jelaskan / klarifikasi mengapa orang akan menempuh rute ini? Mengenai "Plus, menggunakan repo nginx berarti Anda mendapatkan pembaruan baru.": Anda mendapatkan "pembaruan baru" juga menggunakan cara yang saya jelaskan.
gf_
Paket nginx diperbarui pada hari yang sama dengan rilis mereka, karena mereka adalah bagian dari proses rilis mereka, bukan proses rilis Debian. Saya menyertakan paket-paket mainline, bukan paket-paket stabil, tetapi Anda bisa menjadi stabil dengan hanya menghapus / mainline di jalur-jalur di atas. Yang Anda inginkan terserah Anda.
GreenReaper
Untuk memperluas hal di atas: stretch adalah rilis 'pengujian' saat ini, dan memiliki penundaan minimum berdasarkan berapa lama waktu yang diperlukan untuk beralih dari pengujian ; dan itu dengan asumsi itu membuatnya menjadi tidak stabil segera - misalnya, 1.10.0 dirilis pada 26 April , tetapi didorong ke tidak stabil pada 29 April dan bermigrasi ke peregangan pada 5 Mei ( lihat PTS ).
GreenReaper
1
Saya cukup menyadari fakta-fakta ini, terima kasih. :) Saya pikir pertanyaannya bermuara jika seseorang membutuhkan "paket baru" (hanya karena (?)) Jika mencoba memberikan layanan yang stabil. AFAIK, banyak orang memilih Debian (dan ini adalah OS pertanyaannya) karena stabil. Ada beberapa risiko yang terlibat menjalankan versi perangkat lunak baru. Tapi bagaimanapun, saya kira tidak ada aturan umum bagaimana seseorang menangani ini, karena lingkungan, harapan dan kebutuhan berbeda. Selain: Terima kasih atas masukan Anda, saya yakin itu berharga bagi orang-orang; kalimat saya sebelumnya tidak berarti pelanggaran apa pun.
gf_
1
Seperti yang Anda katakan, ini masalah derajat. Jika Anda ingin berada di tepi pendarahan, Anda bisa mengkompilasi build setiap hari. Dalam kasus saya, setidaknya menjadi yang terdepan dalam teknologi adalah nilai tambah. ALPN sendiri mungkin tidak diperlukan untuk sebagian besar situs - tetapi sangat diinginkan oleh mereka yang ingin menggunakan HTTP / 2 (terutama jika sebelumnya Anda pernah menggunakannya saat menggunakan NPN); dan kelompok sasaran ini juga lebih tertarik pada jenis fitur yang muncul di mainline nginx sebelum stabil. Saya mengelola sepuluh node cache, dan biasanya mencobanya pada yang lebih kecil untuk menguji di bawah beban sebelum meluncurkannya lebih lanjut.
GreenReaper
0

Metode lain adalah dengan menggunakan jessie-backports dan kemudian membangun kembali dengan mudah nginx

tambahkan ke /etc/apt/sources.list backports

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

dan kemudian jalankan sebagai root

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

dan kemudian membangun kembali nginx. Ikuti instruksi di https://wiki.debian.org/BuildingAPackage

StanleyD
sumber
"[...] Entah Anda mengkompilasi untuk diri sendiri, yang tidak ingin Anda lakukan [...]"
gf_
0

Bagi saya cara termudah untuk memperbaikinya adalah dengan menggunakan gambar Nginx Docker yang berbeda, lihat build Nginx resmi di Docker Hub . Docker Nginx build default menggunakan Debian Jessie sehingga tidak akan memperbaiki masalah Anda, tetapi mereka juga menawarkan build alternatif berdasarkan Alpine Linux . Build terbarunya menggunakan OpenSSL 1.0.2!

Solusi ini sehingga mengasumsikan bahwa Anda menginstal Docker dan baik-baik saja dengan menjalankan Nginx pada Alpine Linuxbukan Debian Jessie.

Untuk memulai wadah Nginx Anda:

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

Penjelasan singkat untuk memulai dengan Docker:

  • docker run: mengunduh gambar Docker (dalam hal ini nginx:1.11-alpine) jika Anda belum memilikinya dan memulai wadah Docker berdasarkan gambar ini
  • --name nginx-container: memberi nama wadah Docker (Anda dapat melihat semua kontainer Docker yang sedang berjalan menggunakan sudo docker psatau menggunakan sudo docker ps -ajuga untuk melihat kontainer yang berhenti)
  • -p 80:80 -p 443:443: mengikat port 80 dan 443 pada mesin host Anda masing-masing port 80 dan 443 dalam wadah Docker
  • -v /path/to/your/nginx/directory/:/etc/nginx/: memasang direktori pada sistem host Anda yang berisi konfigurasi Nginx Anda ke /etc/nginx/direktori dalam wadah Docker
  • /path/to/your/files/to/serve/:/usr/share/nginx/html/: me-mount direktori pada sistem host Anda yang berisi file yang ingin Anda layani Nginx
  • -d: memulai wadah di latar belakang (Anda dapat menghentikan wadah menggunakan docker stop nginx-container)
  • nginx:1.11-alpine: gunakan gambar ini untuk memulai wadah Anda ( gambar Nginx Docker resmi tercantum di sini )

Juga bermanfaat:

  • gunakan sudo docker exec nginx-container <command>untuk menjalankan perintah dalam wadah, misalnya sudo docker exec nginx-container nginx -s reloaduntuk memuat ulang Nginx setelah Anda mengubah file konfigurasi pada sistem host
  • Atau gunakan sudo docker exec -it nginx-container bashuntuk memasukkan bash shell dalam wadah sehingga Anda dapat bekerja di sana secara langsung (tidak disarankan, tetapi terkadang bermanfaat)
Sicco
sumber
0

Dalam situasi saya, saya telah menggunakan repositori Dotdeb apt. Instruksi situs web ini memberikan opsi untuk menambahkan repositori yang memungkinkan Anda menginstal Nginx dengan dukungan HTTP2 "penuh". Versi saat ini adalah 1.14 yang merupakan salah satu minor di belakang rilis terakhir, sehingga Anda tidak akan terlalu jauh di belakang (backport saat ini adalah 1,10).

HarmenB
sumber