วิธีใช้ nginx เป็น reverse proxy บนเราเตอร์ Ubiquiti


1

ฉันพยายามเซ็ตอัพ Ubiquiti ErPoe-5 (เฟิร์มแวร์ 1.9.1) ของฉันเพื่อเรียกใช้พร็อกซีย้อนกลับโดยใช้ nginx สองสามวันแล้วและดูเหมือนว่าปัญหาส่วนใหญ่ของฉันเกิดจากข้อเท็จจริงที่ว่าฉันไม่สามารถรับ เวอร์ชันล่าสุดของ nginx บนอุปกรณ์

บทเรียนที่ผมเคยเห็นสำหรับการติดตั้ง Nginx กับมันเพียง แต่ได้รับฉันเท่าที่ Nginx 1.2 ซึ่งไม่ได้มีการสนับสนุนสำหรับ WebSockets หรือ HTTP2 HTTP2 ไม่ใช่ข้อกำหนด แต่การสนับสนุน websockets เป็นสิ่งจำเป็นสำหรับทรัพยากรภายในที่ฉันต้องการเปิดเผยผ่าน reverse proxy ตามจริงแล้วเราท์เตอร์เองก็ใช้พวกเขาในส่วนต่อประสานการจัดการเว็บของตัวเองและมันก็ปรากฏขึ้นจากโพสต์นี้ในฟอรัม ubiquitiที่คุณอาจต้องใช้ HTTP2 ด้วยเช่นกัน

คำตอบ:


3

หมายเหตุ:การอัพเกรดเฟิร์มแว 2.x หรือข้างต้นจะช่วยให้คุณสามารถใช้พื้นที่เก็บข้อมูลยืดใหม่เป็นเอกสารในการกวดวิชาเชื่อมโยงกับในคำถาม Stretch repository อัพเดตแพ็คเกจ nginx เป็น 1.10 ซึ่งรองรับ websockets และ HTTP2 อย่างไรก็ตามขั้นตอนและสคริปต์ด้านล่างยังคงสามารถใช้งานได้ภายใต้ 2.x และดังนั้นคำตอบไม่ได้รับการปรับปรุงเพื่อให้สะท้อนถึงเวอร์ชั่นเฟิร์มแวร์ / แพ็คเกจใหม่เพื่อหลีกเลี่ยงความสับสนสำหรับผู้ที่ไม่ต้องการอัพเกรดเฟิร์มแวร์ 2.x ของเฟิร์มแวร์ทำให้เกิดอาการปวดหัวหลายครั้งสำหรับผู้ใช้งานในช่วงแรกและยังมีปัญหาการเสื่อมประสิทธิภาพในเวอร์ชั่น 2.x เวอร์ชั่นเฟิร์มแวร์)

หมายเหตุ 2:คำตอบนี้ถือว่าคุณมีความรู้เพียงพอเกี่ยวกับคำสั่ง Linux ทั่วไปและ / หรืออย่างน้อยมีความสามารถในการเข้าสู่เราเตอร์ของคุณผ่าน SSH หากคุณไม่ทำเช่นนั้นคุณควรที่จะพูดคุยเกี่ยวกับทักษะของคุณเพื่อตอบสนองความต้องการก่อนที่จะดำเนินการต่อเนื่องจากฉันไม่ได้วางแผนที่จะครอบคลุมพื้นฐานของการเขียนสคริปต์ Linux หรือคำสั่งในคำตอบหรือความคิดเห็นที่ตามมา


ข้อมูลความเป็นมาและข้อสงวนสิทธิ์ (1.2 ปลอดภัย แต่ 1.14 ผลงาน)

