Debian jessie nginx พร้อม openssl 1.0.2 เพื่อใช้ ALPN มากกว่า NPN


14

ฉันใช้ jessie debian บนเซิร์ฟเวอร์ของฉันและเพิ่งอัพเกรดเป็นเว็บเซิร์ฟเวอร์ nginx ใหม่พร้อมการสนับสนุน http / 2 (nginx 1.10) วันนี้มันใช้งานได้ดีและเว็บเซิร์ฟเวอร์ส่งเนื้อหาด้วยโปรโตคอล http2

ฉันได้อ่านแล้วChrome นั้นกำลังลดการสนับสนุน NPNและอนุญาตให้ ALPN เท่านั้นหลังจาก 15.5.2016 ALPN เป็นส่วนขยายซึ่งจำเป็นต้องติดตั้ง openssl 1.0.2 แต่บนเดเบียนเจสซีเป็น openssl 1.0.1 เท่านั้น (เช่นเดียวกับเดกซ์แบ็กและแหล่งเก็บข้อมูลอื่นไม่มีรุ่น openssl 1.0.2 สำหรับเดเบียนนี้)

และมีปัญหา - ฉันได้อัพเกรดจาก SPDY เป็น http2 และในอีกไม่กี่วันฉันจะต้องปิด http2 และไม่สามารถใช้ SPDY ได้เนื่องจาก nignx รุ่นนี้มี http2 เท่านั้น ฉันได้อ่านแล้วว่าเดเบียนเวอร์ชันนี้จะติดอยู่กับ openssl 1.0.1 และเดซิเบลยืดเท่านั้นที่จะเปิด openssl 1.0.2 แต่ถึงวันวางจำหน่ายจะมีเวลาเกือบปีและโครมจะลดลงในไม่ช้าดังนั้นฉันจึงไม่ต้องการที่จะสูญเสียประโยชน์ของโปรโตคอล http2

มีวิธีแก้ไขติดตั้ง openssl 1.0.2 บนระบบนี้โดยไม่ต้องสร้างบิลด์ (การบำรุงรักษาที่ไม่ดี) หรือรอให้ที่เก็บ backport มีหรือไม่? ฉันไม่ต้องการ openssl สองเวอร์ชันในระบบของฉันหากหนึ่งในนั้นต้องเชื่อมโยงและบำรุงรักษาด้วยตนเอง

ขอบคุณสำหรับความช่วยเหลือ


คุณสามารถใช้apt pinningและใช้ออกจากopenssl Debian stretch
gf_

@gf_ มีความเสี่ยงสูงมากที่จะทำลายระบบของคุณ หลายสิ่งขึ้นอยู่กับ OpenSSL
Michael Hampton

@MichaelHampton ดีฉันไม่สามารถตัดสินเกี่ยวกับระดับความเสี่ยงฉันสงสัยว่ามันสูงมาก ฉันจะไปกับ Kurt Roeckx หนึ่งในผู้ดูแลที่พยายาม1.0.2เข้ามาjessieไม่นานหลังจากการแช่แข็ง (ซึ่งถูกปฏิเสธไปแล้ว): "เวอร์ชั่นนี้ควรเข้ากันได้กับเวอร์ชั่น 1.0.1 ฉันไม่คาดหวังอะไรเลย เพื่อหยุดการเคลื่อนที่จาก 1.0.1 เป็น 1.0.2 " (ฉันจะรับรู้มากขึ้นlibc6)
gf_

@gf_ "การรับมัน" ในบริบทนั้นต้องมีการคอมไพล์ใหม่ทุกอย่างที่ใช้ OpenSSL ฉันไม่แปลกใจที่ถูกปฏิเสธ เดเบียนชอบอายุและมั่นคง ในบริบทของข้อเสนอแนะของคุณมันหมายถึงการดึงในทุกแพ็คเกจยืดที่ใช้ OpenSSL และนั่นคือสิ่งที่มากมาย
Michael Hampton

