Trang chủ Linux WebserverNGINX LEMP cho VPS [Phần 1] – Cài đặt NGINX và PHP-FPM

LEMP cho VPS [Phần 1] – Cài đặt NGINX và PHP-FPM

Bởi Thạch Phạm
Ngày đăng: Cập nhật cuối: 23 bình luận 7,4K lượt xem
Bài này thuộc phần 1 của 9 phần trong serie LEMP cho VPS

Với sự bủng nổ và số lượng người dùng NGINX không ngừng tăng thì hiện nay NGINX ngày càng trở nên phổ biến rộng rãi không kém phần Apache, do đó nếu bây giờ bạn sử dụng NGINX thì cũng không khó để tìm các bài hướng dẫn cấu hình chi tiết.

Ở bài này, mình sẽ hướng dẫn qua cho bạn cách cài đặt NGINX để làm Webserver và các cấu hình cần thiết. Hãy nên nhớ, serie này mình sẽ hướng dẫn sử dụng NGINX làm Webserver chứ không phải Proxy Server để kết hợp với Apache nên mong bạn đừng lẫn lộn.

I. Tại sao NGINX lại nhanh hơn Apache?

Hầu hết các Webserver hiện nay đều xử lý các truy vấn từ máy khách đến máy chủ bằng các thread (bạn cứ hiểu thread là một cỗ máy giúp nó xử lý truy vấn), và mỗi truy vấn khách sẽ được server xử lý bằng một thread riêng biệt cho đến khi nó hoàn thành nhiệm vụ. Do đó, ổ cứng trên server sẽ mất nhiều thời gian hơn để giải phóng các thread đã hoàn thành nhiệm vụ, và việc tạo ra nhiều thread cũng sẽ làm server tiêu hao rất nhiều tài nguyên (CPU, RAM).

NGINX sinh ra là để khắc phục nhược điểm đó, nó không phụ thuộc vào số lượng thread trên server mà bạn sẽ có quyền phân chia tổng số thread trên server ra số lượng worker processes tùy thích và các worker processes này sẽ lặp lại quá trình trong mỗi truy vấn gửi tới server mà không cần máy chủ tạo ra thread riêng.

nginx-worker-process

Các worker cũng không thể tốn nhiều tài nguyên để xử lý và nó cũng không tự chặn lẫn nhau như Apache để giải phóng bộ nhớ vì nó sử dụng kỹ thuật Tải không đồng bộ (Asynchronous). Nghĩa là nó sẽ được xử lý luân phiên nhau theo một chu kỳ.

Còn rất nhiều nữa nhưng có thể trong bài này mình không thể nhắc qua hết mà mình chỉ cần bạn biết tại sao NGINX lại mạnh hơn Apache mà thôi.

Xem thêm: How is NGINX different from Apache.

II. Nạp package cần thiết

Đầu tiên bạn hãy nhớ rằng, serie này mình viết dành cho hệ điều hành CentOS 6.5 trở lên nên bạn cần có một VPS sử dụng CentOS 6.5 và chưa cài bất cứ cái gì vào.

Do cả NGINX và PHP-FPM đều không có sẵn trong gói Yum mặc định của CentOS nên chúng ta phải nạp một package từ bên ngoài vào.
Với package này bạn sẽ cài được NGINX 1.6.2 và PHP/PHP-FPM mới nhất.

Bạn chạy lần lượt 2 lệnh sau:

# CentOS 32-Bit
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

# CentOS 64-Bit
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

Sau đó tạo 1 file tên là nginx.repo trong thư mục /etc/yum.repos.d/ rồi copy đoạn dưới đây vào:


name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Nếu bạn muốn dùng NGINX bản mới nhất thì dùng đoạn dưới:

name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

III. Cài đặt NGINX và PHP-FPM

Trước khi cài đặt, hãy tiến hành tắt SELinux đi bằng cách mở file /etc/sysconfig/selinux và tìm SELINUX= rồi sửa thành như dưới đây:

SELINUX=disabled

Sửa xong, hãy gõ lệnh reboot để khởi động lại máy chủ và đăng nhập vào lại SSH.

Sau đó là cài NGINX và PHP cùng các module cần thiết:

