[LEMP – IV] Cài đặt PHP 7 và PHP-FPM trên NGINX 1.9 với CentOS 7

Tiếp tục Phần IV, bài này sẽ hướng dẫn các bạn cấu hình php 7/php-fpm, nginx trên VPS để chúng làm việc được với nhau và tìm hiểu những thông số, cú pháp cơ bản được dùng khi cấu hình.

Đọc lại các phần trước:

Phần I: Tổng quan và các bước cài đặt NGINX cơ bản.
Phần II: Cấu hình NGINX tạo Virtual Host trên Linux.
Phần III: Cài MariaDB 10 trên CentOS Server.

Các nội dung chính của bài bao gồm.

1. Thêm repository Epel và Remi

Sau khi SSH vào máy chủ, việc đầu tiên cần làm là update thêm repo cho OS.

Epel và Remi là gì ? Đây là hai kho cung cấp các gói cài đặt cho linux uy tín trên thế giới tất cả các chương trình muốn cài đặt trên Linux RHEL/CentOS/Fedora đều có ở đây cả.

Để download và cài repo bạn chạy lệnh:

EPEL Repository

wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-7.noarch.rpm
#Cài đặt
yum install epel-release

REMI Repository

wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
#Cài đặt
rpm -Uvh remi-release-7*.rpm epel-release-7*.rpm

 

Repo đã được add vào hệ thống nhưng vẫn chưa cho phép tải package về bằng cách mở file remi-php70.repo sửa giá trị thành enabled=1.

vi /etc/yum.repo.d/remi-php70.repo

Kết quả như hình dưới.

Edit repo remi cài php 7

2. Cài đặt PHP 7

Chạy lệnh cài đặt.

yum install php php-mysql php-fpm

Tiếp theo cần sửa file php.ini,nhưng trước tiên cần lưu lại một bản phòng rủi ro.

 cp /etc/php.ini /var/www/demo1.thuysys.com/backup/php.ini.bak

Chạy lệnh

 vi /etc/php.ini

Tìm đến cgi.fix_pathinfo bỏ dấu ; và gán cho nó giá trị là 0.

cgi.fix_pathinfo=0

cgi.fix_pathinfo là gì ? mình cùng tìm hiểu tại sao đặt giá trị là 0, theo PHP giải thích:

; 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

Do liên quan đến bảo mật webserverperformance mình giải thích nôm na như này.

Chúng ta xét một link như sau.

demo1.thuysys.com/info.php/abc/fuck.jpg

Trong đó

REQUEST_URI: là demo1.thuysys.com/info.php/abc/fuck.jpg đây là đường dẫn người dùng nhập trên address bar của trình duyệt, đoạn abc/fuck.jpg không tồn tại trên webserver.

SCRIPT_FILENAME: là /var/www/demo1.thuysys.com/public_html/info.php đường dẫn file info.php có thực trên webserver.

PATH_INFO: là đoạn /abc/fuck.jpg .

Nếu cgi.fix_pathinfo=1, thì khi client tạo truy vấn đến webserver là REQUEST_URI (đây một truy vấn sai vì file /abc/fuck.ipg không tồn tại). Webserver sẽ vẫn hiển thị PATH_INFO là đoạn abc/fuck.jpg trên trình duyệt nhưng giá trị lại là giá trị của cái SCRIPT_FILENAME.

 

Cấu hình cgi.fix_pathinfo

Như các bạn thấy trên hình, mặc dù request đến file không tồn tại, webserver không hề hiện thống báo lỗi mà vẫn hiển thị kết quả ra trình duyệt và nó lấy file info.php để hiển thị.

Việc này tạo ra kẽ hở làm tiêu tốn tài nguyên về hiển thị không đúng, mấy bác coder chăc rõ cái này hơn :).

3. Cấu hình PHP-FPM làm việc với NGINX.

Cấu hình php-fpm