@MichaelHampton ฉันค่อนข้างตระหนักถึงนโยบายของเดเบียนและฉันก็ไม่แปลกใจเช่นกันที่สิ่งนี้ถูกปฏิเสธในตอนนั้น แต่ (อาจจะใช้ถ้อยคำของฉันไม่ถูกต้อง): ทำapt-get install -t stretch nginx(ในวานิลลาDebian jessieที่มีnginxการติดตั้ง) 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จะดึงใน: (เหล่านี้คือสิบแพ็คเกจ .. )
gf_

คำตอบ:


16

ปรับปรุง 2016/08/08: nginxในjessie-backports(รุ่น1.9.10-1~bpo8+3ที่ถูกสร้างขึ้นกับopenssl >= 1.0.2~การ. ALPNทำงานตอนนี้ถ้าทำงานjessieก็ต้องแพคเกจออกมาจากไม่จำเป็นอีกต่อไปที่แพคเกจดึงออกมาจากjessie-backportsstretch

-

คำตอบเดิม:ดีไปที่คำตอบของฉันตามความคิดเห็น: ในความคิดของฉันมีหลายวิธีที่จะแก้ปัญหานี้ ณ วันนี้ 2016/05/09 โดยทั่วไปคุณได้ลองอย่างใดที่จะได้รับที่ทันสมัยในระบบของคุณรวบรวมกับnginx>= openssl 1.0.2~

สองทางเลือกที่ฉันเห็นในปัจจุบัน: ไม่ว่าคุณจะคอมไพล์ด้วยตัวคุณเองซึ่งคุณไม่ต้องการทำซึ่งค่อนข้างเข้าใจได้หรือคุณดึงแพ็คเกจที่ทันสมัยออกมาจากDebian stretchระบบของคุณ เรื่องนี้เกี่ยวข้องกับความเสี่ยงบางอย่างเพราะคุณกำลังผสมสภาพแวดล้อมที่มั่นคงกับอีกคนหนึ่ง แต่ในความคิดของฉันความเสี่ยงเหล่านี้จะค่อนข้างต่ำเพราะDebianคุณกำลังใช้

ดังนั้นไปลองทำสิ่งนี้:

  • เพิ่มพื้นที่เก็บข้อมูลของคุณDebian stretch apt sourcesอย่าใช้/etc/apt/sources.listสิ่งนี้ แต่ใช้ไฟล์เฉพาะภายใน/etc/apt/sources.list.d/เพื่อรักษาความสะอาดโดยส่วนตัวแล้วฉันใช้stretch.listอยู่

    ใส่บรรทัดเหล่านี้ไว้ข้างใน:

    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
    
  • ตั้งค่าการปักหมุดเพื่อให้แน่ใจว่าคุณดึงเฉพาะแพ็คเกจDebian stretchที่คุณกำลังระบุเท่านั้น ไฟล์ที่ใช้สำหรับสิ่งนี้คือ/etc/apt/preferencesข้างในใส่:

    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
    

    (คุณอาจต้องเปลี่ยนชุดและลำดับความสำคัญเพื่อให้เหมาะกับสภาพแวดล้อมของคุณ)

  • เรียกใช้apt-get update(ผ่านsudo/ เป็นroot) เพื่ออัปเดตแคชแพ็กเกจ

  • ติดตั้งnginxจากDebian stretch: apt-get install -t stretch nginx(ทำสิ่งนี้ผ่านsudo/ as root) กำไร!

  • ขณะที่ผมอธิบายไว้ในความคิดเห็นของฉัน (s), ที่จะได้ลดความเสี่ยงที่เกี่ยวข้องคุณสามารถใช้สิ่งที่ต้องการchrootหรือภาชนะการแก้ปัญหาอย่างLXC ในกรณีที่คุณต้องการที่จะไปchrootทางคุณต้องตั้งค่าเชื่อมต่อเครือข่ายภายในมี: การทำเช่นนี้มีลักษณะที่ blogpost เช่นนี้network namespacesซึ่งจะช่วยให้คำแนะนำเกี่ยวกับ

  • หวังว่านี่จะช่วยได้ ในกรณีที่คุณมีคำถามเพิ่มเติมโปรดติดต่อฉัน ฉันขอขอบคุณข้อเสนอแนะและฉันสนใจว่ามันจะไปอย่างไร


ฉันได้ติดตั้ง nginx วันนี้โดยคำอธิบายคำตอบของคุณและทุกอย่างดูเหมือนจะทำงานได้ดี! สิ่งเดียวที่ฉันต้องทำเพิ่มเติมคือการลบการติดตั้ง nginx เก่าเพราะฉันมี nginx 1.10 จากที่เก็บ nginx และรุ่นนั้นไม่สามารถใช้งานร่วมกับแพคเกจที่เก็บ debian (แต่ฉันได้ทำเช่นนี้เมื่อฉันอัพเกรดจาก debian nginx ถึง 1.10 ดังนั้นจึงไม่เป็นปัญหา) ขอบคุณสำหรับความพยายามและความช่วยเหลือของคุณ!
Juraj Nemec

@JurajNemec ยอดเยี่ยม! ขอบคุณมากสำหรับความคิดเห็น! คุณตรวจสอบการALPNสนับสนุนแล้วหรือยัง?
gf_

ใช่. ตรวจสอบโดยการทดสอบ http2และการทดสอบSSL Labsทั้งสองสถานะว่ามีการสนับสนุน ALPN นอกจากนี้ยังnginx -Vให้ข้อมูลว่ารุ่นจะรวบรวมกับ OpenSSL 1.0.2+ ดังนั้นฉันคิดว่ามันทำงานได้อย่างถูกต้อง
Juraj Nemec

@JurajNemec เยี่ยมมากฟังดูดี! หากเป็นไปได้สำหรับคุณฉันสนใจที่จะได้รับการอัปเดตเล็กน้อยหลังจากที่คุณใช้งานการตั้งค่านี้เป็นระยะเวลาหนึ่งอาจจะสี่หรือแปดสัปดาห์ ขอบคุณ!
gf_

@JurajNemec ดูเหมือนว่า Google ได้สร้างสวิตช์และนำ NPN ออกแล้ว การตั้งค่าของคุณยังคงทำงานตามที่คาดไว้หรือไม่?
gf_

11

อีกวิธีหนึ่งคือการติดตั้ง OpenSSL 1.0.2 จาก jessie-backport และใช้ Ubuntu 16.04 LTS builds จากที่เก็บของ nginx อย่างน้อยคุณก็ใช้แพ็คเกจ OpenSSL ที่สร้างขึ้นสำหรับ Jessie

เพิ่มไปที่/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

จากนั้นเรียกใช้:

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

เห็นได้ชัดว่านี่ทำให้คุณเข้าสู่การกำหนดค่าที่ไม่ได้รับการสนับสนุนอย่างเป็นทางการแต่อาจจะดีกว่าการไม่มีแพ็คเกจเลย - และมันก็ใช้ได้สำหรับฉัน นอกจากนี้การใช้ repo ของ nginx หมายความว่าคุณได้รับการอัพเดตใหม่


คุณช่วยอธิบายรายละเอียดเพิ่มเติมได้ไหมว่าทำไมคนเราถึงเลือกเส้นทางนี้ เกี่ยวกับ "Plus, การใช้ repo ของ nginx หมายความว่าคุณได้รับการอัพเดทใหม่": คุณได้รับ "การอัพเดทใหม่" รวมถึงวิธีที่ฉันได้อธิบายไว้
gf_

แพ็คเกจของ nginx ได้รับการอัพเดตในวันเดียวกับรีลีสเนื่องจากเป็นส่วนหนึ่งของกระบวนการวางจำหน่ายไม่ใช่กระบวนการวางจำหน่ายของเดเบียน ฉันรวมแพคเกจ mainline ไม่ใช่แพ็คเกจที่มีเสถียรภาพ แต่คุณสามารถรับความมั่นคงได้โดยเพียงแค่ลบ / mainline ในเส้นทางข้างต้น สิ่งที่คุณต้องการนั้นขึ้นอยู่กับคุณ
GreenReaper

เพื่อขยายในข้างต้น: ยืดปัจจุบัน 'ทดสอบ' ปล่อยและเพื่อให้มีความล่าช้าขั้นต่ำขึ้นอยู่กับว่าจะใช้เวลานานที่จะย้ายจากการทดสอบ ; และนั่นคือการทำให้มันไม่เสถียรในทันที - ตัวอย่างเช่น 1.10.0 ได้เปิดตัว 26 เม.ย.แต่ผลักไปสู่ความไม่เสถียร 29 เม.ย.และอพยพไปยืดในวันที่ 5 พฤษภาคม ( ดู PTS )
GreenReaper

1
ฉันค่อนข้างตระหนักถึงข้อเท็จจริงเหล่านี้ขอบคุณ :) ฉันคิดว่าคำถามจะเดือดร้อนหากใครต้องการ "แพ็คเกจใหม่" (เพียงเพราะ (?)) หากพยายามให้บริการที่มั่นคง AFAIK หลายคนเลือก Debian (และนี่คือระบบปฏิบัติการที่เป็นปัญหาเกี่ยวกับ) เพราะมันเสถียร มีความเสี่ยงค่อนข้างน้อยในการใช้งานซอฟต์แวร์เวอร์ชันใหม่ แต่อย่างไรก็ตามฉันเดาว่าไม่มีกฎทั่วไปว่าจะจัดการกับเรื่องนี้อย่างไรเนื่องจากสภาพแวดล้อมความคาดหวังและความต้องการต่างกัน นอกจากนี้: ขอบคุณสำหรับข้อมูลของคุณฉันแน่ใจว่ามันมีค่ากับคน; บรรทัดของฉันก่อนไม่ได้หมายถึงการกระทำผิดกฎหมายใด ๆ
gf_