yum –enablerepo=remi,remi-php56 install nginx php-fpm php-mysql php-common php-mbstring php-mcrypt php-gd

Lưu ý thêm là nếu sau này bạn cần cài thêm công cụ gì thì tốt nhất nên chạy lệnh yum là yum --enablerepo=remi,remi-php56 để được cài nhiều chức năng hơn, phiên bản mới hơn và tương thích với PHP 5.6

Một số tên ứng dụng có thể bạn muốn cài đặt

  • php-pecl-memcached – Memcached Server
  • php-pecl-memcache – extension chạy Memcached dành cho PHP
  • php-opcache – Zend Opcache
  • apcu – APC Opcode Cache

Output trả về:

Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
epel/metalink                                            |  16 kB     00:00
 * base: centos.mirror.iweb.ca
 * epel: epel.mirrors.ovh.net
 * extras: centos.mirror.iweb.ca
 * remi: rpms.famillecollet.com
 * remi-php56: rpms.famillecollet.com
 * updates: centos.mirror.iweb.ca
base                                                     | 3.7 kB     00:00
epel                                                     | 4.4 kB     00:00
epel/primary_db                                          | 5.3 MB     00:01
extras                                                   | 3.3 kB     00:00
extras/primary_db                                        |  28 kB     00:00
nginx                                                    | 2.9 kB     00:00
nginx/primary_db                                         |  35 kB     00:00
remi                                                     | 2.9 kB     00:00
remi/primary_db                                          | 743 kB     00:00
remi-php56                                               | 2.9 kB     00:00
remi-php56/primary_db                                    | 168 kB     00:00
updates                                                  | 3.4 kB     00:00
updates/primary_db                                       | 149 kB     00:00
Package php-mysql is obsoleted by php-mysqlnd, trying to install php-mysqlnd-5.6                              .2-1.el6.remi.i686 instead
Resolving Dependencies
--> Running transaction check
---> Package nginx.i386 0:1.6.2-1.el6.ngx will be installed
---> Package php-common.i686 0:5.6.2-1.el6.remi will be installed
--> Processing Dependency: php-pecl-zip(x86-32) for package: php-common-5.6.2-1.                              el6.remi.i686
--> Processing Dependency: php-pecl-jsonc(x86-32) for package: php-common-5.6.2-                              1.el6.remi.i686
---> Package php-fpm.i686 0:5.6.2-1.el6.remi will be installed
---> Package php-gd.i686 0:5.6.2-1.el6.remi will be installed
--> Processing Dependency: gd-last(x86-32) >= 2.1.0-3 for package: php-gd-5.6.2-                              1.el6.remi.i686
--> Processing Dependency: libvpx.so.1 for package: php-gd-5.6.2-1.el6.remi.i686
--> Processing Dependency: libt1.so.5 for package: php-gd-5.6.2-1.el6.remi.i686
--> Processing Dependency: libpng12.so.0 for package: php-gd-5.6.2-1.el6.remi.i6                              86
--> Processing Dependency: libjpeg.so.62 for package: php-gd-5.6.2-1.el6.remi.i6                              86
--> Processing Dependency: libgd.so.3 for package: php-gd-5.6.2-1.el6.remi.i686
--> Processing Dependency: libfreetype.so.6 for package: php-gd-5.6.2-1.el6.remi                              .i686
--> Processing Dependency: libXpm.so.4 for package: php-gd-5.6.2-1.el6.remi.i686
--> Processing Dependency: libX11.so.6 for package: php-gd-5.6.2-1.el6.remi.i686
---> Package php-mbstring.i686 0:5.6.2-1.el6.remi will be installed
---> Package php-mcrypt.i686 0:5.6.2-1.el6.remi will be installed
--> Processing Dependency: libmcrypt.so.4 for package: php-mcrypt-5.6.2-1.el6.re                              mi.i686
--> Processing Dependency: libltdl.so.7 for package: php-mcrypt-5.6.2-1.el6.remi                              .i686
---> Package php-mysqlnd.i686 0:5.6.2-1.el6.remi will be installed
--> Processing Dependency: php-pdo(x86-32) = 5.6.2-1.el6.remi for package: php-m                              ysqlnd-5.6.2-1.el6.remi.i686
--> Running transaction check
---> Package freetype.i686 0:2.3.11-14.el6_3.1 will be installed
---> Package gd-last.i686 0:2.1.0-3.el6.remi will be installed
--> Processing Dependency: libtiff.so.3 for package: gd-last-2.1.0-3.el6.remi.i6                              86
--> Processing Dependency: libfontconfig.so.1 for package: gd-last-2.1.0-3.el6.r                              emi.i686
---> Package libX11.i686 0:1.6.0-2.2.el6 will be installed
--> Processing Dependency: libX11-common = 1.6.0-2.2.el6 for package: libX11-1.6                              .0-2.2.el6.i686
--> Processing Dependency: libxcb.so.1 for package: libX11-1.6.0-2.2.el6.i686
---> Package libXpm.i686 0:3.5.10-2.el6 will be installed
---> Package libjpeg-turbo.i686 0:1.2.1-3.el6_5 will be installed
---> Package libmcrypt.i686 0:2.5.8-9.el6 will be installed
---> Package libpng.i686 2:1.2.49-1.el6_2 will be installed
---> Package libtool-ltdl.i686 0:2.2.6-15.5.el6 will be installed
---> Package libvpx.i686 0:1.3.0-5.el6_5 will be installed
---> Package php-pdo.i686 0:5.6.2-1.el6.remi will be installed
---> Package php-pecl-jsonc.i686 0:1.3.6-1.el6.remi.5.6.1 will be installed
--> Processing Dependency: /usr/bin/pecl for package: php-pecl-jsonc-1.3.6-1.el6                              .remi.5.6.1.i686
--> Processing Dependency: /usr/bin/pecl for package: php-pecl-jsonc-1.3.6-1.el6                              .remi.5.6.1.i686
---> Package php-pecl-zip.i686 0:1.12.4-2.el6.remi.5.6 will be installed
---> Package t1lib.i686 0:5.1.2-6.el6_2.1 will be installed
--> Running transaction check
---> Package fontconfig.i686 0:2.8.0-5.el6 will be installed
---> Package libX11-common.noarch 0:1.6.0-2.2.el6 will be installed
---> Package libtiff.i686 0:3.9.4-10.el6_5 will be installed
---> Package libxcb.i686 0:1.9.1-2.el6 will be installed
--> Processing Dependency: libXau.so.6 for package: libxcb-1.9.1-2.el6.i686
---> Package php-pear.noarch 1:1.9.5-3.el6.remi will be installed
--> Processing Dependency: php-xml for package: 1:php-pear-1.9.5-3.el6.remi.noar                              ch
--> Processing Dependency: php-posix for package: 1:php-pear-1.9.5-3.el6.remi.no                              arch
--> Processing Dependency: php-cli for package: 1:php-pear-1.9.5-3.el6.remi.noar                              ch
--> Running transaction check
---> Package libXau.i686 0:1.0.6-4.el6 will be installed
---> Package php-cli.i686 0:5.6.2-1.el6.remi will be installed
---> Package php-process.i686 0:5.6.2-1.el6.remi will be installed
---> Package php-xml.i686 0:5.6.2-1.el6.remi will be installed
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.24) for package: php-xml-5.6                              .2-1.el6.remi.i686
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.22) for package: php-xml-5.6                              .2-1.el6.remi.i686
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.18) for package: php-xml-5.6                              .2-1.el6.remi.i686
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.13) for package: php-xml-5.6                              .2-1.el6.remi.i686
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.11) for package: php-xml-5.6                              .2-1.el6.remi.i686
--> Processing Dependency: libxslt.so.1 for package: php-xml-5.6.2-1.el6.remi.i6                              86
--> Processing Dependency: libexslt.so.0 for package: php-xml-5.6.2-1.el6.remi.i                              686
--> Running transaction check
---> Package libxslt.i686 0:1.1.26-2.el6_3.1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package            Arch       Version                     Repository      Size
================================================================================
Installing:
 nginx              i386       1.6.2-1.el6.ngx             nginx          343 k
 php-common         i686       5.6.2-1.el6.remi            remi-php56     1.0 M
 php-fpm            i686       5.6.2-1.el6.remi            remi-php56     1.3 M
 php-gd             i686       5.6.2-1.el6.remi            remi-php56      69 k
 php-mbstring       i686       5.6.2-1.el6.remi            remi-php56     955 k
 php-mcrypt         i686       5.6.2-1.el6.remi            remi-php56      41 k
 php-mysqlnd        i686       5.6.2-1.el6.remi            remi-php56     3.7 M
