หมายเหตุ:การอัพเกรดเฟิร์มแว 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)
ปลอดภัยไว้ก่อน
การสำรองข้อมูลการตั้งค่าของคุณ
หากคุณพยายามติดตั้ง nginx อยู่แล้วคุณควรดำเนินการติดตั้งเฟิร์มแวร์ล่าสุดอีกครั้งเพื่อให้ทุกอย่างกลับสู่จุดฐานที่ดี (โปรดระวังหากคุณปรับแต่งใด ๆ / การปรับแต่งภายนอกการกำหนดค่า CLI ปกติหรือตัวเลือกเว็บอินเตอร์เฟส - คุณอาจสูญเสีย)
เนื่องจากคุณจะได้รับการ 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 ของฉัน -
- สำรองข้อมูล config ของฉัน !!!!
- อัปเดตเป็นเฟิร์มแวร์ล่าสุดและรีบูต (และตรวจสอบการทำงานพื้นฐานอื่นที่ไม่ใช่ nginx)
- ลบเฟิร์มแวร์เก่า (ซึ่งขณะนี้เป็นรูปภาพที่ไม่ใช้งาน) โดยใช้
delete system image
คำสั่ง ( show system storage
รายงานการใช้งาน 81% ก่อนการลบและ 37% ใช้งานหลังจากนั้น)
- ตรวจสอบว่าส่ง Ping ภายนอกทำงาน (ping 8.8.8.8) แล้วรีบู๊ตเราเตอร์ถ้าไม่ทำ นี่เป็นปัญหาที่ทราบในเฟิร์มแวร์รุ่นล่าสุดและไม่มีส่วนเกี่ยวข้องกับกระบวนการนี้หรือสคริปต์ที่ใช้
- ใช้สคริปต์ / ขั้นตอนด้านบนเพื่อติดตั้ง nginx อีกครั้ง (
show system storage
รายงานการใช้งาน 71% หลังการติดตั้ง)
- เรียกใช้
sudo apt-get clean
เพื่อเพิ่มพื้นที่ว่างที่ใช้โดยไฟล์ temp และอื่น ๆ ( show system storage
รายงานการใช้งาน 56% หลังจากล้างข้อมูล)