Thứ tư, 23/05/2018 | 00:00 GMT+7

Cài đặt LEMP - Linux Nginx MySQL PHP trên Ubuntu 18 04

Phần mềm LEMP là một group phần mềm được dùng để chạy các trang web động và ứng dụng web. Đây là viết tắt của hệ điều hành Linux, với web server Nginx (phát âm như “ Engine-X”). Dữ liệu lưu trữ trong database MySQL và xử lý bởi PHP.

Hướng dẫn này sẽ cài đặt LEMP trên server Ubuntu 18.04. Hệ điều hành Ubuntu đảm nhận yêu cầu đầu tiên. Ta sẽ mô tả cách chạy các thành phần còn lại.

Yêu cầu

Trước khi hoàn thành hướng dẫn này, bạn nên có một account user thường (regular-user), không phải root trên server với các quyền sudo . Thiết lập account này bằng cách hoàn thành hướng dẫn thiết lập server ban đầu cho Ubuntu 18.04 .

Khi có user, bạn đã sẵn sàng các bước tiếp theo.

Bước 1 - Cài đặt Server Web Nginx

Để hiển thị các trang web cho khách truy cập, ta sẽ sử dụng Nginx, một web server hiện đại, hiệu quả.

Tất cả phần mềm được sử dụng trong quy trình này sẽ đến từ repository mặc định của Ubuntu. Điều này nghĩa là ta có thể sử dụng trình quản lý gói apt để hoàn thành các cài đặt cần thiết.

Vì đây là lần đầu tiên ta sử dụng apt cho phiên này, hãy bắt đầu bằng cách cập nhật index gói của server. Sau đó, cài đặt nginx server:

  • sudo apt update
  • sudo apt install nginx

Trên Ubuntu 18.04, Nginx được cấu hình để bắt đầu chạy khi cài đặt.

Nếu bạn đang chạy firewall ufw , như trong hướng dẫn thiết lập ban đầu, bạn cần cho phép kết nối với Nginx. Nginx tự đăng ký với ufw khi cài đặt, vì vậy quy trình khá đơn giản.

Bạn nên bật cấu hình chặn tối đa mà vẫn cho phép lưu lượng truy cập bạn muốn. Vì bạn chưa cấu hình SSL cho server trong hướng dẫn này, bạn sẽ chỉ cần cho phép lưu lượng truy cập trên cổng 80 .

Bật tính năng này bằng lệnh:

  • sudo ufw allow 'Nginx HTTP'

Bạn có thể xác minh thay đổi bằng lệnh:

  • sudo ufw status

Kết quả của lệnh này sẽ cho thấy lưu lượng HTTP được phép:

Output
Status: active  To                         Action      From --                         ------      ---- OpenSSH                    ALLOW       Anywhere Nginx HTTP                 ALLOW       Anywhere OpenSSH (v6)               ALLOW       Anywhere (v6) Nginx HTTP (v6)            ALLOW       Anywhere (v6) 

Với luật firewall mới được thêm vào, bạn có thể kiểm tra xem server có hoạt động hay không bằng cách truy cập vào domain hoặc địa chỉ IP công cộng của server trong trình duyệt web.

Nếu bạn không có domain được trỏ đến server và bạn không biết địa chỉ IP công cộng của server, bạn có thể tìm domain đó bằng lệnh sau:

  • ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

Thao tác này sẽ in ra một vài địa chỉ IP. Bạn có thể thử lần lượt từng cái trong trình duyệt web.

Cách khác là dùng công cụ curl:

  • curl -4 icanhazip.com

Khi có IP, hãy nhập địa chỉ vào trình duyệt web , sẽ đưa bạn đến trang mặc định của Nginx:

http://server_domain_or_IP 

Trang mặc định của Nginx

Nếu nhìn thấy trang trên, bạn đã cài đặt thành công Nginx.

Bước 2 - Cài đặt MySQL để quản lý dữ liệu trang web

Đến đây bạn đã có một web server, bạn cần cài đặt MySQL (một hệ quản trị database) để lưu trữ và quản lý dữ liệu cho trang web.

Cài đặt MySQL bằng lệnh:

  • sudo apt install mysql-server

Phần mềm database MySQL hiện đã được cài đặt, nhưng cấu hình của nó vẫn chưa hoàn chỉnh.

