Linux
น้องๆ หลายคนอาจจะเคยได้ยินคำว่า Reverse Proxy, Nginx, SSL อะไรพวกนี้แล้วรู้สึกว่ามันยากจังเลยพี่! ไม่ต้องห่วง สมัยผมทำร้านเน็ต SiamCafe ใหม่ๆ ก็งงเหมือนกันแหละ (ตั้งแต่ปี 1997 แน่ะ!) แต่จริงๆ แล้วมันไม่ได้ยากอย่างที่คิดหรอก
Reverse Proxy ก็เหมือนกับยามหน้าปากซอยอ่ะ แทนที่จะให้ทุกคนบุกเข้าไปในบ้านเรา (Server) โดยตรง เราให้ยาม (Reverse Proxy) คอยตรวจตรา คัดกรอง และส่งเฉพาะคนที่ได้รับอนุญาตเข้าไปข้างในเท่านั้นเอง ส่วน SSL (Secure Sockets Layer) ก็คือการเข้ารหัสข้อมูลระหว่างเรากับ Server ทำให้คนแอบดักฟังข้อมูลกลางทางไม่ได้ไง เข้าใจยัง?
แล้วทำไมมันถึงสำคัญน่ะเหรอ? ลองนึกภาพว่าร้านเน็ตเรามีแต่เครื่องคิดเงิน (Server) ที่เก็บข้อมูลสำคัญของลูกค้าเพียบ ถ้าใครเข้ามาขโมยข้อมูลได้นี่ซวยเลยนะ ดังนั้น Reverse Proxy กับ SSL ก็เลยเหมือนเกราะป้องกันให้ Server ของเราปลอดภัยจากเหล่า Hacker นั่นเอง
Domain Name ก็คือชื่อเว็บไซต์ของเรา เช่น siamcafe.net นั่นเอง ส่วน DNS (Domain Name System) ก็คือสมุดโทรศัพท์ของอินเทอร์เน็ต ที่จะแปลงชื่อเว็บไซต์ที่เราพิมพ์ลงไป เป็น IP Address ที่คอมพิวเตอร์เข้าใจได้ สมัยผมทำร้านเน็ตใหม่ๆ นี่ต้องไปจด Domain Name กับ CAT (กสท.) เองเลยนะ! ยุ่งยากกว่าสมัยนี้เยอะ
SSL Certificate ก็คือใบรับรองว่าเว็บไซต์ของเราปลอดภัย มีการเข้ารหัสข้อมูลจริง เวลาที่เราเข้าเว็บไซต์ที่มี SSL Certificate เราจะเห็นรูปกุญแจสีเขียวๆ ตรง Address Bar นั่นแหละ สมัยนี้มี Let's Encrypt ให้ใช้ฟรีด้วยนะ สะดวกสบายกว่าสมัยก่อนเยอะเลย
Nginx Configuration ก็คือไฟล์ที่ใช้กำหนดค่าต่างๆ ของ Nginx เช่น จะให้ Nginx ทำหน้าที่เป็น Reverse Proxy ให้ Server ตัวไหน, จะใช้ SSL Certificate ตัวไหน, จะให้ Nginx ตอบสนองต่อ Request แบบไหนบ้าง ซึ่งเราจะต้องแก้ไขไฟล์ Configuration นี้ เพื่อให้ Nginx ทำงานตามที่เราต้องการ
เอาล่ะ ทีนี้มาถึงขั้นตอนการใช้งาน Nginx Reverse Proxy กับ SSL กันบ้าง ไม่ต้องกลัวนะ ผมจะค่อยๆ สอนทีละ Step เลย
อันดับแรก เราต้องติดตั้ง Nginx บน Server ของเราก่อน วิธีการติดตั้งก็ขึ้นอยู่กับ Linux Distribution ที่เราใช้ ถ้าเป็น Ubuntu ก็ใช้คำสั่งนี้เลย:
sudo apt update
sudo apt install nginx
ถ้าเป็น CentOS ก็ใช้คำสั่งนี้:
sudo yum update
sudo yum install nginx
หลังจากติดตั้ง Nginx เสร็จแล้ว เราก็ต้องขอ SSL Certificate ก่อน สมัยนี้ Let's Encrypt เป็นทางเลือกที่ดีที่สุด เพราะฟรีและใช้งานง่าย ติดตั้ง Certbot แล้วรันคำสั่งนี้:
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Certbot จะจัดการขอ SSL Certificate ให้เราอัตโนมัติ และแก้ไข Nginx Configuration ให้เราด้วย สะดวกมากๆ
ถ้าเราไม่ได้ใช้ Certbot หรือต้องการปรับแต่งค่าเพิ่มเติม เราก็ต้องแก้ไข Nginx Configuration เอง ไฟล์ Configuration หลักของ Nginx จะอยู่ที่ /etc/nginx/nginx.conf หรือ /etc/nginx/conf.d/default.conf แล้วแต่ Linux Distribution ที่เราใช้
ตัวอย่าง Configuration สำหรับ Reverse Proxy:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
location / {
proxy_pass http://localhost:3000; # เปลี่ยน port ตาม application ของเรา
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;
}
}
อธิบาย Code นิดนึง:
listen 80: กำหนดให้ Nginx รับ Request ที่ Port 80 (HTTP) แล้ว Redirect ไปยัง HTTPSlisten 443 ssl: กำหนดให้ Nginx รับ Request ที่ Port 443 (HTTPS) และใช้ SSLssl_certificate: กำหนด Path ของ SSL Certificatessl_certificate_key: กำหนด Path ของ SSL Certificate Keyproxy_pass: กำหนด URL ของ Server ที่ Nginx จะส่ง Request ไปให้proxy_set_header: กำหนด Header ที่ Nginx จะส่งไปพร้อมกับ Requestหลังจากแก้ไข Nginx Configuration เสร็จแล้ว เราต้อง Restart Nginx เพื่อให้การเปลี่ยนแปลงมีผล:
sudo systemctl restart nginx
ถ้ามี Error ก็ลองเช็ค Log File ของ Nginx ที่ /var/log/nginx/error.log ดูนะ
นอกจาก Nginx แล้ว ก็ยังมี Web Server อื่นๆ ที่สามารถทำหน้าที่เป็น Reverse Proxy ได้ เช่น Apache, HAProxy แต่ละตัวก็มีข้อดีข้อเสียแตกต่างกันไป
| Web Server | ข้อดี | ข้อเสีย |
|---|---|---|
| Nginx | ประสิทธิภาพสูง, Configuration ง่าย, Community ใหญ่ | อาจจะซับซ้อนกว่าถ้าต้องการ Configuration ขั้นสูง |
| Apache | Configuration ยืดหยุ่น, รองรับ Module เยอะ | ประสิทธิภาพต่ำกว่า Nginx, กิน Resource มากกว่า |
| HAProxy | เน้น Load Balancing, ประสิทธิภาพสูง | Configuration ซับซ้อน, ไม่เหมาะกับ Web Server ทั่วไป |
สมัยผมทำร้านเน็ต SiamCafe เนี่ย ใช้ Apache เป็นหลัก เพราะตอนนั้น Nginx ยังไม่ค่อยดัง แต่สมัยนี้ Nginx เป็นที่นิยมกว่าเยอะ เพราะประสิทธิภาพดีกว่า Configuration ง่ายกว่า และมี Community ใหญ่กว่า
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย ที่ SiamCafe Blog มีบทความอื่นๆ ที่น่าสนใจอีกเยอะเลย ลองเข้าไปอ่านดูนะ
อย่าลืมว่าความรู้ด้าน IT ต้องเรียนรู้และฝึกฝนอยู่เสมอ SiamCafe Blog เป็นแหล่งข้อมูลที่ดีที่จะช่วยให้น้องๆ พัฒนาตัวเองได้
ดูวิดีโอเพิ่มเติมเกี่ยวกับNginx Reverse Proxy Ssl:
เอาล่ะน้องๆ มาถึงตรงนี้ แสดงว่าเราพอจะคลำๆ ทาง Nginx Reverse Proxy SSL กันได้บ้างแล้วเนอะ แต่ของแบบนี้มันไม่ได้จบแค่ "ทำได้" แต่มันต้อง "ทำให้ดี" ด้วย สมัยผมทำร้านเน็ต SiamCafe เนี่ย เรื่องพวกนี้สำคัญมาก เพราะมันคือความเร็ว ความเสถียร และความปลอดภัยของระบบทั้งหมด
ผมจะมาแชร์เคล็ดลับที่สั่งสมมาตลอด 28+ ปีในวงการ IT ที่เอาไปใช้ได้จริงแน่นอน ขอบอกว่านี่คือของจริงที่ผ่านการใช้งานมาแล้ว ไม่ใช่แค่ทฤษฎีนะจ๊ะ
เรื่อง Cache เนี่ยสำคัญสุดๆ โดยเฉพาะเว็บที่มี static content เยอะๆ เช่น รูป, CSS, Javascript ถ้าเราตั้งค่า Cache Header ดีๆ จะช่วยลดโหลดของ Server ต้นทางได้เยอะมาก แถม User ก็จะรู้สึกว่าเว็บมันเร็วขึ้นด้วย
ผมเคยเจอเคสที่ร้านเน็ตคือลูกค้าบ่นอุบว่าเว็บโหลดช้า พอเข้าไปดูปรากฏว่า Cache Header ห่วยแตกมาก Browser ต้องโหลดทุกอย่างใหม่หมดทุกครั้ง ผมเลยจัดการแก้ config Nginx ตามนี้:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000";
}
โค้ดข้างบนคือบอกให้ Browser Cache ไฟล์พวก .jpg, .jpeg, .png, .gif, .ico, .css, .js ไว้ 30 วันเต็มๆ ลองเอาไปปรับใช้ดูนะ
Gzip Compression คือการบีบอัดไฟล์ก่อนส่งให้ Browser ทำให้ขนาดไฟล์เล็กลง ส่งข้อมูลได้เร็วขึ้น User ก็แฮปปี้ ผมว่ามันเหมือนการส่งของชิ้นใหญ่ๆ แต่เราแพ็คให้มันเล็กลงอ่ะ เข้าใจง่ายดีมะ
การ Enable Gzip ใน Nginx ก็ง่ายแสนง่าย แค่เพิ่ม config เหล่านี้เข้าไป:
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
อย่าลืม restart Nginx หลังแก้ config นะครับ
เคยเจอปัญหา Server โดนโจมตีไหม? พวก DDOS เนี่ย สมัยผมทำร้านเน็ตเจอบ่อยมาก วิธีป้องกันเบื้องต้นคือการทำ Rate Limiting หรือการจำกัดจำนวน Request ที่ User แต่ละคนสามารถส่งมาได้ในเวลาที่กำหนด
Config Nginx สำหรับ Rate Limiting ก็ประมาณนี้:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
location / {
limit_req zone=mylimit burst=5 nodelay;
# ... other configurations ...
}
}
โค้ดข้างบนคือจำกัดให้แต่ละ IP address ส่ง Request ได้แค่ 1 ครั้งต่อวินาที ถ้าเกิน 5 ครั้ง จะถูก Reject ทันที ลองปรับตัวเลขให้เหมาะกับเว็บของตัวเองนะ
Reverse Proxy เหมือนเป็น "ตัวแทน" ของ Server เรา ทำหน้าที่รับ Request จาก Client แล้วส่งต่อให้ Server จริงๆ ข้อดีคือช่วยซ่อน Server จริงๆ จากโลกภายนอก เพิ่มความปลอดภัย และยังช่วย Load Balance ได้อีกด้วย SiamCafe Blog มีบทความที่อธิบายเรื่องนี้ละเอียดกว่านี้ ลองไปอ่านดูนะ
มีจริงครับ! Let's Encrypt คือผู้ให้บริการ SSL Certificate ฟรีที่ได้รับความนิยมมาก ใช้งานง่าย แถมยังปลอดภัยด้วย สมัยนี้ใครยังใช้ HTTP อยู่ถือว่าเชยมากๆ
Nginx เน้นเรื่อง Performance และ Concurrent Connections ที่สูง เหมาะกับเว็บที่มี Traffic เยอะๆ ส่วน Apache จะยืดหยุ่นกว่า มี Module ให้เลือกใช้เยอะกว่า แต่กิน Resource มากกว่า ถ้าให้เปรียบเทียบง่ายๆ Nginx เหมือนรถสปอร์ตที่เน้นความเร็ว ส่วน Apache เหมือนรถออฟโรดที่ลุยได้ทุกที่
มีหลายเครื่องมือให้เลือกใช้ครับ เช่น Nagios, Zabbix, Grafana หรือจะใช้พวก Cloud Monitoring Service ก็ได้ สิ่งที่ควร Monitor คือ CPU Usage, Memory Usage, Disk I/O, Network Traffic และ Error Logs
Nginx Cache คือการ Cache ข้อมูลไว้ที่ Server ทำให้ Server ไม่ต้อง Generate ข้อมูลใหม่ทุกครั้งที่ User ขอ Browser Cache คือการ Cache ข้อมูลไว้ที่ Browser ของ User ทำให้ Browser ไม่ต้อง Download ข้อมูลใหม่ทุกครั้งที่เข้าเว็บซ้ำๆ ทั้งสองอย่างช่วยลดโหลดของ Server และทำให้เว็บเร็วขึ้น
Nginx Reverse Proxy SSL ไม่ใช่เรื่องยากอย่างที่คิด แต่ต้องอาศัยความเข้าใจและประสบการณ์ การตั้งค่า Cache Header ที่ถูกต้อง, Gzip Compression, และ Rate Limiting คือเคล็ดลับสำคัญที่จะช่วยให้เว็บของคุณเร็ว แรง และปลอดภัย iCafeForex ก็ใช้เทคนิคพวกนี้เหมือนกันนะ จะบอกให้
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะครับ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย ผมยินดีตอบเสมอ