ก่อนที่จะปล่อยเฟิร์มแวร์ 2.x เราเตอร์ Ubiquiti จะใช้ Debian 7.11 - เช่น เสียงฮืด ๆ - และสิ่งที่ดีที่สุดที่คุณจะได้รับโดยไม่ทำลายบรรทัดฐานคือ nginx 1.6 (โดยใช้wheezy-backportsพื้นที่เก็บข้อมูลมากกว่าหรือเพิ่มเติมจากwheezy) สิ่งนี้จะใช้งานได้กับการสนับสนุนของ websocket แต่ตัวเลือกใหม่เช่น http2 จะยังคงหายไป

ที่จะได้รับรุ่นใหม่เช่น 1.14 คุณจะต้องก้าวออกจากเขตความสะดวกสบายของคุณบิตและเริ่มใช้ใหม่ Debian 9.5 ที่เก็บ - คือและstretch stretch-backportsฉันพูดว่า "ก้าวออกจากเขตความสะดวกสบายของคุณ" ไม่ใช่เพราะประสบการณ์เลวร้าย แต่เนื่องจากเหตุผลจะบอกว่าอาจมีเหตุผลที่ Ubiquiti ใช้wheezyกับเราเตอร์ในเวอร์ชั่นเฟิร์มแวร์ก่อน 2.x ดังนั้นความเสี่ยงบางอย่างจึงเกี่ยวข้องกับการใช้stretchแพ็คเกจเมื่อขึ้นอยู่กับการอัพเกรดแพ็คเกจอื่น ๆ ที่เราเตอร์อาจใช้ (เช่น. libc6)

ดังนั้นในขณะที่ฉันไม่สามารถบอกวิธีแก้ปัญหาด้านล่างจะไม่ทำลายคุณสมบัติใด ๆ บนเราเตอร์ฉันสามารถพูดได้ว่าฉันใช้คุณสมบัติเราเตอร์ในจำนวนที่พอสมควร (รวมถึงเซิร์ฟเวอร์ / ไคลเอนต์ openvpn, load balancing และ VLANs) ไม่มีปัญหาใด ๆ

ฉันยังสามารถแฟลชเวอร์ชั่นใหม่ของ Ubiquiti EdgeMax OS / เฟิร์มแวร์ (2.0.6) รุ่นใหม่ได้สำเร็จโดยไม่มีปัญหาใด ๆ ซึ่งเปลี่ยนแพคเกจทั้งหมดกลับเป็นสต็อก / รุ่นเริ่มต้น ( แต่ทราบว่าอีกกระพริบเฟิร์มยังผ้าเช็ดทำความสะอาดปรับแต่งใด ๆ / การปรับแต่งที่คุณได้ทำที่คุณไม่ได้เก็บใน/configไดเรกทอรี - เสมอเก็บไว้ภายใต้/configที่ไหนสักแห่งแล้วเพิ่มสคริปต์เริ่มต้นเพื่อ/config/scripts/post-config.dที่รักษาเชื่อมโยงไปยังพวกเขาในสถานที่อื่น ๆ ตามความจำเป็น)

ดังนั้นฉันรู้สึกสบายใจที่บอกว่าการอัพเดท Ubiquiti ในอนาคตจะติดตั้งได้ดีหลังจากการติดตั้งนี้ - แม้ว่าคุณจะต้องติดตั้ง nginx อีกครั้ง (อาจใช้สคริปต์ด้านล่าง)

ตอนนี้คำปฏิเสธความรับผิดชอบตามปกติหมดไปแล้วนี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน


โซลูชันของฉัน (ทำผิดกฎและรับ 1.14)