Để bảo mật cài đặt, MySQL đi kèm với một tập lệnh sẽ hỏi liệu ta có muốn sửa đổi một số mặc định không an toàn hay không. Bắt đầu bằng lệnh:

  • sudo mysql_secure_installation

lệnh này sẽ hỏi bạn có muốn cấu hình VALIDATE PASSWORD PLUGIN .

Cảnh báo: Kích hoạt tính năng này là lựa chọn cần cân nhắc. Nếu được bật, password không phù hợp với tiêu chí đã chỉ định sẽ bị MySQL từ chối và báo lỗi. Điều này sẽ gây lỗi nếu bạn sử dụng password yếu kết hợp với phần mềm tự động cấu hình thông tin đăng nhập user MySQL, chẳng hạn như các gói Ubuntu cho phpMyAdmin. Có thể không áp dụng nó, nhưng bạn phải luôn sử dụng password mạnh, duy nhất cho thông tin đăng nhập database.

Trả lời Y có hoặc bất kỳ điều gì khác để tiếp tục mà không cần bật.

VALIDATE PASSWORD PLUGIN can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD plugin?  Press y|Y for Yes, any other key for No: 

Nếu bạn đã thiết lập xác thực, tập lệnh cũng sẽ yêu cầu bạn chọn mức xác thực password. Lưu ý nếu bạn nhập 2 - đối với cấp độ mạnh nhất - bạn sẽ gặp lỗi khi đặt password nào không chứa số, chữ hoa và chữ thường và ký tự đặc biệt hoặc dựa trên các từ thông dụng trong từ điển.

There are three levels of password validation policy:  LOW    Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file  Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1 

Tiếp theo, bạn cần gửi và xác nhận password root:

Please set the password for root here.  New password:  Re-enter new password: 

Đối với các câu hỏi còn lại, bạn nên nhấn Y và nhấn ENTER tại mỗi dấu nhắc. Thao tác này sẽ xóa một số user ẩn danh và database thử nghiệm, vô hiệu hóa đăng nhập root từ xa và tải các luật mới này để MySQL áp dụng ngay những thay đổi mà ta đã thực hiện.

Lưu ý trong các hệ thống Ubuntu chạy MySQL 5.7 (và các version mới hơn), user MySQL root được đặt để xác thực bằng cách sử dụng plugin auth_socket theo mặc định chứ không phải bằng password. Điều này cho phép một số bảo mật và hữu dụng trong nhiều trường hợp, nhưng nó cũng có thể làm phức tạp mọi thứ khi bạn cần cho phép một chương trình bên ngoài (ví dụ: phpMyAdmin) truy cập vào.

Nếu việc sử dụng plugin auth_socket để truy cập MySQL phù hợp với cách làm việc của bạn, bạn có thể chuyển sang Bước 3. Tuy nhiên, nếu bạn muốn sử dụng password khi kết nối với MySQL dưới dạng root , bạn cần chuyển phương thức xác thực từ auth_socket sang mysql_native_password . Để thực hiện việc này, hãy mở dấu nhắc MySQL từ terminal:

  • sudo mysql

Tiếp theo, hãy kiểm tra phương thức xác thực mà mỗi account user MySQL của bạn sử dụng bằng lệnh sau: 

  • SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+ | user             | authentication_string                     | plugin                | host      | +------------------+-------------------------------------------+-----------------------+-----------+ | root             |                                           | auth_socket           | localhost | | mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec) 

Trong ví dụ này, bạn có thể thấy rằng user root trên thực tế xác thực bằng cách sử dụng plugin auth_socket . Để cấu hình account root để xác thực bằng password, hãy chạy ALTER USER. Đảm bảo đổi thành một password mạnh :

  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Sau đó, chạy FLUSH PRIVILEGES để yêu cầu server tải lại các quyền và áp dụng các thay đổi:

  • FLUSH PRIVILEGES;

Kiểm tra lại các phương pháp xác thực được sử dụng bởi từng user để xác nhận root không còn xác thực bằng plugin auth_socket :

  • SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+ | user             | authentication_string                     | plugin                | host      | +------------------+-------------------------------------------+-----------------------+-----------+ | root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost | | mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec) 

Bạn có thể thấy trong kết quả ví dụ này user MySQL root hiện xác thực bằng password.
Đến đây bạn có thể thoát MySQL shell:

  • exit