Như mọi lần, mình tạo một bảo sao lưu

cp /etc/php-fpm.d/www.conf /var/www/demo1.thuysys.com/backup/www.conf.bak

Mớ file www.conf 

vi /etc/php-fpm.d/www.conf

Thay đổi i thông số như bên dưới.

user = nginx
group = nginx
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Trong đó:

listen: khai báo dùng unix domain thay cho socket domain

listen = 127.0.0.1:9000 
#Thành 
listen = /var/run/php-fpm/php-fpm.sock

listen.owner, listen.group, listen.mode: khai báo user làm việc với php-fpm với quyền 0660, nếu bị lỗi 502 Bad Gateway thì bạn xem lại giá trị này đã đúng hay chưa.

Khởi động php-fpm và cho phép boot cùng hệ điều hành.

systemctl enable php-fpm.service
systemctl start php-fpm.service

Sang phần cấu hình webserver nginx

4. Cấu hình NGINX

Tạo một file virtualhost

vi /etc/nginx/conf/demo1.thuysys.com.conf

Có nội dung như sau

server {
listen  80;
server_name demo1.thuysys.com www.demo1.thuysys.com;
access_log /var/www/demo1.thuysys.com/logs/access.log;
error_log /var/www/demo1.thuysys.com/logs/error.log;

root  /var/www/demo1.thuysys.com/public_html;
index index.php;

location / {
    try_files $uri $uri/ /index.php?$args;
    }

location ~ \.php$ {
    fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
    }

location ~ /\.ht {
        deny  all;
    }
}

Tất cả directive thuộc block server {…} đã nói ở phần trước rồi mình không nói lại nữa, chúng ta tập trung vào nội dung trong các block con location {…} thôi.

location / {…}

Cấu hình rewrite url trong nginx

Toàn bộ nội dung trong block này nhằm kích hoạt Permalink Settings trong WordPress để có url thân thiện chuẩn SEO trên trình duyệt dạng /%category%/%postname%.html

Chú ý directive try_files chỉ dùng trong block location, với các đối số như trên.

location ~ \.php$ {…}

Cấu hình unix domain trong nginx

Block  : Ở đây, do chay trên cùng một server không dựng loadbalance cho backend mình cấu hình server dùng domain socket thay cho tcp socket để có hiệu suất cao hơn. Xin nói thêm cú pháp ~ \.php$ là chuỗi regular expression được dùng để xử lý chuỗi rất nhiều khi cấu hình Apache Web Server, nó có nghĩa tất cả directive bên trong block location này sẽ chỉ được áp dụng cho những file có phần mở rộng là .php.

location ~ /\.ht {…}

Disable file .htaccess

Vì dùng nginx nên chúng ta khôn cần .htaccess, đây là chuỗi regular dùng để tự động vô hiệu hóa file .htaccess sinh ra trong quá trình cài wordpress.

Trên đây là những câu hình cần thiết nhất giúp bạn tự tạo cho mình trang web wordpress rồi. Mình cũng xin kết thúc Phần IV tại đây.

LEMP Server hiện đang hot với nhiều lợi thế hơn webserver chạy Apache (LAMP), tuy nhiên cấu hình hơi phức tạp một tí do cú phát khác với Apache theo mình bạn nên dùng thằng này gõ config vài lần là quen thôi.

Ai mà vẫn quyến luyến Apache thì đọc thêm trên site mình tài liệu hướng dẫn rất đầy đủ, hoặc tham khảo.

Nếu có khó khăn gì các bạn cứ đưa lên đây mình cùng trao đổi, hẹn gặp lại ở bài tiếp theo.

6 Comments

  1. Hai Au September 22, 2016 Reply
    • admin September 22, 2016 Reply
  2. haiduong April 14, 2016 Reply
    • admin April 14, 2016 Reply
      • haiduong April 14, 2016 Reply
        • admin April 14, 2016 Reply

Leave a Reply