Hướng dẫn cài đặt LEMP (Linux + Enginx + MariaDB + PHP) trên Ubuntu 18.04

2020/10/14 06:23:25

LEMP là bộ tứ nổi tiếng thường được dùng để thiết lập chạy các website php trên VPS, trong đó nổi tiếng là CMS Wordpress. Dưới đây là hướng dẫn cài đặt và cấu hình các phần mềm của bộ tứ LEMP.

Cài đặt Nginx

Đầu tiên, ta update và cài nginx

$ sudo apt update
$ sudo apt install nginx
...
Do you want to continue? [Y/n] y
...

Cấu hình nginx tăng body_size để tránh lỗi 413 Request Entity Too Large.

$ sudo nano /etc/nginx/nginx.conf
...
http {
    ...
    client_max_body_size 100M;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    ...
}

Kích hoạt tự động nginx khi khởi động và chạy nginx bằng cách:

$ sudo systemctl enable nginx
$ sudo systemctl start nginx

Nếu bạn chạy bị lỗi

Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.

Thì bạn chạy câu lệnh, để xem lỗi gì và tiến hàng chỉnh sửa

$ systemctl status nginx.service

Giả sử lỗi gặp phải là:

nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
nginx[19365]: nginx: configuration file /etc/nginx/nginx.conf test failed

Thì bạn mở file /etc/nginx/sites-available/default, xóa dòng listen [::]:80 default_server;đi rồi lưu lại là được.

$ sudo nano /etc/nginx/sites-available/default

