ติดตั้งและคอนฟิก nginx บน CentOS 7

ว่ากันว่าเป็นเว็บเซิร์ฟเวอร์ที่ทำงานได้เร็วกว่า รองรับจำนวนผู้ใช้งานได้มากกว่า และกำลังมาแรงตัวหนึ่ง ด้วยจำนวนผู้ใช้งานเพิ่มขึ้นเรื่อยๆ (จากข้อมูลของ 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 บนเครื่องอื่น เปิดหน้าเว็บของเครื่องเซิร์ฟเวอร์ดู
n01-Welcome-to-nginx

ไฟล์คอนฟิกหลักของ 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 ที่สร้างขึ้น
n02-nginx-with-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 เพิ่มเติมขึ้นมา
n03-nginx-with-php-mysql

ข้อมูลอ้างอิง

Leave a Reply

Your email address will not be published.