1
อย่างที่คุณพูดมันเป็นคำถามระดับ หากคุณต้องการที่จะอยู่บนขอบเลือดออกคุณสามารถรวบรวมงานสร้างทุกวัน ในกรณีของฉันการเป็นผู้นำเทคโนโลยีที่ชาญฉลาดอย่างน้อยก็เป็นข้อดี ALPN นั้นอาจไม่จำเป็นสำหรับไซต์ส่วนใหญ่ - แต่เป็นที่ต้องการอย่างมากสำหรับผู้ที่ต้องการใช้ HTTP / 2 (โดยเฉพาะถ้าคุณเคยใช้มาก่อนในขณะที่ใช้ NPN) และกลุ่มเป้าหมายนี้มีแนวโน้มที่จะสนใจคุณสมบัติประเภทที่ปรากฏขึ้นในการฉีด nginx ก่อนที่จะมีเสถียรภาพ ฉันจัดการแคชสิบโหนดและโดยปกติแล้วจะลองใช้กับโหนดที่เล็กกว่าเพื่อทดสอบภายใต้การโหลดก่อนที่จะเริ่มต้นต่อไป
GreenReaper

0

วิธีอื่นคือการใช้ jessie-backport และสร้างใหม่ได้อย่างง่ายดาย nginx