Installing for dependencies:
 fontconfig         i686       2.8.0-5.el6                 base           186 k
 freetype           i686       2.3.11-14.el6_3.1           base           363 k
 gd-last            i686       2.1.0-3.el6.remi            remi           134 k
 libX11             i686       1.6.0-2.2.el6               base           591 k
 libX11-common      noarch     1.6.0-2.2.el6               base           192 k
 libXau             i686       1.0.6-4.el6                 base            24 k
 libXpm             i686       3.5.10-2.el6                base            50 k
 libjpeg-turbo      i686       1.2.1-3.el6_5               base           177 k
 libmcrypt          i686       2.5.8-9.el6                 epel            94 k
 libpng             i686       2:1.2.49-1.el6_2            base           184 k
 libtiff            i686       3.9.4-10.el6_5              base           339 k
 libtool-ltdl       i686       2.2.6-15.5.el6              base            45 k
 libvpx             i686       1.3.0-5.el6_5               base           490 k
 libxcb             i686       1.9.1-2.el6                 base           115 k
 libxslt            i686       1.1.26-2.el6_3.1            base           451 k
 php-cli            i686       5.6.2-1.el6.remi            remi-php56     3.8 M
 php-pdo            i686       5.6.2-1.el6.remi            remi-php56     108 k
 php-pear           noarch     1:1.9.5-3.el6.remi          remi           375 k
 php-pecl-jsonc     i686       1.3.6-1.el6.remi.5.6.1      remi-php56      48 k
 php-pecl-zip       i686       1.12.4-2.el6.remi.5.6       remi-php56     273 k
 php-process        i686       5.6.2-1.el6.remi            remi-php56      54 k
 php-xml            i686       5.6.2-1.el6.remi            remi-php56     201 k
 t1lib              i686       5.1.2-6.el6_2.1             base           152 k

