PM2 + Nginx รีเวิร์สพร็อกซี: เชื่อมแอป Node.js เข้ากับพอร์ต 80

สภาพแวดล้อมทดสอบตระกูล DebianUbuntu 24.04.5 LTSบัญชีผู้ใช้ทั่วไป
ตรวจสอบการทำงานของแอป Node.js และรีเวิร์สพร็อกซีแล้ว

เราติดตั้งโครงสร้างรีเวิร์สพร็อกซี Node.js PM2 Nginx บนเซิร์ฟเวอร์ Ubuntu 24.04 โดยให้ PM2 ดูแลการรันแอป และให้ Nginx ส่งคำขอที่เข้ามาทางพอร์ต 80 ต่อไปยังแอป และยังตรวจสอบแล้วว่าแม้จะบังคับปิดโปรเซสของแอปหรือรีบูตเซิร์ฟเวอร์ PM2 ก็รันแอปขึ้นมาใหม่ได้

กล่องผลลัพธ์ด้านล่างเป็นเอาต์พุตจากคำสั่งที่รันด้วยผู้ใช้ทั่วไป deploy ตรงตำแหน่งโดเมนใช้ค่าตัวอย่าง example.com และส่งคำขอจากภายในเซิร์ฟเวอร์โดยใส่เฮดเดอร์ Host

🎯 ประเด็นสำคัญ
🗂️ ลำดับของคำขอ
📂 Nginxรีเวิร์สพร็อกซี
📄 Certbotใบรับรอง HTTPS
📂 PM2การรันแอปและการเริ่มอัตโนมัติ
📄 แอป Node.js
รันแอปด้วย PM2 และเริ่มอัตโนมัติตอนบูต
Nginx ส่งคำขอจากพอร์ต 80 ไปยังแอป
ข้อกำหนดเบื้องต้น
เซิร์ฟเวอร์Ubuntu 24.04 ที่ตั้งค่าเริ่มต้นเสร็จแล้วsudo สิทธิ์สำหรับบัญชีผู้ใช้ทั่วไปต้องมีโดเมนเมื่อใช้ HTTPS

1️⃣ ติดตั้ง Node.js

Node.js ติดตั้งโดยลงทะเบียนรีโพสิทอรีของ NodeSource ไว้ใน apt และเราเลือก Node.js 26 ซึ่งเป็นเวอร์ชัน LTS ณ เดือนพฤศจิกายน 2026

🔲 NodeSource setup_26.x

export DEBIAN_FRONTEND=noninteractive

ถ้าคุณกำหนดค่านี้ไว้ก่อน หน้าต่างที่ถามการตั้งค่าจะไม่ขึ้นระหว่างติดตั้งแพ็กเกจ ตัวเลือก -E ของคำสั่ง sudo ด้านล่างจะส่งค่านี้ต่อไปยังคำสั่งที่รันด้วยสิทธิ์ root ด้วย

curl -fsSL https://deb.nodesource.com/setup_26.x | sudo -E bash -
2026-11-07 16:08:16 - Repository configured successfully.
2026-11-07 16:08:16 - To install Node.js, run: apt install nodejs -y

เมื่อสคริปต์ลงทะเบียนรีโพสิทอรีเสร็จ คุณก็ติดตั้ง Node.js ด้วย apt ได้เหมือนแพ็กเกจของ Ubuntu

🔲 apt-get install nodejs

sudo -E apt-get install -y nodejs
Setting up libatomic1:amd64 (14.2.0-4ubuntu2~24.04.1) ...
Setting up nodejs (26.13.0-1nodesource1) ...
Processing triggers for libc-bin (2.39-0ubuntu8.9) ...
Processing triggers for man-db (2.12.0-4build2) ...

🔲 node -v, npm -v

node -v
v26.13.0
npm -v
11.20.0

npm มาพร้อมกับแพ็กเกจ nodejs จึงไม่ต้องติดตั้งแยก

2️⃣ แอปทดสอบ Node.js

เพื่อดูว่า PM2 และ Nginx เชื่อมกันถูกต้องหรือไม่ ให้สร้างแอปทดสอบที่ตอบกลับข้อความหนึ่งบรรทัดเมื่อได้รับคำขอ