...
server {
        listen 80 default_server;
#       listen [::]:80 default_server;
...
[CTRL + O][Enter][CTRL + X]

Sau đó khởi động lại nginx

$ sudo systemctl restart nginx

Sau khi cài đặt xong, ta bật tường lửa ufw lên bằng câu lệnh.

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
...

Sau khi kích hoạt xong, khi kiểm tra trạng thái tường lửa, ta thu được:

$ sudo ufw status
Status: active

Nếu ufw không tự khởi động khi boot hệ điều hành, bạn có thể thử sử dụng câu lệnh sau:

$ sudo systemctl enable ufw

Sau khi kích hoạt ta tiến hành thiết lập rule để cho phép lưu lượng bên ngoài truy cập vào các dịch vụ phổ biến như ssh, http, https. Để thực hiện, ta gõ lệnh:

$ sudo ufw allow http
$ sudo ufw allow https
$ sudo ufw allow ssh

Kiểm tra trạng thái ta thu được:

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
80/tcp                     ALLOW       Anywhere                  
443/tcp                    ALLOW       Anywhere                  
22/tcp                     ALLOW       Anywhere

Truy cập vào địa chỉ IP của server trên trình duyệt, một trang web của nginx hiện ra là thành công.

Cài đặt MariaDB

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

$ sudo apt install mariadb-server
...
Do you want to continue? [Y/n] y
...

Sau khi cài đặt xong, ta kiểm tra xem MariaDB có chạy được không.

$ sudo systemctl status mariadb
● mariadb.service - MariaDB 10.1.44 database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
   Active: active (running) ...

Chạy lệnh để cấu hình.

$ sudo mysql_secure_installation

Khi chạy lệnh, nếu được hỏi Enter current password for root (enter for none): bạn chỉ việc nhấn ENTER để bỏ trống. Sau đó khi được hỏi Set root password? [Y/n] bạn nhập y để đồng ý đặt mật khẩu cho tài khoản root. Sau đó, nhập mật khẩu mới cho root là được.

New password: 
Re-enter new password:
...
Remove anonymous users? [Y/n]
...
Disallow root login remotely? [Y/n] y
...
Remove test database and access to it? [Y/n]
...
Reload privilege tables now? [Y/n]
...

Vậy là ta đã cấu hình xong MariaDB.

Để kiểm tra, ta thử đăng nhập vào cơ sở dữ liệu bằng lệnh:

$ sudo mariadb

Trên Ubuntu chạy MariaDB 10.1, người dùng root của MariaDB được chỉ định đăng nhập qua unix_socket thay vì dùng mật khẩu. Do đó, chỉ cần bạn gõ lệnh trên terminal hệ điều hành cài mariadb thì có thể đăng nhập được ngay, nhưng bên ngoài lại không đăng nhập được. Làm như vậy sẽ bảo mật và hữu ích hơn trong nhiều trường hợp. Tuy nhiên, một số phần mềm bên ngoài như phpMyAdmin cần có quyền quản trị để truy cập vào cơ sở dữ liệu. Do đó ta cần tạo người dùng mới có quyền administrator qua những bước sau.

$ sudo mariadb
[MariaDB]$ GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Trong đó, thay admin và password bằng tên người dùng và mật khẩu của bạn.

[MariaDB]$ FLUSH PRIVILEGES;
[MariaDB]$ exit

Để thử nghiệm tài khoản mới, ta dùng câu lệnh.

$ mysqladmin -u admin -p version

Cài đặt PHP

Ở đây chúng ta dùng php-fpm. Để cài đặt php cùng các gói cần thiết, ta gõ lệnh.

$ sudo apt-get install php-fpm php-mysql php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip php-gettext
...
Do you want to continue? [Y/n] y
...

Khởi động lại php-fpm bằng lệnh:

$ sudo systemctl restart php7.2-fpm.service

Tùy vào phiên bản php mà bạn cài mà bạn sẽ đổi 7.2 thành phiên bản phù hợp. Để biết được thông tin phiên bản hiện tại đang chạy, bạn có thể dùng lệnh:

$ sudo systemctl status php* | grep fpm.service

Sau đó, ta cấu hình file php.ini để bật cgi và tăng một số chỉ số cho php thực thi.

$ sudo nano /etc/php/7.2/fpm/php.ini
...
cgi.fix_pathinfo=1
...
upload_max_filesize = 100M
...
max_execution_time = 360
...
[CTRL + O][Enter][CTRL + X]

Cấu hình thư mục chứa mã nguồn

Thư mục /var/www sẽ chứa và chạy tất cả mã nguồn php. Tuy nhiên, lúc này user và group của thư mục này lúc cài đặt là root. Ta cần chỉnh lại thành www-data để mã nguồn có thể hoạt động bình thường.

$ cd /var/www
$ sudo chown -R www-data:www-data ./

Cấu hình web server Nginx chạy PHP

Một website

Để cấu hình trang web có sẵn, mặc định ta chỉnh sửa file /etc/nginx/sites-available/default.

Nhiều website

Ta tạo file mới tại /etc/nginx/conf.d/ với tên file là yourdomain.conf. Trong đó, yourdomain là tên miền mà của bạn.

Nội dung file cấu hình như sau.

server {
        listen 80 default_server;
        root /var/www/html; # thay bằng thư mục khác nếu cần

        index index.php index.html index.htm index.nginx-debian.html;

        server_name yourdomain; # tên miền của bạn hoặc dấu gạch dưới (_) đại diện cho tất cả

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

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

Để kiểm tra cú pháp Nginx ok chưa, ta dùng lệnh:

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Sau đó, reload lại nginx.

$ sudo systemctl reload nginx

Tạo file /var/www/html/info.php với nội dung sau để thử nghiệm.

 

Truy cập website http://yourdomain/php.info để xem kết quả.

Lưu ý: Trong wordpress ta sẽ cấu hình như sau:

server {
        listen 80;
        root /var/www/yourdomain;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name yourdomain;

        location / {
                proxy_set_header X-Real-IP  $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header Host $host;
                proxy_redirect off;
                index index.php;
                try_files $uri $uri/ /index.php?$args;
        }

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

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

Cài đặt phpMyAdmin

Chạy lệnh

$ sudo apt install phpmyadmin

Khi được hỏi Web server to reconfigure automatically: bạn chỉ việc TAB đến chỗ OK để bỏ qua.

Khi được hỏi Configure database for phpmyadmin with dbconfig-common? bạn chọn Yes.

Khi được hỏi MySQL application password for phpmyadmin:, bạn chỉ cần nhập mật khẩu bạn muốn khi đăng nhập vào phpMyAdmin là được, hoặc để trống thì phpMyAdmin sẽ tự tạo ngẫu nhiên cho bạn.

Sau khi cài xong, ta chuyển thư mục phpmyadmin về /var/www bằng cách tạo một symbolic link tới thư mục đó.

$ sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

Truy cập website http://yourdomain/phpmyadmin để xem kết quả.

Lưu ý: Nếu bạn gặp lỗi này trong quá trình import hoặc export dữ liệu:

Warning in ./libraries/plugin_interface.lib.php#551
 count(): Parameter must be an array or an object that implements Countable

Bạn có thể xử lý như sau:

$ sudo nano /usr/share/phpmyadmin/libraries/plugin_interface.lib.php

Tìm kiếm dòng if ($options != null && count($options) > 0) { và thay nó bằng if ($options != null) {. Sau đó, tải lại phpMyAdmin.

Lưu ý: Nếu gặp lỗi count(): Parameter must be an array or an object that implements Countable thì ta sửa:

$ sudo nano /usr/share/phpmyadmin/libraries/sql.lib.php

Tìm và sửa dòng || (count($analyzed_sql_results['select_expr'] == 1) thành || ((count($analyzed_sql_results['select_expr']) == 1) (thêm 1 dấu ngoặc mở trước count và 1 dấu ngoặc đóng sau dấu ])

Các lỗi thường gặp

Too many request trong wordpress.

Ta bổ sung vào đầu file wp-config.php

if ((isset($_ENV["HTTPS"]) && ("on" == $_ENV["HTTPS"]))
|| (isset($_SERVER["HTTP_X_FORWARDED_SSL"]) && (strpos($_SERVER["HTTP_X_FORWARDED_SSL"], "1") !== false))
|| (isset($_SERVER["HTTP_X_FORWARDED_SSL"]) && (strpos($_SERVER["HTTP_X_FORWARDED_SSL"], "on") !== false))
|| (isset($_SERVER["HTTP_CF_VISITOR"]) && (strpos($_SERVER["HTTP_CF_VISITOR"], "https") !== false))
|| (isset($_SERVER["HTTP_CLOUDFRONT_FORWARDED_PROTO"]) && (strpos($_SERVER["HTTP_CLOUDFRONT_FORWARDED_PROTO"], "https") !== false))
|| (isset($_SERVER["HTTP_X_FORWARDED_PROTO"]) && (strpos($_SERVER["HTTP_X_FORWARDED_PROTO"], "https") !== false))
|| (isset($_SERVER["HTTP_X_PROTO"]) && (strpos($_SERVER["HTTP_X_PROTO"], "SSL") !== false))
) {
$_SERVER["HTTPS"] = "on";
}

 

Quay lại trang chủ