ปลอดภัยไว้ก่อน

  1. การสำรองข้อมูลการตั้งค่าของคุณ

  2. หากคุณพยายามติดตั้ง nginx อยู่แล้วคุณควรดำเนินการติดตั้งเฟิร์มแวร์ล่าสุดอีกครั้งเพื่อให้ทุกอย่างกลับสู่จุดฐานที่ดี (โปรดระวังหากคุณปรับแต่งใด ๆ / การปรับแต่งภายนอกการกำหนดค่า CLI ปกติหรือตัวเลือกเว็บอินเตอร์เฟส - คุณอาจสูญเสีย)

  3. เนื่องจากคุณจะได้รับการ tinkering กับบริการที่ไดรฟ์เว็บอินเตอร์เฟสมันอาจจะเป็นสมาร์ทที่จะทำความคุ้นเคยกับคำสั่งที่จำเป็นในการปรับปรุงเฟิร์มแฟลชจาก SSHเช่นกัน (เคล็ดลับ: add system image https://dl.ui.com/firmwares/edgemax/v1.10.x/ER-e100.v1.10.10.5210345.tar)

ตอนนี้เพื่อความสนุกสนาน

SSH * เข้าสู่เราเตอร์ของคุณและเรียกใช้สคริปต์ต่อไปนี้ (หรือคำสั่งที่เทียบเท่า) ซึ่งจะ:

  • ตั้งค่าที่เก็บ Debian ที่เหมาะสม ( stretchและstretch-backports)
  • ตั้งค่าลำดับความสำคัญของที่เก็บเป็นที่ต้องการstretch-backports(หากคุณต้องการใช้ nginx 1.10.3 จากนั้นแก้ไขสคริปต์ด้านล่างเพื่อให้ชอบstretchมากกว่าstretch-backportsโดยลบออกจากลำดับความสำคัญ - 910)
  • กำหนดค่าสคริปต์เริ่มต้นที่จะใช้ในการสร้างไดเรกทอรีบันทึก nginx ในแต่ละการบู๊ตระบบ (มิฉะนั้น nginx จะไม่เริ่มทำงานเมื่อเราเตอร์ทำการรีบูต)
  • ดาวน์โหลด / ติดตั้งแพ็คเกจnginx-light ที่เสถียรล่าสุด(1.14.0 ตามการเขียนนี้)

* คุณไม่ควรใช้คุณสมบัติ CLI ในเว็บอินเตอร์เฟสแทน SSH เพราะเว็บอินเตอร์เฟสอาจไม่สามารถใช้งานได้ชั่วคราวเนื่องจากเป็นส่วนหนึ่งของกระบวนการนี้

#! /bin/bash

vcfg=/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper

echo Updating package repositories ...
echo

$vcfg begin

$vcfg delete system package

$vcfg set system package repository stretch url http://http.us.debian.org/debian
$vcfg set system package repository stretch components "main contrib non-free"
$vcfg set system package repository stretch distribution stretch

$vcfg set system package repository stretch-backports url http://http.us.debian.org/debian
$vcfg set system package repository stretch-backports components "main contrib non-free"
$vcfg set system package repository stretch-backports distribution stretch-backports

$vcfg commit

$vcfg end

apt-get update

echo
echo Setting repository priorities ...
echo

echo "Package: *
Pin: release a=stretch
Pin-Priority: 900

Package: *
Pin: release a=stretch-backports
Pin-Priority: 910">/etc/apt/preferences.d/stretch

echo
echo Temporarily stopping the current web interface ...
echo
kill -SIGTERM $(cat /var/run/lighttpd.pid)

echo
echo Installing nginx-light ...
echo

echo "#! /bin/bash
[ -d /var/log/nginx ] || mkdir /var/log/nginx">/config/scripts/post-config.d/create_nginx_log_dir
chmod a+x /config/scripts/post-config.d/create_nginx_log_dir

[ -d /var/log/nginx ] || mkdir /var/log/nginx

apt-get install nginx-light -V -y

echo
echo Restarting the old web interface ...
echo
service nginx stop
/usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf

echo
echo Updating the nginx default site listen on non-standard ports ...
echo

sed -i -E 's/^(\s*)(listen\s+(:|\[|\])*)([0-9]+)(;|\s)/\1\2\4\4\5/g' /etc/nginx/sites-enabled/default

echo
echo Starting the nginx service ...
echo

service nginx start

echo
echo Installation complete.

[ตอบ "y Enter" เพื่อแจ้งเกี่ยวกับการเริ่มบริการใหม่]

ตอนนี้คุณควรมีการติดตั้ง nginx ที่ใช้งานได้และคุณควรจะสามารถทดสอบได้โดยไปที่http://<router IP address>:8080เว็บเบราว์เซอร์ของคุณ โปรดสังเกตว่าพอร์ตการใช้งาน8080ที่ควรได้รับการกำหนดค่าโดยsedคำสั่งในสคริปต์ด้านบนแทนที่จะเป็นค่าเริ่มต้นของพอร์ต80ซึ่งอาจมีความขัดแย้งกับเว็บอินเตอร์เฟสเราเตอร์เริ่มต้นของคุณ

nginx จะทำหน้าที่เป็น reverse proxy สำหรับเราเตอร์ของคุณหรือไม่?

ผมเองชอบที่จะใช้พอร์ตที่ไม่ได้มาตรฐาน (553 ในตัวอย่างการตั้งค่าด้านล่าง) สำหรับlighttpdบริการ / GUI ให้โดยเริ่มต้นที่เราเตอร์แล้วใช้ Nginx (การฟังในพอร์ตมาตรฐาน 80/443) เป็น proxy lighttpdย้อนกลับ สิ่งนี้ช่วยให้ฉันใช้ชื่อโดเมนเดียวสำหรับเว็บไซต์เครือข่ายท้องถิ่นของฉันรวมถึงเราเตอร์ (เช่น router.myhouse.com, nas.myhouse.com ฯลฯ ) หากคุณต้องการทำเช่นเดียวกันคุณสามารถเปลี่ยนพอร์ต GUI โดยใช้configure -> set service gui http(s)-port ###คำสั่งหรือโดยการเปลี่ยนแปลงเดียวกันในConfig Treeส่วนของเว็บอินเตอร์เฟส / GUI

กำหนดค่า nginx ด้วยไฟล์กำหนดค่าพร็อกซีย้อนกลับ

ถัดไปคุณจะต้องกำหนดค่า nginx ให้ทำหน้าที่เป็น reverse proxy สำหรับทรัพยากรบางอย่าง โดยทั่วไปนี่จะเป็นทรัพยากรเครือข่ายท้องถิ่นที่สามารถเข้าถึงได้โดยใช้ชื่อโฮสต์ / โดเมนเฉพาะใน URL ที่แก้ไขพอร์ตการฟัง nginx ของเราเตอร์

ในการทำเช่นนี้คุณจะสร้างไฟล์กำหนดค่า nginx ใน/etc/nginx/sites-enabledไดเรกทอรีของคุณ(หรือดีกว่ายังสร้างไว้ภายใต้/config/user-dataจากนั้นสร้างลิงก์ไปยังที่อยู่ภายใต้/etc/nginx/sites-enabledไดเรกทอรี - ซึ่งจะทำให้การกู้คืนง่ายขึ้นจากการอัพเกรดที่รีเซ็ต/etcเนื้อหาไดเรกทอรี)

มีตัวอย่างมากมายของไฟล์กำหนดค่า nginx ออนไลน์ แต่ตัวอย่างด้านล่างอาจเป็นประโยชน์หากคุณวางแผนที่จะใส่เราเตอร์ของคุณ (หรือเว็บไซต์อื่น ๆ ที่ใช้ websockets) ด้านหลังพร็อกซีย้อนกลับของ nginx หรือถ้าคุณกำลังมองหาที่จะวาง Synology NAS ไว้ด้านหลังโดยเฉพาะ (สถานีถ่ายภาพโดยเฉพาะนั้นค่อนข้างยุ่งยาก)

upstream edgemax {
  server 192.168.1.1:553;
  keepalive 32;
}

upstream nas {
  server 192.168.1.7:5001;
  keepalive 32;
}

upstream nasphoto {
  server 192.168.1.5:443;
  keepalive 32;
}

upstream nasfile {
  server 192.168.1.7:7001;
  keepalive 32;
}

server {
  listen 443 ssl http2;
  server_name router.*;

  ssl_certificate /config/user-data/ssl_chain_key.pem;
  ssl_certificate_key /config/user-data/ssl_chain_key.pem;

  client_max_body_size 0;
  proxy_http_version 1.1;
  proxy_buffering off;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "Upgrade";
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  location / {
    proxy_pass https://edgemax;
  }
}

server {
  listen 443 ssl http2;
  server_name nas.*;

  ssl_certificate /config/user-data/ssl_chain_key.pem;
  ssl_certificate_key /config/user-data/ssl_chain_key.pem;

  client_max_body_size 0;
  proxy_http_version 1.1;
  proxy_buffering off;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "Upgrade";
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;

  location / {
    proxy_pass https://nas;
  }

  location /photo {
    proxy_pass https://nasphoto/photo;
  }
}

server {
  listen 443 ssl http2;
  server_name files.*;

  ssl_certificate /config/user-data/ssl_chain_key.pem;
  ssl_certificate_key /config/user-data/ssl_chain_key.pem;

  client_max_body_size 0;
  proxy_http_version 1.1;
  proxy_buffering off;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "Upgrade";
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;

  location / {
    proxy_pass https://nasfile;
  }
}

server {
  listen 443 ssl http2;
  server_name photos.*;

  ssl_certificate /config/user-data/ssl_chain_key.pem;
  ssl_certificate_key /config/user-data/ssl_chain_key.pem;

  client_max_body_size 0;
  proxy_http_version 1.1;
  proxy_buffering off;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "Upgrade";
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;

  rewrite ^/photo/(.*)$ /$1;

  location / {
    proxy_pass https://nasphoto/photo/;
  }
}

เมื่อไฟล์กำหนดค่าพร็อกซีย้อนกลับอยู่ในสถานที่คุณสามารถเรียกใช้sudo service nginx restartเพื่อให้มีประสิทธิภาพ อ้างถึง/var/log/nginx/error.logหากมีปัญหา

เคล็ดลับ # 1:หากคุณวางแผนที่จะใช้พอร์ตที่ไม่ได้มาตรฐานสำหรับ Nginx ของคุณพร็อกซีย้อนกลับ (. คือการตั้งค่าพร็อกซีของคุณกลับบอกว่าสิ่งอื่น ๆ กว่าlisten 80และ / หรือlisten 443) แล้วคุณต้องการอาจจะทำหน้าที่ได้ดีจะเข้ามาแทนที่proxy_set_header Host $host;ในการตั้งค่าดังกล่าวข้างต้น proxy_set_header Host $http_host;กับ นี่เป็นสิ่งสำคัญอย่างยิ่งสำหรับเว็บซ็อกเก็ตที่ดูเหมือนจะต้องการให้เว็บไคลเอนต์ร้องขอการรับส่งข้อมูลจากพอร์ตเริ่มต้นเป็นอย่างอื่น - นำไปสู่อินเทอร์เฟซที่ขาดองค์ประกอบหรือข้อมูลสด (คุณสามารถลองproxy_set_header Host $host:$server_port;ได้ แต่โปรดทราบว่านี่จะแตกต่างอย่างชัดเจนเนื่องจากจะเพิ่มพอร์ตไปยังส่วนหัวเสมอแม้ว่าจะไม่ได้ใช้ในคำขอเดิม)

เคล็ดลับ # 2:นอกจากนี้โปรดทราบว่าการใช้server_name router.*ซึ่งก็หมายความว่าการใช้ URL router.<anything>.<anything>เพื่อเรียกดูพร็อกซีย้อนกลับ nginx จะทำให้ส่วนของการกำหนดค่านั้นถูกนำไปใช้ (ตัวอย่างส่วนใหญ่คุณจะพบว่าใช้ชื่อโดเมนเต็ม / ชัดเจนเช่นrouter.domain.com)

สิ่งนี้มีประโยชน์ไม่เพียง แต่เพื่อจุดประสงค์ในการเปลี่ยนชื่อโดเมน / ชื่อ DNS (เช่นทำงานได้router.home.comดีและrouter.home.netไม่เปลี่ยนการตั้งค่า) แต่ยังช่วยให้server_nameรายการของคุณสั้น สิ่งนี้มีความสำคัญเนื่องจากการมีชื่อยาวมักจะทำให้เกิดข้อผิดพลาดในการพูดถึงสิ่งที่มีผลต่อ "เพิ่มขนาดที่ฝากข้อมูล" เมื่อคุณเริ่ม nginx หากคุณต้องมีชื่อยาวคุณอาจต้องปรับแต่งค่าของserver_names_hash_max_sizeและ / หรือserver_names_hash_bucket_sizeภายใน config ของคุณ


อัปเดต:ฉันได้อัปเดตเราเตอร์ของฉันจาก EdgeOS เวอร์ชัน 1.9.1 เป็นทุกรุ่นเรียบร้อยแล้วและรวมถึง 2.0.6 โดยไม่มีปัญหา เราเตอร์ไม่ได้มี nginx อยู่หลังจากอัปเดต (ตามที่คาดไว้) แต่ฉันสามารถเรียกใช้สคริปต์ของฉัน (บล็อกรหัสแรกในคำตอบนี้) และมันกลับมาทันที การปรับแต่งของคุณให้อยู่ภายใต้/configและใช้สคริปต์ภายใต้/config/scripts/post-config.dเพื่อรักษาความเปลี่ยนแปลงที่ไม่รอดการรีบูต / อัปเกรดเป็นกุญแจสำคัญในการออกเรืออย่างราบรื่นที่นี่

UPDATE # 2: กระบวนการนี้ทำงานบนเราเตอร์ขนาดเล็กเช่น ER-X เช่นกัน อย่างไรก็ตามเนื่องจากพื้นที่เก็บข้อมูลที่ จำกัด มีอยู่ในอุปกรณ์คุณจะถูกบังคับให้ลบอิมเมจเฟิร์มแวร์ที่ไม่ใช้งานออกเพื่อให้มีพื้นที่สำหรับ nginx สิ่งนี้จะต้องทำหลังจากการอัพเดทแต่ละครั้งเช่นกัน หากต้องการลบอิมเมจเฟิร์มแวร์ที่ไม่ใช้งานให้เรียกใช้delete system imageและตอบตกลงกับข้อความแจ้ง

- กระบวนการอัปเดต ER-X ของฉัน -

  1. สำรองข้อมูล config ของฉัน !!!!
  2. อัปเดตเป็นเฟิร์มแวร์ล่าสุดและรีบูต (และตรวจสอบการทำงานพื้นฐานอื่นที่ไม่ใช่ nginx)
  3. ลบเฟิร์มแวร์เก่า (ซึ่งขณะนี้เป็นรูปภาพที่ไม่ใช้งาน) โดยใช้delete system imageคำสั่ง ( show system storageรายงานการใช้งาน 81% ก่อนการลบและ 37% ใช้งานหลังจากนั้น)
  4. ตรวจสอบว่าส่ง Ping ภายนอกทำงาน (ping 8.8.8.8) แล้วรีบู๊ตเราเตอร์ถ้าไม่ทำ นี่เป็นปัญหาที่ทราบในเฟิร์มแวร์รุ่นล่าสุดและไม่มีส่วนเกี่ยวข้องกับกระบวนการนี้หรือสคริปต์ที่ใช้
  5. ใช้สคริปต์ / ขั้นตอนด้านบนเพื่อติดตั้ง nginx อีกครั้ง ( show system storageรายงานการใช้งาน 71% หลังการติดตั้ง)
  6. เรียกใช้sudo apt-get cleanเพื่อเพิ่มพื้นที่ว่างที่ใช้โดยไฟล์ temp และอื่น ๆ ( show system storageรายงานการใช้งาน 56% หลังจากล้างข้อมูล)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.