Cài đặt LEMP với PHP7.2 trên Centos 7

Hướng dẫn chi tiết cách cài đặt LEMP với Php7.2 trên hệ điều hành Centos 7, áp dụng cho các bạn có nhu cầu cài đặt VPS Centos 7 dùng chạy webserer với ngôn ngữ lập trình PHP và cơ sở dữ liệu Mysql/Mariadb. Tôi cũng thường làm theo các bước cài đặt này để setup được 1 vps chạy laravel Framewrork.

LEMP là gì?

LEMP là một bộ công cụ phổ biến để vận hành và chạy một hệ thống webserver (LINUX, NGINX, Mysql/Mariadb, PHP). Ở thời gian trước thì phổ biến có LAMP (Linux, Apache, Mysql, Php), hiện nay Nginx được sử dụng phổ biến hơn.

Chuẩn bị trước khi cài

  • Access quyền root vào hệ điều hành (hoặc quyền user cũng được)
  • Update hệ điều hành: yum update

Cài đặt Nginx

Mặc định trong Centos 7 khi cài đặt nginx chỉ cần chạy 1 vài lệnh cơ bản, Tuy nhiên đôi khi cũng có thể do bản phân phối nào đó được custom khác đi và có thể không được đúng như ý muốn của bạn. Vì vậy bước đầu tiên để cho chắc chắn bạn cần tạo file /etc/yum.repos.d/nginx.repo

nano /etc/yum.repos.d/nginx.repo

Dán nội dung sau vào file trên:

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

Cập nhật yum và cài đặt nginx

sudo yum update
sudo yum install nginx

Bật service nginx và đảm bảo sao cho nginx tự khởi động khi hệ điều hành khởi động lại

sudo systemctl start nginx
sudo systemctl enable nginx

Kiểm tra phiên bản nginx

sudo nginx -v

Lệnh kiểm tra tình trạng nginx

service nginx status

Cài đặt MariaDb

Mariadb tương tự mysql, sau khi mysql bị bán cho Oracle thì mariadb ra đời, và từ đó đến nay phát triển mạnh và được sử dụng rộng rãi

Cài đặt mariadb với lệnh sau:

sudo yum install mariadb-server

Khởi động service mariadb và đảm bảo service này sẽ tự khởi động khi reboot hệ điều hành

sudo systemctl start mariadb
sudo systemctl enable mariadb

hoặc đôi khi tên service không phải mariadb mà vẫn là mysql thì chạy lệnh như sau

sudo systemctl start mysql
sudo systemctl enable mysql

Sau khi cài đặt và khởi động mariadb, bạn cần setup password mysql. Để cài đặt mật khẩu root cho mariadb ta làm như sau: chạy mysql_secure_installation

sudo mysql_secure_installation

Nếu bạn được nhắc nhập mật khẩu root hiện tại thì hãy nhấn Enter (vì lúc này chưa có mật khẩu)

Enter current password for root (enter for none):

Tiếp theo đó hệ thống sẽ hỏi có cài đặt mật khẩu cho tài khoản root của mysql không (thì chọn Y(es))

Set root password? [Y/n]

Hệ thống sẽ yêu cầu nhập mật khẩu mới , hãy nhập và nhấn Enter theo các bước hướng dẫn khi cài (mật khẩu sẽ được nhập 2 lần, trong đó có 1 lần nhập lại để xác nhận)

Tiếp theo đó chọn cho các yêu cầu còn lại, gồm có:

  • Remove anonymous users?
  • Disallow root login remotely?
  • Remove test database and access to it?
  • Reload privilege tables now?

Đăng nhập mysql với tài khoản root và mật khẩu vừa tạo để kiểm tra lại

mysql -uroot -p

Tạo 1 database test với tên “codezi_demo_database” sau đó gán quyền truy cập cho tài khoản “codezi_demo_account ” như sau:

CREATE DATABASE codezi_demo_database;
CREATE USER 'codezi_demo_account' IDENTIFIED BY 'mật khẩu tự định nghĩa';
GRANT ALL PRIVILEGES ON codezi_demo_database.* TO 'codezi_demo_account';
quit

Cài đặt Php7.2 trên Centos7

Bình thường nếu hệ điều hành update và bản phân phối Linux của bạn có hỗ trợ Repo php7 sẵn thì bạn có thể cài đặt với lệnh cơ bản như sau:

sudo yum install php php-fpm php-mysql php-pdo

Tuy nhiên đôi khi bạn sẽ nhận được Php với phiên bản khác ngoài ý muốn, và để chắc chắn có thể cài đặt được Php 7.2 bạn cần làm những bước sau:

sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum --enablerepo=remi-php72 install php php-pdo php-pecl php-intl php-opcache php-xml php-pear php-xmlrpc php-mbstring php-json php-gd php-mcrypt phpize php-devel php-fpm php-mysql php-mbstring php-mcrypt

