Android

การตั้งค่าพร็อกซีย้อนกลับ nginx

How To Make a Reverse Proxy with NGINX 2020

How To Make a Reverse Proxy with NGINX 2020

สารบัญ:

Anonim

พร็อกซีย้อนกลับคือบริการที่รับคำขอของลูกค้าส่งคำขอไปยังเซิร์ฟเวอร์พร็อกซีหนึ่งเครื่องขึ้นไปดึงการตอบสนองและส่งการตอบกลับของเซิร์ฟเวอร์ไปยังไคลเอนต์

เนื่องจากประสิทธิภาพและความสามารถในการปรับขนาดของมัน NGINX จึงถูกใช้เป็นพร็อกซีย้อนกลับสำหรับ HTTP และเซิร์ฟเวอร์ที่ไม่ใช่ HTTP การกำหนดค่าพร็อกซีย้อนกลับโดยทั่วไปคือการวาง Nginx ไว้หน้า Node.js, Python หรือ Java application

การใช้ Nginx เป็น reverse proxy ให้ประโยชน์เพิ่มเติมหลายประการแก่คุณ:

  • โหลดบาลานซ์ - Nginx สามารถทำโหลดบาลานซ์เพื่อกระจายคำร้องขอของลูกค้าข้ามเซิร์ฟเวอร์พร็อกซีซึ่งปรับปรุงประสิทธิภาพความสามารถในการขยายและความน่าเชื่อถือ การแคช - ด้วย Nginx ในฐานะพร็อกซีย้อนกลับคุณสามารถแคชเวอร์ชันหน้าที่แสดงผลล่วงหน้าเพื่อเร่งความเร็วในการโหลดหน้าเว็บ มันทำงานได้โดยการแคชเนื้อหาที่ได้รับจากการตอบสนองของเซิร์ฟเวอร์ proxied และใช้มันเพื่อตอบสนองต่อลูกค้าโดยไม่ต้องติดต่อกับเซิร์ฟเวอร์ proxied สำหรับเนื้อหาเดียวกันทุกครั้ง การสิ้นสุด SSL - Nginx สามารถทำหน้าที่เป็นปลายทาง SSL สำหรับการเชื่อมต่อกับไคลเอนต์ มันจะจัดการและถอดรหัสการเชื่อมต่อ SSL ขาเข้าและเข้ารหัสการตอบสนองของเซิร์ฟเวอร์พร็อกซี การบีบอัด - หากเซิร์ฟเวอร์ proxied ไม่ส่งการตอบกลับที่ถูกบีบอัดคุณสามารถกำหนดค่า Nginx เพื่อบีบอัดการตอบสนองก่อนที่จะส่งไปยังไคลเอนต์ การบรรเทาการโจมตี DDoS - คุณสามารถ จำกัด การร้องขอขาเข้าและจำนวนการเชื่อมต่อต่อที่อยู่ IP เดียวให้เป็นค่าทั่วไปสำหรับผู้ใช้ปกติ Nginx ยังช่วยให้คุณสามารถบล็อกหรือ จำกัด การเข้าถึงตามสถานที่ตั้งของลูกค้าและค่าของส่วนหัวคำขอเช่น“ User-Agent” และ“ Referer”

บทความนี้แสดงขั้นตอนที่จำเป็นสำหรับการกำหนดค่า Nginx เป็น reverse proxy

ข้อกำหนดเบื้องต้น

เราสมมติว่าคุณมี Nginx ติดตั้งบนเซิร์ฟเวอร์ Ubuntu, CentOS หรือ Debian ของคุณ

การใช้ Nginx เป็น Reverse Proxy

ในการกำหนดค่า Nginx เป็นพร็อกซีย้อนกลับไปยังเซิร์ฟเวอร์ HTTP ให้เปิดไฟล์การกำหนดค่าบล็อกเซิร์ฟเวอร์ของโดเมนและระบุสถานที่และเซิร์ฟเวอร์พร็อกซีภายใน:

server { listen 80; server_name www.example.com example.com; location /app { proxy_pass http://127.0.0.1:8080; } }

URL เซิร์ฟเวอร์พร็อกซีถูกตั้งค่าโดยใช้ proxy_pass directive และสามารถใช้ HTTP หรือ HTTPS เป็นโปรโตคอลชื่อโดเมนหรือที่อยู่ IP และพอร์ตทางเลือกและ URI เป็นที่อยู่

การกำหนดค่าด้านบนบอกให้ Nginx ส่งคำขอทั้งหมดไปยังตำแหน่ง /app ไปยังเซิร์ฟเวอร์ proxied ที่ http://127.0.0.1:8080

ในการแจกจ่ายแบบอิง Ubuntu และ Debian ไฟล์บล็อกเซิร์ฟเวอร์จะถูกเก็บไว้ในไดเรกทอรี /etc/nginx/sites-available ขณะที่ CentOS ในไดเร็กทอรี /etc/nginx/conf.d

เพื่อแสดงให้เห็นถึงวิธีการทำงาน location และคำสั่ง proxy_pass ดีขึ้นลองมาตัวอย่างต่อไปนี้:

server { listen 80; server_name www.example.com example.com; location /blog { proxy_pass http://node1.com:8000/wordpress/; } }

หากผู้เข้าชมเข้าถึง http://example.com/blog/my-post Nginx จะทำหน้าที่นี้ให้กับ http://node1.com:8000/wordpress/my-post

เมื่อที่อยู่ของเซิร์ฟเวอร์พร็อกซีมี URI, ( /wordpress/ ), URI คำขอที่ส่งผ่านไปยังเซิร์ฟเวอร์พร็อกซีจะถูกแทนที่ด้วย URI ที่ระบุในคำสั่ง หากที่อยู่ของเซิร์ฟเวอร์พร็อกซีถูกระบุโดยไม่มี URI คำร้องขอแบบเต็ม URI จะถูกส่งไปยังเซิร์ฟเวอร์พร็อกซี

ผ่านส่วนหัวคำขอ

เมื่อ Nginx ส่งคำขอคำขอจะกำหนดฟิลด์ส่วนหัวสองฟิลด์โดยอัตโนมัติในคำขอคำขอพร็อกซีจากไคลเอนต์ Host และการ Connection และลบส่วนหัวที่ว่างเปล่าออก Host ถูกตั้งค่าเป็นตัวแปร $proxy_host และการ Connection ถูกตั้งค่าเป็นปิด

หากต้องการปรับหรือตั้งค่าส่วนหัวสำหรับการเชื่อมต่อพร็อกซีให้ใช้คำสั่ง proxy_set_header ตามด้วยค่าส่วนหัว คุณสามารถค้นหารายการส่วนหัวของคำขอทั้งหมดที่มีอยู่และค่าที่อนุญาตได้ที่นี่ หากคุณต้องการป้องกันไม่ให้ส่วนหัวถูกส่งไปยังเซิร์ฟเวอร์พร็อกซีให้ตั้งเป็นสตริงว่าง ""

ในตัวอย่างต่อไปนี้เรากำลังเปลี่ยนค่าของฟิลด์ส่วนหัว $host และลบฟิลด์ส่วนหัว Accept-Encoding โดยการตั้งค่าเป็นสตริงว่าง

location / { proxy_set_header Host $host; proxy_set_header Accept-Encoding ""; proxy_pass http://localhost:3000; }

เมื่อใดก็ตามที่คุณแก้ไขไฟล์กำหนดค่าคุณต้องรีสตาร์ทบริการ Nginx เพื่อให้การเปลี่ยนแปลงมีผล

การกำหนดค่า Nginx เป็น Reverse Proxy ไปยังเซิร์ฟเวอร์พร็อกซีที่ไม่ใช่ HTTP

ในการกำหนดค่า Nginx เป็น reverse proxy ไปยังเซิร์ฟเวอร์ที่ไม่ใช่ HTTP proxied คุณสามารถใช้คำสั่งต่อไปนี้:

  • fastcgi_pass - reverse proxy ไปยังเซิร์ฟเวอร์ FastCGI uwsgi_pass - reverse proxy ไปยังเซิร์ฟเวอร์ uwsgi scgi_pass - reverse proxy ไปยังเซิร์ฟเวอร์ SCGI memcached_pass - reverse proxy ไปยังเซิร์ฟเวอร์ Memcached

หนึ่งในตัวอย่างที่พบบ่อยที่สุดคือการใช้ Nginx เป็น reverse proxy to PHP-FPM:

server { #… other directives location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.2-fpm.sock; } }

ตัวเลือก Nginx Reverse Proxy สามัญ

การแสดงเนื้อหาผ่าน HTTPS กลายเป็นมาตรฐานในปัจจุบัน ในส่วนนี้เราจะให้ตัวอย่างของการกำหนดค่าพร็อกซีย้อนกลับ HTTPS Nginx รวมถึงพารามิเตอร์พร็อกซี Nginx ที่แนะนำและส่วนหัว

location/ { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_cache_bypass $http_upgrade; 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; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; }

  • proxy_http_version 1.1 - กำหนดเวอร์ชันโปรโตคอล HTTP สำหรับการพร็อก proxy_http_version 1.1 โดยค่าเริ่มต้นจะถูกตั้งค่าเป็น 1.0 สำหรับ Websockets และการเชื่อมต่อแบบ keepalive คุณต้องใช้เวอร์ชัน 1.1 proxy_cache_bypass $http_upgrade - ตั้งเงื่อนไขภายใต้การตอบสนองที่จะไม่นำมาจากแคช Upgrade $http_upgrade และการ Connection "upgrade" - ฟิลด์ส่วนหัวเหล่านี้จำเป็นหากแอปพลิเคชันของคุณใช้ Websockets Host $host - ตัวแปร $host ตามลำดับความสำคัญต่อไปนี้ประกอบด้วย: ชื่อโฮสต์จากบรรทัดคำขอหรือชื่อโฮสต์จากฟิลด์ส่วนหัวคำขอ Host หรือชื่อเซิร์ฟเวอร์ที่ตรงกับคำขอ X-Real-IP $remote_addr - ส่งต่อที่อยู่ IP ของผู้เยี่ยมชมระยะไกลไปยังเซิร์ฟเวอร์พร็อกซี X-Forwarded-For $proxy_add_x_forwarded_for - รายการที่มีที่อยู่ IP ของเซิร์ฟเวอร์ทุกเครื่องไคลเอนต์ที่ได้รับการพร็อกซีผ่าน X-Forwarded-Proto $scheme - เมื่อใช้ภายในบล็อกเซิร์ฟเวอร์ HTTPS แต่ละการตอบสนอง HTTP จากเซิร์ฟเวอร์พร็อกซีจะถูกเขียนใหม่เป็น X-Forwarded-Host $host - กำหนดโฮสต์ดั้งเดิมที่ลูกค้าร้องขอ X-Forwarded-Port $server_port - กำหนดพอร์ตดั้งเดิมที่ลูกค้าร้องขอ

ข้อสรุป

คุณได้เรียนรู้วิธีใช้ Nginx เป็น Reverse Proxy นอกจากนี้เรายังแสดงวิธีการส่งพารามิเตอร์เพิ่มเติมไปยังเซิร์ฟเวอร์และเพื่อแก้ไขและตั้งค่าฟิลด์ส่วนหัวที่แตกต่างกันในคำขอพร็อกซี

Nginx