เพิ่มไปที่ backet /etc/apt/sources.list

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

จากนั้นเรียกใช้เป็นรูต

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

จากนั้นสร้าง nginx ใหม่ ทำตามคำแนะนำในhttps://wiki.debian.org/BuildingAPackage


"[... ] ไม่ว่าคุณจะคอมไพล์ด้วยตัวเองซึ่งคุณไม่ต้องการทำ [... ]"
gf_

0

สำหรับผมวิธีที่ง่ายที่สุดในการแก้ไขปัญหานี้คือการใช้ที่แตกต่างกันภาพ Nginx เทียบท่าให้ดูที่การสร้าง Nginx อย่างเป็นทางการในหาง Hub เริ่มต้นหาง Nginx สร้างใช้ Debian เจสซีเพื่อที่จะไม่สามารถแก้ไขปัญหาของคุณ แต่พวกเขายังมีทางเลือกที่สร้างขึ้นอยู่กับอัลไพน์ลินุกซ์ บิวด์ล่าสุดของมันใช้ OpenSSL 1.0.2!

การแก้ปัญหานี้จึงอนุมานว่าคุณติดตั้งหางและจะมีการปรับกับการทำงาน Nginx บนแทนAlpine LinuxDebian Jessie

วิธีเริ่มคอนเทนเนอร์ Nginx ของคุณ:

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