🔲 app.js

mkdir -p ~/hello

สร้างโฟลเดอร์ hello ไว้ใต้โฟลเดอร์โฮม แล้วเขียนไฟล์ app.js ไว้ข้างใน

cat > ~/hello/app.js <<'APP'
const http = require('http');
http.createServer((req, res) => {
  console.log(req.method, req.url);
  res.end('hello from node\n');
}).listen(3000, '127.0.0.1');
APP

แอปรับคำขอเฉพาะที่พอร์ต 3000 ของ 127.0.0.1 จึงเปิดจากภายนอกเซิร์ฟเวอร์โดยตรงไม่ได้ เราจะตั้งให้ Nginx รับคำขอจากภายนอกแล้วส่งต่อมายังพอร์ตนี้

3️⃣ รันแอปด้วย PM2 และเริ่มอัตโนมัติ

PM2 เป็นเครื่องมือจัดการโปรเซสที่รันแอป Node.js ในเบื้องหลัง และรันแอปขึ้นมาใหม่เมื่อโปรเซสของแอปหยุด ในส่วนนี้เราตั้งค่าการเริ่มอัตโนมัติที่ทำให้แอปขึ้นมาใหม่เมื่อเซิร์ฟเวอร์บูตด้วย

🔲 npm install -g pm2

sudo npm install -g pm2
added 45 packages in 5s
pm2 -v
[PM2] Spawning PM2 daemon with pm2_home=/home/deploy/.pm2
[PM2] PM2 Successfully daemonized
7.1.2

เมื่อรันคำสั่ง pm2 ครั้งแรก เดมอนของ PM2 จะเริ่มทำงานไปด้วย และ PM2 ที่ติดตั้งคือเวอร์ชัน 7.1.2

🔲 pm2 start

cd ~/hello

ย้ายไปที่โฟลเดอร์ที่มี app.js แล้วรันแอปด้วย PM2

pm2 start app.js --name hello
[PM2] Starting /home/deploy/hello/app.js in fork_mode (1 instance)
[PM2] Done.
┌────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name     │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0  │ hello    │ default     │ N/A     │ fork    │ 17257    │ 0s     │ 0    │ online    │ 0%       │ 26.3mb   │ deploy   │ disabled │
└────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

--name คือชื่อแอปที่จะแสดงในรายการของ PM2 และคำสั่งต่อจากนี้จะระบุแอปด้วยชื่อนี้

pm2 list
┌────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name     │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0  │ hello    │ default     │ N/A     │ fork    │ 17257    │ 2s     │ 0    │ online    │ 0%       │ 58.5mb   │ deploy   │ disabled │
└────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
host metrics | cpu: 0% | ram usage: 38.8% | disk: ⇓ 0mb/s ⇑ 0mb/s

online ในคอลัมน์ status หมายถึงแอปกำลังทำงาน และคอลัมน์ ↺ คือจำนวนครั้งที่ PM2 รีสตาร์ตแอป

🔲 curl 127.0.0.1:3000

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

curl -sS http://127.0.0.1:3000/
hello from node

🔲 pm2 restart

หลังแก้โค้ดของแอป ให้รีสตาร์ตแอปเพื่อให้การแก้ไขมีผล

pm2 restart hello
Use --update-env to update environment variables
[PM2] Applying action restartProcessId on app [hello](ids: [ 0 ])
[PM2] [hello](0) ✓
┌────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name     │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0  │ hello    │ default     │ N/A     │ fork    │ 17306    │ 0s     │ 1    │ online    │ 0%       │ 19.3mb   │ deploy   │ disabled │
└────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
host metrics | cpu: 0% | ram usage: 38.8% | disk: ⇓ 0mb/s ⇑ 0mb/s
pm2 list
┌────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name     │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0  │ hello    │ default     │ N/A     │ fork    │ 17306    │ 2s     │ 1    │ online    │ 0%       │ 58.3mb   │ deploy   │ disabled │
└────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
host metrics | cpu: 0% | ram usage: 38.8% | disk: ⇓ 0mb/s ⇑ 0mb/s