Bạn không nhất thiết phải cài đặt tất cả các gói trên, tùy theo yêu cầu và bài toán của bạn mà chọn các gói phù hợp, tuy nhiên nếu bạn cần cài Php chạy laravel thì cài các gói trên là OK.

Nếu cần cài composer cho php7.2 theo cách trên bạn làm như sau

yum --enablerepo=remi-php72 install composer

Sau khi cài đặt xong, hãy đảm bảo rằng service php-fpm được bật, và nó cũng cần được tự động bật khi hệ điều hành khởi động lại:

sudo systemctl start php-fpm
sudo systemctl enable php-fpm

Vậy là đã cơ bản xong các service để có thể chạy webserver với nginx, php và mariadb. Các việc tiếp theo có thể là tạo web config virtual host để trỏ domain với thư mục code tương ứng bạn muốn.

Cài đặt virtual host nginx trên Centos 7

Bạn có thể mở file /etc/nginx/nginx.conf để include 1 file config khác của bạn vào, hoặc có thể tạo 1 file config trong thư mục /etc/nginx/conf.d/

Ví dụ ở đây tôi có domain là codezi.pro và tôi cần trỏ đển thư mục code /home/codezi.pro và code tôi sử dụng là framework laravel tôi tạo file như sau:

nano /etc/nginx/conf.d/codezi.pro.conf

Nội dung file như sau:

server {
    listen 80;
    access_log off;
    error_log off;
    root /home/codezi.pro/public;
    index index.php index.html index.htm;
    server_name codezi.pro ;
    location / {
		try_files $uri $uri/ /index.php?$query_string;
	}
    location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_connect_timeout 60;
                fastcgi_send_timeout 180;
                fastcgi_read_timeout 180;
                fastcgi_buffer_size 256k;
                fastcgi_buffers 4 256k;
                fastcgi_busy_buffers_size 256k;
                fastcgi_temp_file_write_size 256k;
                fastcgi_intercept_errors on;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
}

Sau đó lưu lại và khởi động lại nginx

service nginx restart

Các file *.conf trong thư mục /etc/nginx/conf.d/ mặc định được nginx load sẵn khi khởi động, do đó tạo file trong thư mục đó là được load luôn.

Ngoài ra cách quản lý của tôi là đưa file config này vào 1 thư mục nào đó trong source code của bạn, và rồi include chúng trong file nginx.conf hoặc copy vào /etc/nginx/conf.d/ mỗi lần chuyển server.

Trong trường hợp bạn đặt file config trong thư mục nào đó (do bạn chọn) và rất có thể sẽ không start được service nginx, và nếu như nó là lỗi hãy thực hiện lệnh dưới đây để biết lỗi là gì

systemctl status nginx.service

Và nếu như lỗi bạn gặp có nội dung tương tự như sau

nginx: [emerg] open() "/duong-dan-file-config.conf" failed (13: Permission denied) in /etc/nginx/nginx.conf: LINE XX

Điều đó nghĩa là nginx của bạn không có quyền access file trên, trong trường hợp này cách đơn giản nhất là chạy lệnh dưới đây là xong

sudo setenforce Permissive

Sau đó restart lại nginx để thử lại.

Trong 1 ngữ cảnh khác nếu bạn không muốn dùng mysql mà dùng mongodb thì làm thêm vài lệnh như sau

yum install php-pear
pecl install mongodb

Sau đó chỉnh php.ini bật thêm mongo extension, có thể làm bằng cách tạo file : /etc/php.d/mongod.ini

nano /etc/php.d/mongod.ini 

sau đó copy nội dung extension=mongodb.so vào file đó và lưu lại

Build process completed successfully
Installing '/usr/lib64/php/modules/mongodb.so'
install ok: channel://pecl.php.net/mongodb-1.5.5
configuration option "php_ini" is not set to php.ini location
You should add "extension=mongodb.so" to php.ini

sau đó nhớ restart lại php

service php-fpm restart

Kết luận

Vậy là bạn đã có 1 VPS hoặc 1 máy tính với hệ điều hành Centos 7 và có đầy đủ các service để có thể chạy 1 website build bằng php có thể là laravel với hệ quản trị cơ sở dữ liệu mysql/mariadb

Ngoài ra bước tiếp theo có thể là cài đặt thêm SSL cho website có thể tham khảo thêm tại: Cài đặt Ssl Let’s Encrypt miễn phí cho website https trên Centos

Lưu ý vụ bật các service khi hệ điều hành khởi động lại

sudo systemctl enable php-fpm
sudo systemctl enable nginx
sudo systemctl enable mariadb
sudo systemctl enable mysql

Related posts:

  1. Cài đặt Ssl Let’s Encrypt miễn phí cho website https trên Centos
  2. Hướng dẫn cài đặt LAMP với PHP 7 trên CentOS 7
  3. Hướng dẫn sử dụng lệnh Create Database trong PostgreSQL