คำอธิบายสั้น ๆ เพื่อให้คุณเริ่มต้นกับ Docker:

  • docker run: ดาวน์โหลดอิมเมจ Docker (ในกรณีนี้nginx:1.11-alpine) หากคุณยังไม่มีมันและเริ่มคอนเทนเนอร์ Docker ตามอิมเมจนี้
  • --name nginx-container: ตั้งชื่อให้กับ Docker container (คุณสามารถดูคอนเทนเนอร์ Docker ที่กำลังทำงานอยู่โดยใช้sudo docker psหรือใช้sudo docker ps -aเพื่อดู container ที่หยุดทำงานด้วย)
  • -p 80:80 -p 443:443: ผูกพอร์ต 80 และ 443 บนเครื่องโฮสต์ของคุณกับพอร์ต 80 และ 443 ตามลำดับในคอนเทนเนอร์ Docker
  • -v /path/to/your/nginx/directory/:/etc/nginx/: เมานต์ไดเร็กทอรีบนระบบโฮสต์ของคุณซึ่งมีการกำหนดค่า Nginx ของคุณไปยัง/etc/nginx/ไดเร็กทอรีในคอนเทนเนอร์ Docker
  • /path/to/your/files/to/serve/:/usr/share/nginx/html/: เมานต์ไดเรกทอรีบนระบบโฮสต์ของคุณซึ่งมีไฟล์ที่คุณต้องการให้ Nginx ให้บริการ
  • -d: เริ่มต้นคอนเทนเนอร์ในพื้นหลัง (คุณสามารถหยุดใช้คอนเทนเนอร์ได้docker stop nginx-container)
  • nginx:1.11-alpine: ใช้ภาพนี้เพื่อเริ่มภาชนะของคุณ ( ภาพ Nginx Docker อย่างเป็นทางการอยู่ที่นี่ )

มีประโยชน์ด้วย:

  • ใช้sudo docker exec nginx-container <command>เพื่อเรียกใช้คำสั่งในคอนเทนเนอร์เช่นsudo docker exec nginx-container nginx -s reloadเพื่อโหลด Nginx หลังจากที่คุณเปลี่ยนไฟล์การกำหนดค่าบนระบบโฮสต์
  • หรือใช้sudo docker exec -it nginx-container bashเพื่อป้อน bash shell ในคอนเทนเนอร์เพื่อให้คุณสามารถทำงานได้โดยตรง (ไม่แนะนำ แต่บางครั้งก็มีประโยชน์)

0

อีกทางเลือกหนึ่งคือใช้ BoringSSL แทนซึ่งจะไม่ส่งผลเสียต่อสภาพแวดล้อมของ OpenSSL นี่คือรายละเอียดที่อ้างอิงถึงhttps://www.admon.org/hardwares/enable-http2-support-for-nginx-on-debian-jessie


1
คำตอบสำหรับลิงก์เท่านั้นมีแนวโน้มที่จะมีประโยชน์น้อยลงหลังจากลิงก์หมดอายุ โปรดรวมส่วนที่เกี่ยวข้องของหน้าที่เชื่อมโยงไว้ในคำตอบของคุณ
sendmoreinfo

0

ในสถานการณ์ของฉันฉันได้ใช้ที่เก็บ apt Dotdeb คำแนะนำของเว็บไซต์นี้ให้ตัวเลือกในการเพิ่มที่เก็บซึ่งช่วยให้คุณติดตั้ง Nginx ด้วยการสนับสนุน HTTP2“ เต็ม” รุ่นปัจจุบันคือ 1.14 ซึ่งเป็นรุ่นรองหลังรุ่นล่าสุดดังนั้นคุณจะไม่ไปไกลเกินกว่านี้ (backport ปัจจุบันคือ 1.10)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.