หลังรีสตาร์ต pid เปลี่ยนจาก 17257 เป็น 17306 และคอลัมน์ ↺ ขึ้นเป็น 1

🔲 kill -9

สถานการณ์ที่โปรเซสของแอปหยุดกะทันหันสร้างได้ด้วย kill -9 และ pm2 pid จะแสดงหมายเลขโปรเซสของแอป

kill -9 "$(pm2 pid hello)"

ตรวจรายการของ PM2 อีกครั้งหลังผ่านไป 3 วินาที

pm2 list
┌────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name     │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0  │ hello    │ default     │ N/A     │ fork    │ 17797    │ 3s     │ 2    │ online    │ 0%       │ 58.6mb   │ deploy   │ disabled │
└────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
host metrics | cpu: 51.2% | ram usage: 35.8% | eth0: ⇓ 1kb/s ⇑ 1kb/s | eth1: ⇓ 19kb/s ⇑ 0mb/s | disk: ⇓ 728kb/s ⇑ 3.1mb/s

PM2 รันแอปขึ้นมาใหม่ด้วย pid ใหม่ 17797 และอยู่ในสถานะ online ส่วนคอลัมน์ ↺ ขึ้นเป็น 2

🔲 pm2 save

pm2 save
[PM2] Saving current process list...
[PM2] Successfully saved in /home/deploy/.pm2/dump.pm2

pm2 save จะบันทึกรายการแอปที่กำลังรันอยู่ลงในไฟล์ dump.pm2 และตอนบูต PM2 จะรันแอปขึ้นมาใหม่ตามรายการนี้

🔲 pm2 startup

ถ้าต้องการให้ PM2 ทำงานตอนบูต ให้ลงทะเบียน PM2 เป็นบริการของ systemd คำสั่งด้านล่างจะสร้างบริการโดยใส่ชื่อบัญชีปัจจุบันและโฟลเดอร์โฮม

