การใช้งาน Nginx สำหรับ Reverse Proxy

Web Development 07 สิงหาคม พ.ศ. 2565 1,580
Home / Articles / 16

Nginx เป็นโปรแกรมที่ออกแบบมาเพื่อสำหรับใช้เป็นเว็บเซิร์ฟเวอร์ เพื่อแสดงหน้าเว็บแบบคงที่ (serve static web content) คล้ายกับ Apache2 และยังสามารถใช้เป็น reverse proxy, load balancer, mail proxy และ HTTP cache. Nginx เป็นโปรแกรมที่รับมือคำขอต่างๆ ในแบบ asynchronous สถาปัตยกรรม modular event-driven architecture ของ Nginx สามารถให้ประสิทธิภาพที่คาดการณ์ได้ภายใต้ภาระงานสูง

Reverse Proxy คือ proxy ประเภทหนึ่งที่ค่อยทำหน้าที่รับคำขอจากลูกข่าย (clients) และนำคำขอนั้นส่งต่อไปยัง Apps ต่างๆ ที่อาจทำงานอยู่คนละ ports จึงสามารถส่งข้อมูลกลับไปที่ clients ราวกับว่าเป็น Web Server จริงๆ โดยมันช่วยเพิ่มความสามารถในการปรับขนาดของเซิร์ฟเวอร์ให้มีความความยืดหยุ่น เปิดได้หลายๆ Apps ได้มากยิ่งขึ้น ในเซิร์ฟเวอร์หนึ่งเครื่อง และปลอดภัยยิ่งขึ้น

การติดตั้ง Nginx

สำหรับ Ubuntu ใช้คำสั่ง


sudo apt install nginx

และสำหรับ macOS (brew) ใช้คำสั่งนี้


brew install nginx

การตั้งค่า (Configs)

หลังจากติดตั้งเสร็จแล้ว ให้ลองเข้าไปเช็คใน "/etc/nginx/nginx.conf" ให้แน่ใจว่ามีการ include sites-enabled แล้ว

http {
    include /etc/nginx/sites-enabled/default.save;
}

ให้แก้ไขไฟล์ "/etc/nginx/sites-available/default" (ตัวอย่างใช้ nano ในการแก้ไข)

sudo nano /etc/nginx/sites-available/default

โดยให้ใส่ Config ดังนี้ ตัวอย่างต้องการ กำหนด server_name คือ โดเมนเนมที่ลูกข่ายจะส่งคำขอมา ต้องตั้งค่า DNS ของโดเมนเนม โดยเพิ่ม CNAME หรือ A Records ให้ส่งคำขอมาที่เซิร์ฟเวอร์ที่ Nginx ทำงานอยู่ และใส่ proxy_pass ตามด้วยที่อยู่ ภายใน (local) ของแอป เช่น แอปที่ทำงานอยู่บน port 420 ก็จะต้องใส่ค่า http://l27.0.0.1:420 หรือ http://localhost:420 เพื่อให้ Proxy สามารถรับส่งข้อมูลกับแอปได้

server {
    server_name abc.com;
	location / {
        proxy_pass http://127.0.0.1:4444;
	}
}

จากนั้นใช้คำสั่งนี้ เพื่อใช้งานการเปลี่ยนแปลงใหม่

sudo nginx -s reload

Node.js จะใช้ทรัพยากรมาก หากต้อง Served Static ไฟล์ อย่างพวก รูปภาพ และไฟล์ต่างๆ ดังนั้นผมจึงสร้าง location /image/ ขึ้นมาเพื่อให้ nginx ทำการ served ไฟล์ใน /image/ แทน จะช่วยเพิ่มความเร็วของเว็บไซต์ โดยจะใช้ alias เชื่อมโยงไปหา Directory ดังกล่าว ดังโค้ดข้างต้น

หากใช้ร่วมกับ Cloudfalre Full SSL ด้วย จะต้องสร้างโดยรับ Request จาก Port 443 แทน ซึ่งจำเป็นต้องใส่ ssl_certificate คือ public key และ ssl_certificate_key คือ private key ที่ได้จาก cloudflare

server {
    listen 443 ssl;
    listen [::]:443 ssl;
	
    server_name abc.com;

    ssl_certificate /path_to/abc-public-key.pem;
    ssl_certificate_key /path_to/abc-private-key.pem;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location / {
		proxy_ssl_server_name on;
        proxy_pass http://localhost:4444;
    }

    location /image/ {
		alias /abc/public/image/;
    }
}

อ้างอิง: https://en.wikipedia.org/wiki/Nginx

Profile Picture.
  • Name (Pen name): Sunny Jirakit (Sunny420x)
  • Study: Bachelor Degree of Computer Science from Chiang Mai Rajabhat University
  • Personality: Architect (INTJ-T)
  • Experience: JavaScript,  Angular.js, React.js, Next.js  Express.js, Unity C#, Socket.io