Transaction Summary
================================================================================
Install      30 Package(s)

Total download size: 16 M
Installed size: 46 M
Is this ok : y^: y
Downloading Packages:
(1/30): fontconfig-2.8.0-5.el6.i686.rpm                                                | 186 kB     00:00
(2/30): freetype-2.3.11-14.el6_3.1.i686.rpm                                            | 363 kB     00:00
(3/30): gd-last-2.1.0-3.el6.remi.i686.rpm                                              | 134 kB     00:00
(4/30): libX11-1.6.0-2.2.el6.i686.rpm                                                  | 591 kB     00:00
(5/30): libX11-common-1.6.0-2.2.el6.noarch.rpm           | 192 kB     00:00
(6/30): libXau-1.0.6-4.el6.i686.rpm                      |  24 kB     00:00
(7/30): libXpm-3.5.10-2.el6.i686.rpm                     |  50 kB     00:00
(8/30): libjpeg-turbo-1.2.1-3.el6_5.i686.rpm             | 177 kB     00:00
(9/30): libmcrypt-2.5.8-9.el6.i686.rpm                   |  94 kB     00:00
(10/30): libpng-1.2.49-1.el6_2.i686.rpm                  | 184 kB     00:00
(11/30): libtiff-3.9.4-10.el6_5.i686.rpm                 | 339 kB     00:00
(12/30): libtool-ltdl-2.2.6-15.5.el6.i686.rpm            |  45 kB     00:00
(13/30): libvpx-1.3.0-5.el6_5.i686.rpm                   | 490 kB     00:00
(14/30): libxcb-1.9.1-2.el6.i686.rpm                     | 115 kB     00:00
(15/30): libxslt-1.1.26-2.el6_3.1.i686.rpm               | 451 kB     00:00
(16/30): nginx-1.6.2-1.el6.ngx.i386.rpm                  | 343 kB     00:00
(17/30): php-cli-5.6.2-1.el6.remi.i686.rpm               | 3.8 MB     00:01
(18/30): php-common-5.6.2-1.el6.remi.i686.rpm            | 1.0 MB     00:00
(19/30): php-fpm-5.6.2-1.el6.remi.i686.rpm                                                                           | 1.3 MB     00:00
(20/30): php-gd-5.6.2-1.el6.remi.i686.rpm                                                                            |  69 kB     00:00
(21/30): php-mbstring-5.6.2-1.el6.rem (63%) 16%   0                              (21/30): php-mbstring-5.6.2-1.el6.remi.i686.rpm          | 955 kB     00:00
(22/30): php-mcrypt-5.6.2-1.el6.remi.i686.rpm            |  41 kB     00:00
(23/30): php-mysqlnd-5.6.2-1.el6.remi.i686.rpm           | 3.7 MB     00:01
(24/30): php-pdo-5.6.2-1.el6.remi.i686.rpm               | 108 kB     00:00
(25/30): php-pear-1.9.5-3.el6.remi.noarch.rpm            | 375 kB     00:00
(26/30): php-pecl-jsonc-1.3.6-1.el6.remi.5.6.1.i686.rpm  |  48 kB     00:00
(27/30): php-pecl-zip-1.12.4-2.el6.remi.5.6.i686.rpm     | 273 kB     00:00
(28/30): php-process-5.6.2-1.el6.remi.i686.rpm           |  54 kB     00:00
(29/30): php-xml-5.6.2-1.el6.remi.i686.rpm               | 201 kB     00:00
(30/30): t1lib-5.1.2-6.el6_2.1.i686.rpm                  | 152 kB     00:00
--------------------------------------------------------------------------------
Total                                           925 kB/s |  16 MB     00:17
warning: rpmts_HdrFromFdno: Header V3 DSA/SHA1 Signature, key ID 00f97f56: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
Importing GPG key 0x00F97F56:
 Userid : Remi Collet 
 Package: remi-release-6.5-1.el6.remi.noarch (installed)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