sudo env PATH="$PATH" pm2 startup systemd -u "$(id -un)" --hp "$HOME"
ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-deploy.service
Command list
[ 'systemctl enable pm2-deploy' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-deploy.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-deploy...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-deploy.service → /etc/systemd/system/pm2-deploy.service.
[PM2] [v] Command successfully executed.

env PATH เป็นส่วนที่ทำให้ pm2 ที่รันด้วยสิทธิ์ root หาพาธของ node ของบัญชีปัจจุบันเจอ ส่วน -u และ --hp คือบัญชีและโฟลเดอร์โฮมที่ใช้รันบริการ บรรทัด ExecStart ในไฟล์บริการคือ pm2 resurrect ซึ่งจะกู้รายการแอปที่บันทึกไว้คืนมาตอนบูต

systemctl status pm2-deploy --no-pager | head -n 5
○ pm2-deploy.service - PM2 process manager
     Loaded: loaded (/etc/systemd/system/pm2-deploy.service; enabled; preset: enabled)
     Active: inactive (dead)
       Docs: https://pm2.keymetrics.io/

enabled หมายถึงบริการจะทำงานตอนบูต pm2 startup แค่ลงทะเบียนบริการโดยยังไม่รันตอนนี้ จึงแสดงเป็น inactive (dead) และบริการจะเริ่มทำงานตั้งแต่การบูตครั้งถัดไป

🔲 pm2 list หลังรีบูต

sudo systemctl reboot

ประมาณ 2 นาทีต่อมา ให้เชื่อมต่อด้วย deploy อีกครั้งแล้วตรวจสถานะของแอป

uptime -p
up 2 minutes
pm2 list
┌────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name     │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0  │ hello    │ default     │ N/A     │ fork    │ 976      │ 108s   │ 0    │ online    │ 0%       │ 63.0mb   │ deploy   │ disabled │
└────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
host metrics | cpu: 0.3% | ram usage: 35.1% | disk: ⇓ 4kb/s ⇑ 4kb/s

ตอนที่เซิร์ฟเวอร์เปิดมาได้ 2 นาที แอปอยู่ในสถานะ online มาแล้ว 108 วินาที แปลว่า PM2 รันแอปขึ้นมาใหม่พร้อมกับการบูต

4️⃣ ตั้งค่า Nginx รีเวิร์สพร็อกซี

เพราะแอปรับคำขอเฉพาะที่ 127.0.0.1:3000 คำขอที่เข้ามาทางพอร์ต 80 จึงให้ Nginx รับแล้วส่งต่อไปยังแอป โครงสร้างแบบนี้ที่ให้เซิร์ฟเวอร์ด้านหน้ารับคำขอแล้วส่งต่อไปยังเซิร์ฟเวอร์ด้านหลังเรียกว่ารีเวิร์สพร็อกซี

🔲 apt-get install nginx

sudo -E apt-get install -y nginx
Setting up nginx-common (1.24.0-2ubuntu7.19) ...
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
Setting up nginx (1.24.0-2ubuntu7.19) ...
nginx -v
nginx version: nginx/1.24.0 (Ubuntu)

Nginx ในรีโพสิทอรีของ Ubuntu 24.04 คือเวอร์ชัน 1.24.0 และเมื่อติดตั้งก็จะถูกลงทะเบียนให้ทำงานตอนบูตไปด้วย

🔲 /etc/nginx/sites-available/hello

สร้างไฟล์ /etc/nginx/sites-available/hello แล้วใส่เนื้อหาด้านล่าง

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        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 Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

proxy_pass คือที่อยู่ของแอปที่จะส่งคำขอต่อไป เฮดเดอร์ Host, X-Real-IP, X-Forwarded-For และ X-Forwarded-Proto เป็นค่าที่ส่งไปเพื่อให้แอปรู้โดเมนของคำขอเดิม IP ของผู้เข้าชม และรู้ว่าเป็น http หรือ https

proxy_http_version 1.1 กับเฮดเดอร์ Upgrade และ Connection จำเป็นเมื่อต้องส่งการเชื่อมต่อ WebSocket ไปถึงแอป เฮดเดอร์ Upgrade และ Connection จะไม่ถูกส่งต่อไปยังแอปหลังผ่านพร็อกซี จึงต้องใส่ไว้ในการตั้งค่าเอง

sudo ln -sf /etc/nginx/sites-available/hello /etc/nginx/sites-enabled/hello

Nginx อ่านเฉพาะการตั้งค่าที่มีลิงก์อยู่ในโฟลเดอร์ sites-enabled

🔲 nginx -t

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl reload nginx

ตรวจไวยากรณ์ของการตั้งค่าด้วย nginx -t ก่อน ถ้าผ่านก็ใช้การตั้งค่าใหม่ด้วย reload โดยไม่ต้องหยุด Nginx

🔲 คำขอ curl ที่ใส่เฮดเดอร์ Host

curl -sS -i -H 'Host: example.com' http://127.0.0.1/ | head -n 4
HTTP/1.1 200 OK
Server: nginx/1.24.0 (Ubuntu)
Date: Sat, 07 Nov 2026 08:09:38 GMT
Content-Length: 16

หลังอ่านการตั้งค่าใหม่แล้ว คำขอที่ส่งพร้อมเฮดเดอร์ Host ได้รับคำตอบจากแอปกลับมา บรรทัด Server ในเฮดเดอร์คำตอบคือ nginx และ Content-Length 16 มีขนาดเท่ากับบรรทัด hello from node ที่แอปตอบกลับ (16 ไบต์รวมขึ้นบรรทัดใหม่) ถ้าจะเชื่อมต่อจากภายนอกเซิร์ฟเวอร์ ต้องเปิดพอร์ต 80 ในไฟร์วอลล์

🧭 คำขอไปยังแอป Node.js และการรันใหม่
แผนภาพอธิบาย
🧭 สถานการณ์
ลำดับของคำขอ
🌐เบราว์เซอร์คำขอไปยัง example.com
➜
🧱Nginxพอร์ต 80, proxy_pass
➜
🟢แอป Node.js127.0.0.1:3000
การจัดการโปรเซส
⚙️systemdบริการ pm2-deploy
➜
🔁PM2รายการแอป dump.pm2
➜
🟢แอป Node.jshello
Nginx ที่พอร์ต 80 รับคำขอจากเบราว์เซอร์ ส่งต่อไปยัง 127.0.0.1:3000 ที่เขียนไว้ใน proxy_pass แล้วตอบกลับด้วยคำตอบของแอปตามนั้น
เมื่อโปรเซสของแอปหยุด PM2 จะรันแอปเดิมขึ้นมาใหม่ทันที หลังหยุดด้วย kill -9 แล้วดู pm2 list ใน 3 วินาทีต่อมา แอปอยู่ในสถานะ online ด้วย pid ใหม่
เมื่อเซิร์ฟเวอร์บูต systemd จะรันบริการ pm2-deploy และ PM2 จะรันแอปขึ้นมาใหม่ตามรายการที่บันทึกด้วย pm2 save

5️⃣ ใช้ HTTPS ด้วย Certbot

ถ้าใช้ปลั๊กอิน Nginx ของ Certbot คุณจะออกใบรับรองและแก้การตั้งค่า Nginx ได้ในครั้งเดียว ให้รันคำสั่งด้านล่างเมื่อโดเมนชี้มาที่ IP ของเซิร์ฟเวอร์แล้ว

sudo certbot --nginx

การติดตั้ง Certbot และการทดสอบต่ออายุอัตโนมัติดูได้ในบทความด้านล่าง คำสั่งออกใบรับรองในบทความนั้นเป็นแบบ Apache จึงเปลี่ยนเฉพาะขั้นตอนออกใบรับรองเป็นคำสั่งด้านบน

🔢 FAQ & เนื้อหาแนะนำ

ถ้า Nginx เชื่อมต่อไปยังที่อยู่ของแอปที่เขียนไว้ใน proxy_pass ไม่ได้ จะตอบกลับ 502 Bad Gateway หลังหยุดแอปด้วย pm2 stop hello แล้วส่งคำขอเดิม ได้ 502 กลับมา และใน /var/log/nginx/error.log มีบรรทัด [connect() failed (111: Connection refused) while connecting to upstream] พร้อมที่อยู่ที่พยายามเชื่อมต่อ http://127.0.0.1:3000/ ให้เริ่มตรวจใน pm2 list ว่าแอปอยู่ในสถานะ online หรือไม่ และพอร์ตที่แอปรับคำขอตรงกับที่อยู่ใน proxy_pass หรือไม่ หลังรีสตาร์ตแอป คำขอเดิมก็กลับมาเป็น 200

PM2 บันทึกเอาต์พุตของแอปเป็นไฟล์แยกตามชื่อแอปในโฟลเดอร์ .pm2/logs ใต้โฟลเดอร์โฮมของบัญชีที่รันแอป เมื่อรัน pm2 logs hello --nostream --lines 5 จะเห็นบรรทัดสุดท้ายของสองไฟล์ /home/deploy/.pm2/logs/hello-out.log และ hello-error.log และในไฟล์ out มีคำขอ GET / ที่แอปบันทึกไว้ ถ้ารันโดยไม่ใส่ --nostream ก็จะแสดง log ใหม่ต่อไปเรื่อย ๆ

บริการเริ่มอัตโนมัติลบได้ด้วย pm2 unstartup systemd หลังเพิ่มหรือลบแอป ให้รัน pm2 save อีกครั้ง แอปจึงจะทำงานตามรายการที่เปลี่ยนแล้วตอนบูต ตอนรัน pm2 startup ก็มีสองคำสั่งนี้แนะนำไว้ท้ายเอาต์พุตด้วย

🔗 เนื้อหาแนะนำ
ไฟร์วอลล์ [Ubuntu] การตั้งค่าไฟร์วอลล์ UFW บน Ubuntu ถ้าจะให้คำขอที่ Nginx รับเข้ามาได้จากภายนอกเซิร์ฟเวอร์ด้วย ต้องเปิดพอร์ต 80 และ 443 บทความนี้อธิบายวิธีเปิดพอร์ตด้วย ufw อ่านบทความ → คำสั่ง ufw status บน Ubuntu

ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Prove your humanity: 0   +   6   =