มาดูวิธีการติดตั้งและคอนฟิก nginx บน Ubuntu 16.04 เพื่อรันเป็นเว็บเซิร์ฟเวอร์เบื้องต้นกัน
ใช้คำสั่ง apt install ติดตั้งแพ็คเกจชื่อ nginx
dev@ubuntu-1604:~$ sudo apt install nginx Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libjbig0 libjpeg-turbo8 libjpeg8 libtiff5 libvpx3 libxpm4 nginx-common nginx-core Suggested packages: libgd-tools fcgiwrap nginx-doc ssl-cert The following NEW packages will be installed: fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libjbig0 libjpeg-turbo8 libjpeg8 libtiff5 libvpx3 libxpm4 nginx nginx-common nginx-core 0 upgraded, 13 newly installed, 0 to remove and 0 not upgraded. Need to get 2,850 kB of archives. After this operation, 9,314 kB of additional disk space will be used. Do you want to continue? [Y/n] y ...
หลัง apt ติดตั้งเสร็จเรียบร้อย โปรเซส nginx จะถูกรันขึ้นมาโดยอัตโนมัติ
คอนฟิกไฟล์หลักของ nginx ที่ได้จากการติดตั้งด้วยคำสั่ง apt บน Ubuntu 16.04 คือไฟล์ /etc/nginx/nginx.conf
ตัวอย่างไฟล์คอนฟิกหลักของ nginx ในที่นี้ขอแสดงเฉพาะส่วนของคอนฟิกพื้นฐาน ที่จะอธิบาย
dev@ubuntu-1604:~$ vi /etc/nginx/nginx.conf user www-data; ... http { .... ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; .... ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } ...
คำอธิบาย
- คอนฟิก user จะเป็นชื่อ user ที่ใช้ในการรันโปรเซส nginx
dev@ubuntu-1604:~$ ps -ef | grep nginx
root 12533 1 0 19:17 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 12534 12533 0 19:17 ? 00:00:00 nginx: worker process
- access_log ระบุชื่อไฟล์ที่ใช้เก็บประวัติการเรียกใช้เว็บเซิร์ฟเวอร์
- error_log ระบุชื่อไฟล์ที่ใช้เก็บข้อผิดพลาด (error) ที่เกิดขึ้น
- include ระบุชื่อไฟล์คอนฟิกเพิ่มเติม ที่ nginx จะไปอ่าน ในที่นี้ขออธิบายเฉพาะ sites-enabled
การระบุไฟล์คอนฟิก /etc/nginx/sites-enabled/* หมายถึง ให้ nginx ไปอ่านทุกไฟล์ ที่อยู่ในไดเรคทอรี /etc/nginx/sites-enabled/ เพื่อคอนฟิกเพิ่มเติม
ดีฟอลต์จากการติดตั้ง ถ้าลอง ls -l ดูชื่อไฟล์ในไดเรคทอรีนี้
dev@ubuntu-1604:~$ ls -l /etc/nginx/sites-enabled/ total 0 lrwxrwxrwx 1 root root 34 Oct 16 19:17 default -> /etc/nginx/sites-available/default
จะเห็นลิงก์ไฟล์ (symbolic link) ไปยังไฟล์ /etc/nginx/sites-available/default
ลองเปิดไฟล์ที่ถูกลิงก์ไป
dev@ubuntu-1604:~$ vi /etc/nginx/sites-available/default ... server { listen 80 default_server; listen [::]:80 default_server; ... root /var/www/html; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html; ...
ไฟล์ default นี้เป็นไฟล์ที่ระบุคอนฟิกส่วนเว็บเซิร์ฟเวอร์ (server) โดยระบุหมายเลขพอร์ต (listen 80) ที่ใช้รอรับการเรียกเว็บจากไคลเอนต์
root เป็นคอนฟิกกำหนดไดเรคทอรีหลัก ตอนเรียกเว็บเซิร์ฟเวอร์โดยไม่ได้ระบุพาธใดๆ ต่อท้ายชื่อเว็บไซต์ เช่น http://www.example.com
index เป็นคอนฟิกกำหนดลำดับชื่อไฟล์ในไดเรคทอรี ที่จะทำหน้าที่เป็นไฟล์เว็บ หากไม่มีการระบุชื่อไฟล์ตอนเรียกพาธของเว็บ
ทดลองใช้ browser เข้าเว็บไซต์ โดยระบุ IP ของเครื่องเซิร์ฟเวอร์ Ubuntu
ตัวอย่างหน้าจอเว็บดีฟอลต์ของ เว็บเซิร์ฟเวอร์ nginx
คำอธิบายคือ browser เข้าเว็บเซิร์ฟเวอร์โดยการระบุ IP ของตัวเซิร์ฟเวอร์ แต่ไม่ได้ระบุพาธ หรือชื่อไฟล์ใดๆ ต่อท้าย
เพราะฉะนั้น เว็บเซิร์ฟเวอร์ nginx จะไปเรียกไฟล์ที่อยู่ในไดเรคทอรีที่ระบุเป็น root แล้วไล่หาไฟล์ที่อยู่ในคอนฟิก index ตามลำดับ
ถ้า ls -l ดูไฟล์ที่อยู่ในไดเรคทอรี root หรือโดยดีฟอลต์คือ /var/www/html/
dev@ubuntu-1604:~$ ls -l /var/www/html/ total 4 -rw-r--r-- 1 root root 612 Oct 16 19:17 index.nginx-debian.html
ไฟล์ index.nginx-debian.html จะอยู่ในรายชื่อของ คอนฟิก index ด้วย
ดังนั้นไฟล์นี้จะถูกเรียกขึ้นมาแสดงผลผ่านหน้าเว็บ
dev@ubuntu-1604:~$ vi /var/www/html/index.nginx-debian.html <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
ตัวอย่างข้อความที่แสดงในไฟล์ access_log
dev@ubuntu-1604:~$ tail /var/log/nginx/access.log 192.168.56.1 - - [16/Oct/2016:20:29:58 +0700] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 Chrome/53.0..."
ไฟล์ index.html
ถ้าลองสร้างไฟล์ index.html ซึ่งมีลำดับนำหน้าไฟล์ index.nginx-debian.html
dev@ubuntu-1604:~$ sudo vi /var/www/html/index.html
test index order by creating index.html
dev@ubuntu-1604:~$ ls -l /var/www/html/
total 8
-rw-r--r-- 1 root root 40 Oct 16 20:11 index.html
-rw-r--r-- 1 root root 612 Oct 16 19:17 index.nginx-debian.html
แล้วลอง refresh บน browser ดู
ไฟล์ index.html จะถูกเรียกขึ้นมาแสดงหน้าเว็บแทน เพราะมีลำดับก่อนหน้า ในคอนฟิก index
หรือจะเรียกเว็บโดยระบุชื่อไฟล์ ก็จะให้ผลเหมือนกัน เช่นระบุเป็น
http://192.168.56.116/index.html
หรือถ้าต้องการเรียกไฟล์ index.nginx-debian.html ขึ้นมาแสดง ก็สามารถระบุที่อยู่เป็น
http://192.168.56.116/index.nginx-debian.html
403 Forbidden
ถ้าลองลบไฟล์ทั้งสองไฟล์ออกไป
dev@ubuntu-1604:~$ sudo rm /var/www/html/index.html dev@ubuntu-1604:~$ sudo rm /var/www/html/index.nginx-debian.html
ลอง refresh บน browser ดู
ขึ้นข้อความ 403 Forbidden คือไม่มีไฟล์ที่ระบุในคอนฟิก index ในพาธที่ระบุ
หมายเหตุ จะแตกต่างจาก 404 Not Found ด้านล่างคือ พาธที่เรียกแล้วขึ้น 403 นี้มีไดเรคทอรีอยู่ แต่ไม่มีไฟล์ที่ทำหน้าที่ index
ตัวอย่างข้อความในไฟล์ access_log ที่เรียกพาธ แต่ไม่ได้ระบุไฟล์ และก็ไม่มีมีไฟล์ที่ทำหน้าที่เป็น index
dev@ubuntu-1604:~$ tail /var/log/nginx/access.log 192.168.56.1 - - [16/Oct/2016:20:31:42 +0700] "GET / HTTP/1.1" 403 208 "-" "Mozilla/5.0 Chrome/53.0..."
สังเกตตัวเลข 403 ในไฟล์ access_log แสดงผลการเรียกพาธ ที่ไม่มีไฟล์ที่ทำหน้าที่ index
ตัวอย่างข้อความที่แสดงในไฟล์ error_log
dev@ubuntu-1604:~$ tail /var/log/nginx/error.log
2016/10/16 20:31:42 [error] 12534#12534: *15 directory index of "/var/www/html/" is forbidden, client: 192.168.56.1, server: _, request: "GET / HTTP/1.1", host: "192.168.56.116"
404 Not Found
ถ้าลองเรียกไฟล์หรือพาธที่ไม่มีอยู่บนเว็บเซิร์ฟเวอร์ จะขึ้นข้อความ 404 Not Found
ตัวอย่างข้อความในไฟล์ access_log กรณีที่เรียกไฟล์หรือพาธที่ไม่มี
dev@ubuntu-1604:~$ tail /var/log/nginx/access.log 192.168.56.1 - - [16/Oct/2016:20:33:51 +0700] "GET /nofile.html HTTP/1.1" 404 209 "-" "Mozilla/5.0 Chrome/53.0..."
สังเกตตัวเลข 404 ในไฟล์ access_log แสดงผลการเรียกไฟล์ที่ไม่มี