Is this ok : y
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
Importing GPG key 0x0608B895:
 Userid : EPEL (6) 
 Package: epel-release-6-8.noarch (installed)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
Is this ok : y
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: RPMDB altered outside of yum.
  Installing : libjpeg-turbo-1.2.1-3.el6_5.i686 service nginx start
service php-fpm start
chkconfig php-fpm on
chkconfig nginx on

Output trả về:

# service nginx start
Starting nginx:                                            
# service php-fpm start
Starting php-fpm:                                          
# chkconfig php-fpm on
# chkconfig nginx on

Kiểm tra phiên bản NGINX và PHP-FPM:

nginx -v
php-fpm -v

# php-fpm -v
PHP 5.6.1 (fpm-fcgi) (built: Oct  3 2014 07:29:26)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
# nginx -v
nginx version: nginx/1.6.2

 

Bây giờ bạn hãy truy cập vào địa chỉ là http://ip-của-vps rồi xem nó đã hiện trang Welcome của NGINX chưa nhé. Nếu hiện như ở dưới thì thành công:

Trang Welcome của NGINX

Trang Welcome của NGINX

IV. Thiết lập lại user và group chạy PHP

Mặc định PHP-FPM sẽ chỉ định user tên là apache và group tên apache để chạy nó, nhưng ở đây chúng ta không sử dụng Apache mà là NGINX nên bạn cần mở file /etc/php-fpm.d/www.conf lên và tìm:

user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache

Thay thành

user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

Lưu lại và khởi động lại PHP-FPM

service php-fpm restart

Nếu bạn cần cách thiết lập từng user riêng theo domain thì mình đã hướng dẫn ở phần 7.

Tạm thời bài này chúng ta kết thúc ở đây, ở bài tiếp theo chúng ta sẽ đi vào bước tạo Virtual Host - hay còn gọi là thêm domain vào VPS đó.

Đánh giá nội dung này

Tham gia nhóm hỗ trợ WordPress

Tham gia nhóm Hỗ trợ Server - Hosting & WordPress để cùng nhau hỏi đáp và hỗ trợ các vấn đề về WordPress, tối ưu máy chủ/server.

Tham gia ngay
23 bình luận

Có thể bạn quan tâm

Hiện tại blog tạm đóng bình luận vì mình cần tập trung thời gian vào cập nhật bài viết. Bình luận sẽ mở ra cho đến khi mình sẵn sàng.