Lưu ý : Sau khi cấu hình user MySQL root của bạn để xác thực bằng password, bạn sẽ không thể truy cập MySQL bằng sudo mysql sử dụng trước đó. Thay vào đó, bạn phải chạy như sau:

  • mysql -u root -p

Sau khi nhập password vừa đặt, bạn sẽ thấy dấu nhắc MySQL.

Đến đây, hệ thống database của bạn đã được thiết lập xong và bạn có thể chuyển sang cài đặt PHP.

Bước 3 - Cài đặt PHP và cấu hình Nginx để sử dụng PHP processor (bộ-xử-lý-PHP)

Đến đây bạn đã cài đặt Nginx để chạy các trang web và MySQL được cài đặt để lưu trữ và quản lý dữ liệu. Tuy nhiên, bạn vẫn chưa có gì có thể tạo ra nội dung động. Đây là lúc PHP phát huy tác dụng.

Vì Nginx không chứa PHP processor (bộ-xử-lý-PHP) như một số web server khác, bạn cần cài đặt php-fpm , viết tắt của “fastCGI process manager”. Ta sẽ yêu cầu Nginx chuyển các yêu cầu PHP đến phần mềm này để xử lý.  

Lưu ý : Tùy thuộc vào nhà cung cấp, bạn có thể cần thêm repository universe của Ubuntu, bao gồm phần mềm nguồn mở và miễn phí được duy trì bởi cộng đồng Ubuntu, trước khi cài đặt gói php-fpm . Bạn có thể thực hiện việc này bằng lệnh:

  • sudo add-apt-repository universe

 

Cài đặt module php-fpm cùng với một gói trợ giúp bổ sung, php-mysql , sẽ cho phép PHP giao tiếp với database của bạn. Quá trình cài đặt sẽ kéo các file core PHP cần thiết vào. Làm điều này bằng lệnh:

  • sudo apt install php-fpm php-mysql

Đến đây bạn đã cài đặt tất cả các thành phần LEMP cần thiết, nhưng bạn vẫn cần thực hiện một vài thay đổi cấu hình để yêu cầu Nginx sử dụng PHP processor (bộ-xử-lý-PHP) cho nội dung động.

Điều này được thực hiện ở cấp độ server block (các server block tương tự như các VirtualHost của Apache). Hãy mở file cấu hình server block mới trong folder /etc/nginx/sites-available/ . Trong ví dụ này, file cấu hình server block mới được đặt tên là example.com , bạn có thể đặt tên file bạn muốn:

  • sudo nano /etc/nginx/sites-available/example.com

Bằng cách chỉnh sửa file cấu hình server block mới, thay vì chỉnh sửa file mặc định, bạn có thể dễ dàng khôi phục cấu hình mặc định nếu cần.

Thêm nội dung sau, đã được lấy và sửa đổi một chút từ file cấu hình server block mặc định, vào file cấu hình server block mới:

/etc/nginx/sites-available/example.com
server {         listen 80;         root /var/www/html;         index index.php index.html index.htm index.nginx-debian.html;         server_name example.com;          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;         } } 

Giải thích các giá trị:

  • listen - Xác định cổngNginx sẽ lắng nghe. Trong trường hợp này, sẽ lắng nghe trên cổng 80 , cổng mặc định cho HTTP.
  • root - Xác định root document nơi lưu trữ các file do trang web cung cấp.
  • index - Cấu hình Nginx để ưu tiên chạy file index.php nếu có.
  • server_name - Xác định server block nào sẽ được sử dụng cho một truy cập đến server. Trỏ chỉ thị này tới domain hoặc địa chỉ IP công cộng của server.
  • location / - Khối vị trí đầu tiên bao gồm chỉ thị try_files , chỉ thị này kiểm tra sự tồn tại của các file phù hợp với yêu cầu URI. Nếu Nginx không thể tìm thấy file thích hợp, nó sẽ trả về lỗi 404.
  • location ~ \.php$ - Khối vị trí này xử lý quá trình PHP bằng cách trỏ Nginx tới file cấu hình fastcgi-php.conf và file php7.2-fpm.sock , file này khai báo socket nào được liên kết với php-fpm .
  • location ~ /\.ht - Khối vị trí cuối cùng xử lý các .htaccess. Bằng cách thêm chỉ thị deny all , file .htaccess sẽ không được hiển thị khi khách truy cập vào, nhằm bảo mật thông tin.

