ว่ากันว่าเป็นเว็บเซิร์ฟเวอร์ที่ทำงานได้เร็วกว่า รองรับจำนวนผู้ใช้งานได้มากกว่า และกำลังมาแรงตัวหนึ่ง ด้วยจำนวนผู้ใช้งานเพิ่มขึ้นเรื่อยๆ (จากข้อมูลของ Netcraft) เลยต้องมาทดลองกันซะหน่อย
ในที่นี้จะทดลองติดตั้งและคอนฟิกแบบง่ายๆ บน CentOS 7 โดยใช้แพ็กเกจที่อยู่ใน EPEL ที่เป็นเวอร์ชัน 1.6 ซึ่งเป็นเวอร์ชันหลัก (stable) เดิมอยู่ ล่าสุด ณ ตอนที่เขียนเวอร์ชันหลัก (stable) ล่าสุดเป็นเวอร์ชัน 1.8.x แล้ว
และพร้อมติดตั้งแพ็กเกจ php-fpm เพื่อให้เว็บเซิร์ฟเวอร์ nginx รองรับการเขียนโปรแกรมด้วยภาษา php ได้
แพ็กเกจ nginx อยู่ใน repo ชื่อ epel ต้อง yum ติดตั้งแพ็กเกจ epel-release ก่อน
[root@cent7 ~]# yum install epel-release
เสร็จแล้วใช้ yum ติดตั้ง nginx
[root@cent7 ~]# yum install nginx
ใช้คำสั่ง systemctl start เพื่อรันเซอร์วิส nginx
[root@cent7 ~]# systemctl start nginx
หากยังไม่ได้เปิดพอร์ตเว็บใน firewall ต้องใช้คำสั่ง firewall-cmd เพิ่มชื่อเซอร์วิส http เพื่อให้เครื่องอื่นๆ มาเรียกใช้เซอร์วิส http หรือเปิดหน้าเว็บที่รันบนเครื่องเว็บเซิร์ฟเวอร์ได้
ตัวอย่างการใช้คำสั่ง firewall-cmd เพื่ออนุญาตให้เครื่องอื่น เข้ามาเรียกใช้เซอร์วิสเว็บได้
[root@cent7 ~]# firewall-cmd --add-service http success
ลองใช้ browser บนเครื่องอื่น เปิดหน้าเว็บของเครื่องเซิร์ฟเวอร์ดู
ไฟล์คอนฟิกหลักของ nginx คือไฟล์ /etc/nginx/nginx.conf
[root@cent7 ~]# vi /etc/nginx/nginx.conf
...
http {
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
...
}
...
}
โดยดีฟอลต์ ไดเรกทอรีหลักหน้าเว็บของ nginx คือ /usr/share/nginx/html
ตัวอย่างไฟล์ที่ถูกติดตั้งมาพร้อมแพ็กเกจ
[root@cent7 ~]# ls -l /usr/share/nginx/html/ -rw-r--r--. 1 root root 3650 Jul 3 19:42 404.html -rw-r--r--. 1 root root 3693 Jul 3 19:42 50x.html -rw-r--r--. 1 root root 3700 Jul 3 19:42 index.html -rw-r--r--. 1 root root 368 Jul 3 19:42 nginx-logo.png -rw-r--r--. 1 root root 2811 Jul 3 19:42 poweredby.png
ติดตั้งและคอนฟิกให้ nginx รองรับการเขียนโปรแกรม php
ใช้คำสั่ง yum ติดตั้งแพ็กเกจ php-fpm
[root@cent7 ~]# yum install php-fpm
แก้ไขไฟล์ php.ini เพื่อปิดคุณสมบัติ cgi.fix_pathinfo เพิ่มความปลอดภัยให้กับเว็บเซิร์ฟเวอร์
[root@cent7 ~]# vi /etc/php.ini
...
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0
แก้ไขไฟล์คอนฟิกของเซอร์วิส php-fpm โดยระบุชื่อไฟล์ socket พร้อมกับแก้ไขสิทธิ์ต่างๆ ของไฟล์ สำหรับรองรับการติดต่อกับเว็บเซิร์ฟเวอร์ ซึ่งในที่นี้ก็คือ nginx
[root@cent7 ~]# vi /etc/php-fpm.d/www.conf ; Start a new pool named 'www'. [www] ; The address on which to accept FastCGI requests. ; Valid syntaxes are: ; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on ; a specific port; ; 'port' - to listen on a TCP socket to all addresses on a ; specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. ;listen = 127.0.0.1:9000 listen = /var/run/php-fpm/php-fpm.sock ... ; Set permissions for unix socket, if one is used. In Linux, read/write ; permissions must be set in order to allow connections from a web server. Many ; BSD-derived systems allow connections regardless of permissions. ; Default Values: user and group are set as the running user ; mode is set to 0666 listen.owner = nobody listen.group = nobody ;listen.mode = 0666 ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx
ใช้คำสั่ง systemctl start เพื่อรันเซอร์วิส php-fpm
[root@cent7 ~]# systemctl start php-fpm
ถ้าแก้ไขถูกต้อง หลังจากรันเซอร์วิส php-fpm ลองใช้ ps ดูโปรเซส จะเห็นว่า php-fpm จะถูกรันด้วยผู้ใช้ชื่อ nginx
[root@cent7 ~]# ps -ef | grep php-fpm
root 2381 1 0 20:01 ? 00:00:00 php-fpm: master process (/etc/php-fpm.conf)
nginx 2382 2381 0 20:01 ? 00:00:00 php-fpm: pool www
nginx 2383 2381 0 20:01 ? 00:00:00 php-fpm: pool www
nginx 2384 2381 0 20:01 ? 00:00:00 php-fpm: pool www
nginx 2385 2381 0 20:01 ? 00:00:00 php-fpm: pool www
nginx 2386 2381 0 20:01 ? 00:00:00 php-fpm: pool www
และต้องมีไฟล์ socket ถูกสร้างขึ้น
[root@cent7 ~]# ls -l /var/run/php-fpm/php-fpm.sock srw-rw-rw-. 1 nobody nobody 0 Nov 10 20:01 /var/run/php-fpm/php-fpm.sock
แก้ไขคอนฟิกไฟล์ของ nginx โดยเพิ่มคอนฟิกส่วน location ~ \.php$ เข้าไปภายใต้คอนฟิกส่วน server {}
[root@cent7 ~]# vi /etc/nginx/nginx.conf ... http { server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } ... } }
ใช้คำสั่ง systemctl restart รีสตาร์ตเซอร์วิส nginx เพื่อให้คอนฟิกที่แก้ไขมีผล
[root@cent7 nginx]# systemctl restart nginx
ลองเขียนไฟล์เพื่อทดสอบการรัน php
[root@cent7 ~]# vi /usr/share/nginx/html/test.php <?php phpinfo(); ?>
แล้วทดลองใช้ browser เปิดหน้าเว็บ โดยระบุชื่อไฟล์ php ที่สร้างขึ้น
เท่านี้ก็เราก็ได้ nginx ทำหน้าที่เป็นเว็บเซิร์ฟเวอร์แล้ว
หากต้องการจะลง php โมดูลส่วนอื่นๆ ก็ทำได้โดยติดตั้งแพ็กเกจ php อื่นๆ เพิ่มเติมเข้าไป แต่ถ้าจะให้โมดูล php มีผล ต้องรีสตาร์ตเซอร์วิส php-fpm
ตัวอย่างติดตั้ง php-mysql เพิ่มเติม
[root@cent7 ~]# yum install php-mysql
รีสตาร์ตเซอร์วิส php-fpm
[root@cent7 ~]# systemctl restart php-fpm
แล้วลองรีเฟรซหน้า test.php ใหม่ จะเห็นโมดูล mysql เพิ่มเติมขึ้นมา