Sau khi thêm nội dung này, hãy lưu file. Kích hoạt server block mới của bạn bằng cách tạo một liên kết mềm (softlink) từ file cấu hình server block mới của bạn (trong folder /etc/nginx/sites-available/ ) đến folder /etc/nginx/sites-enabled/ :

  • sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Sau đó, hủy liên kết file cấu hình mặc định khỏi folder /sites-enabled/ :

  • sudo unlink /etc/nginx/sites-enabled/default

Lưu ý : Nếu bạn cần khôi phục cấu hình mặc định, bạn có thể thực hiện bằng cách tạo lại liên kết mềm (softlink), như sau:

  • sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

 

Kiểm tra file cấu hình mới của bạn để tìm lỗi cú pháp bằng lệnh:

  • sudo nginx -t

Nếu có lỗi, hãy quay lại và kiểm tra lại file trước khi tiếp tục.

Khi đã sẵn sàng, hãy tải lại Nginx để thực hiện các thay đổi cần thiết:

  • sudo systemctl reload nginx

Đến đây là kết thúc việc cài đặt và cấu hình LEMP của bạn. Tuy nhiên, cần thận trọng khi xác nhận tất cả các thành phần có thể giao tiếp với nhau.

Bước 4 - Tạo file PHP để kiểm tra cấu hình

LEMP của bạn bây giờ sẽ được thiết lập hoàn chỉnh. Bạn có thể kiểm tra nó để xác nhận Nginx có thể xử lý chính xác các file .php cho PHP processor (bộ-xử-lý-PHP).

Để thực hiện việc này, hãy sử dụng editor để tạo một file PHP thử nghiệm có tên là info.php trong folder root document của bạn:

  • sudo nano /var/www/html/info.php

Nhập các dòng sau vào file mới. Đây là mã PHP hợp lệ sẽ trả về thông tin về server:

/var/www/html/info.php
<?php phpinfo(); 

Khi bạn hoàn tất, hãy lưu file.

Bây giờ, bạn có thể truy cập trang này trong trình duyệt web bằng cách truy cập vào domain của server hoặc địa chỉ IP công cộng, theo sau là /info.php :

http://your_server_domain_or_IP/info.php 

Bạn sẽ thấy một trang web được tạo bởi PHP với thông tin về server:

Thông tin trang PHP

Nếu bạn thấy một trang giống như thế này, bạn đã thiết lập PHP processor (bộ-xử-lý-PHP) với Nginx thành công.

Sau khi xác minh Nginx hiển thị trang chính xác, tốt nhất là xóa file bạn đã tạo vì nó có thể cung cấp cho user lạ một số gợi ý về cấu hình của bạn, có thể giúp họ xâm nhập trái phép. Bạn luôn có thể tạo lại file này nếu cần.

Hiện tại, hãy xóa file bằng lệnh:

  • sudo rm /var/www/html/info.php

Như vậy, giờ bạn đã có một LEMP được cấu hình đầy đủ và hoạt động trên server Ubuntu 18.04.

Kết luận

LEMP là một nền tảng mạnh mẽ cho phép bạn thiết lập và chạy gần như bất kỳ trang web hoặc ứng dụng nào từ server.

Có một số bước tiếp theo bạn có thể thực hiện từ đây. Ví dụ: bạn nên đảm bảo các kết nối đến server được bảo mật. Để làm điều này, bạn có thể bảo mật cài đặt Nginx của bạn bằng Let's Encrypt . Theo hướng dẫn này, bạn sẽ nhận được certificate TLS / SSL miễn phí cho server, cho phép server phân phát nội dung qua HTTPS.



Các tin trước

Cài đặt và sử dụng PostgreSQL trên Ubuntu 18.04 2018-05-04

Cài đặt Linux Apache MySQL PHP (LAMP) trên Ubuntu 18 04 2018-04-27

Bảo mật cơ bản Ubuntu 18.04 2018-04-27

Cài đặt Apache Web Server trên Ubuntu 18.04 2018-04-27

Cài đặt xác thực đăng nhập SSH Keys, không cần password trên Ubuntu 18.04 2018-04-27

Cài đặt SSH Keys trên Ubuntu 16.04 2018-04-12

Cài đặt Node.js trên Ubuntu 16.04 2018-03-07

Cài đặt Anaconda Python trên Ubuntu 16 04 2017-12-27

Cài đặt MySQL trên CentOS 7 2016-12-01

Cài đặt MySQL trên Ubuntu 16.04 2016-11-23