Cách cài đặt Linux, Nginx, MySQL, PHP (LEMP stack) trên Ubuntu 18.04

Tác giả Network Engineer, T.Mười 21, 2021, 03:41:45 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách cài đặt Linux, Nginx, MySQL, PHP (LEMP stack) trên Ubuntu 18.04


LEMP Stack là một nhóm phần mềm có thể được sử dụng để phục vụ các trang web động và ứng dụng web. Đây là từ viết tắt mô tả hệ điều hành L inux, với máy chủ web Nginx (phát âm như "E ngine-X"). Dữ liệu phụ trợ được lưu trữ trong cơ sở dữ liệu M ySQL và xử lý động được xử lý bởi P HP.

Hướng dẫn này trình bày cách cài đặt LEMP Stack trên máy chủ Ubuntu 18.04. Hệ điều hành Ubuntu đảm nhận yêu cầu đầu tiên. Chúng ta sẽ mô tả cách khởi động và chạy các thành phần còn lại.

Trước khi hoàn thành hướng dẫn này, bạn phải có một tài khoản người dùng thông thường, không phải root trên máy chủ của mình với các quyền sudo.

Khi bạn có sẵn người dùng của mình, bạn đã sẵn sàng để bắt đầu các bước được nêu trong hướng dẫn này.

1. Cài đặt Máy chủ Web Nginx.

Để hiển thị các trang web cho khách truy cập trang web của bạn, bạn sẽ sử dụng Nginx, một máy chủ web 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ừ kho lưu trữ gói mặc định của Ubuntu. Điều này có nghĩa là bạn sẽ sử dụng bộ 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 bạn sử dụng APT cho phiên này, hãy bắt đầu bằng cách cập nhật chỉ mục gói của máy chủ của bạn:

Mã nguồn [Chọn]
# sudo apt update
Tiếp theo, cài đặt máy chủ:

Mã nguồn [Chọn]
# sudo apt install nginx
Trên Ubuntu 18.04, Nginx được cấu hình để khởi động chạy khi cài đặt.

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

Bạn nên bật cấu hình hạn chế nhất vẫn cho phép lưu lượng truy cập mà bạn muốn. Vì bạn chưa cấu hình SSL cho máy chủ của mình 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.

Kích hoạt tính năng này bằng cách nhập nội dung sau:

Mã nguồn [Chọn]
# sudo ufw allow 'Nginx HTTP'
Bạn có thể xác minh thay đổi bằng cách kiểm tra trạng thái:

Mã nguồn [Chọn]
# sudo ufw status
Đầu ra của lệnh này sẽ cho thấy rằng lưu lượng HTTP được phép:
       
Mã nguồn [Chọn]
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 quy tắc tường lửa mới được thêm vào, bạn có thể kiểm tra xem máy chủ có hoạt động hay không bằng cách truy cập vào tên miền hoặc địa chỉ IP công cộng của máy chủ trong trình duyệt web của bạn.

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

Mã nguồn [Chọn]
# 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ử từng loại trong trình duyệt web của mình.

Thay vào đó, bạn có thể kiểm tra địa chỉ IP nào có thể truy cập được, khi được xem từ các vị trí khác trên internet:

Mã nguồn [Chọn]
# curl -4 icanhazip.com
Nhập địa chỉ mà bạn nhận được vào trình duyệt web của mình và địa chỉ đó sẽ đưa bạn đến trang đích mặc định của Nginx:

Mã nguồn [Chọn]
http://server_domain_or_IP

Nếu bạn nhận được một trang web có nội dung "Welcome to nginx" thì bạn đã cài đặt thành công Nginx.

2. Cài đặt MySQL để quản lý dữ liệu trang web.

Bây giờ bạn đã có một máy chủ web, bạn cần cài đặt MySQL (một hệ quản trị cơ sở dữ liệu) để lưu trữ và quản lý dữ liệu cho trang web của bạn.

Cài đặt MySQL bằng cách gõ lệnh sau:

Mã nguồn [Chọn]
# sudo apt install mysql-server
Phần mềm cơ sở dữ liệu 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 bạn có muốn sửa đổi một số mặc định không an toàn hay không. Bắt đầu tập lệnh bằng cách nhập nội dung sau:

Mã nguồn [Chọn]
# sudo mysql_secure_installation
Tập lệnh này sẽ hỏi bạn có muốn cấu hình VALIDATE PASSWORD PLUGIN.

Cảnh báo: Bật tính năng này là một cuộc gọi phán xét. Nếu được bật, mật khẩu không phù hợp với tiêu chí đã chỉ định sẽ bị MySQL từ chối với lỗi. Điều này sẽ gây ra sự cố nếu bạn sử dụng mật khẩu yếu kết hợp với phần mềm tự động cấu hình thông tin đăng nhập người dùng MySQL, chẳng hạn như gói Ubuntu cho phpMyAdmin. Có thể an toàn để tắt tính năng xác thực, nhưng bạn phải luôn sử dụng mật khẩu mạnh, duy nhất cho thông tin đăng nhập cơ sở dữ liệu.

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

Mã nguồn [Chọn]
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 đã bật xác thực, tập lệnh cũng sẽ yêu cầu bạn chọn cấp độ xác thực mật khẩu. Hãy nhớ rằng nếu bạn nhập 2 - đối với cấp độ mạnh nhất - bạn sẽ gặp lỗi khi cố gắng đặt bất kỳ mật khẩu nào không chứa số, chữ hoa và chữ thường, và các ký tự đặc biệt hoặc dựa trên các từ thông dụng trong từ điển.

Mã nguồn [Chọ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 sẽ được yêu cầu gửi và xác nhận mật khẩu root:

Mã nguồn [Chọn]
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 phím ENTER ở mỗi lời nhắc. Thao tác này sẽ xóa một số người dùng ẩn danh và cơ sở dữ liệu thử nghiệm, vô hiệu hóa đăng nhập root từ xa và tải các quy tắc mới này để MySQL ngay lập tức tôn trọng những thay đổi mà chúng ta đã thực hiện.

Lưu ý rằng trong các hệ thống Ubuntu chạy MySQL 5.7 (và các phiên bản mới hơn), người dùng MySQL root được đặt xác thực bằng cách sử dụng auth_socket plugin theo mặc định chứ không phải bằng mật khẩu. Điều này cho phép một số bảo mật và khả năng sử dụng cao hơn 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 người dùng.

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

Mã nguồn [Chọn]
# sudo mysql
Tiếp theo, hãy kiểm tra phương thức xác thực mà mỗi tài khoản người dùng MySQL của bạn sử dụng bằng lệnh sau:
 
Mã nguồn [Chọn]
mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;        
       
Mã nguồn [Chọn]
+------------------+-------------------------------------------+-----------------------+-----------+
| 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)


Ví dụ này chứng minh rằng người dùng root trên thực tế xác thực bằng cách sử dụng auth_socket plugin. Để cấu hình tài khoản root để xác thực bằng mật khẩu, hãy chạy lệnh ALTER USER sau. Đảm bảo thay đổi mật khẩu mạnh mà bạn chọn:

Mã nguồn [Chọn]
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Sau đó, chạy FLUSH PRIVILEGES để yêu cầu máy chủ tải lại các bảng cấp quyền và đặt các thay đổi mới của bạn có hiệu lực:

Mã nguồn [Chọn]
mysql> FLUSH PRIVILEGES;
Kiểm tra lại các phương thức xác thực được sử dụng bởi từng người dùng của bạn để xác nhận rằng root không còn xác thực bằng auth_socket plugin nữa:

Mã nguồn [Chọn]
mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;        
Mã nguồn [Chọn]
+------------------+-------------------------------------------+-----------------------+-----------+
| 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)


Kết quả ví dụ này cho thấy rằng người dùng MySQL root hiện xác thực bằng mật khẩu. Khi bạn xác nhận điều này trên máy chủ của riêng mình, bạn có thể thoát MySQL shell:

Mã nguồn [Chọn]
mysql> exit
Lưu ý: Sau khi cấu hình người dùng MySQL root của bạn để xác thực bằng mật khẩu, bạn sẽ không thể truy cập MySQL bằng lệnh sudo mysql đã sử dụng trước đó nữa. Thay vào đó, bạn phải chạy như sau:

Mã nguồn [Chọn]
# mysql -u root -p
Sau khi nhập mật khẩu bạn đã đặt, bạn sẽ được đưa đến cửa sổ dấu nhắc dòng lệnh của MySQL.

Tại thời điểm này, hệ thống cơ sở dữ liệu của bạn đã được thiết lập xong và bạn có thể chuyển sang cài đặt PHP.

3. Cài đặt PHP và cấu hình Nginx để sử dụng bộ xử lý PHP.

Nginx hiện đã được cài đặt để phục vụ các trang của bạn và MySQL được cài đặt để lưu trữ và quản lý dữ liệu của bạn. Tuy nhiên, bạn vẫn không có bất kỳ thứ 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 xử lý native PHP như một số máy chủ web khác, bạn sẽ cần phải cài đặt php-fpm, viết tắt của "fastCGI process manager". Sau đó, bạn 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 đám mây của bạn, bạn có thể cần thêm kho lưu trữ 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 cách gõ lệnh sau:

Mã nguồn [Chọn]
# sudo add-apt-repository universe
Cài đặt mô-đun php-fpm cùng với một gói trợ giúp bổ sung, gói này php-mysql sẽ cho phép PHP giao tiếp với phần phụ trợ cơ sở dữ liệu của bạn. Quá trình cài đặt sẽ kéo các tập tin cố lõi PHP cần thiết vào. Thực hiện việc này bằng cách nhập như sau:

Mã nguồn [Chọn]
# sudo apt install php-fpm php-mysql
Ngay cả khi đã cài đặt tất cả các thành phần LEMP Stack bắt buộc, 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 bộ xử lý PHP cho nội dung động.

Điều này được thực hiện ở cấp độ khối máy chủ (các khối máy chủ tương tự như các virtual host của Apache). Để thực hiện việc này, hãy tạo tập tin cấu hình khối máy chủ mới bằng trình soạn thảo văn bản ưa thích của bạn trong thư mục /etc/nginx/sites-available/. Trong ví dụ này, chúng ta sẽ sử dụng nano và tập tin cấu hình khối máy chủ mới sẽ cho biết your_domain, vì vậy bạn có thể thay thế nó bằng thông tin của riêng mình:

Mã nguồn [Chọn]
# sudo nano /etc/nginx/sites-available/your_domain
Bằng cách tạo tập tin cấu hình khối máy chủ mới, thay vì chỉnh sửa tập tin mặc định, bạn sẽ có thể 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ừ tập tin cấu hình khối máy chủ mặc định, vào tập tin cấu hình khối máy chủ mới của bạn:

Mã nguồn [Chọn]
server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name your_domain;

        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;
        }
}


Đây là những gì mỗi lệnh và khối vị trí thực hiện:

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

Sau đó, hủy liên kết tập tin cấu hình mặc định khỏi thư mục /sites-enabled/:

Mã nguồn [Chọn]
# 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ể làm như vậy bằng cách tạo lại liên kết tượng trưng bằng lệnh như sau:

Mã nguồn [Chọn]
# sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
Kiểm tra tập tin cấu hình mới của bạn để tìm lỗi cú pháp:

Mã nguồn [Chọn]
# sudo nginx -t
Nếu có bất kỳ lỗi nào được báo cáo, hãy quay lại và kiểm tra lại tệp của bạn trước khi tiếp tục.

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

Mã nguồn [Chọn]
# sudo systemctl reload nginx
Điều này kết thúc quá trình cài đặt và cấu hình LEMP Stack của bạn. Tuy nhiên, cần thận trọng khi xác nhận rằng tất cả các thành phần có thể giao tiếp với nhau.

4. Tạo tập tin PHP để kiểm tra cấu hình.

LEMP Stack của bạn bây giờ sẽ được thiết lập hoàn toàn. Bạn có thể kiểm tra nó để xác nhận rằng Nginx có thể chuyển tập tin .php cho bộ xử lý PHP một cách chính xác.

Để thực hiện việc này, hãy sử dụng trình soạn thảo văn bản ưa thích của bạn để tạo một tập tin PHP thử nghiệm được gọi info.php trong thư mục gốc tài liệu của bạn:

Mã nguồn [Chọn]
# sudo nano /var/www/html/info.php
Nhập các dòng sau vào tập tin mới. Đây là mã PHP hợp lệ sẽ trả về thông tin về máy chủ của bạn:

Mã nguồn [Chọn]
<?php
phpinfo
();

Khi bạn hoàn tất, hãy lưu và đóng tập tin.

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

Mã nguồn [Chọn]
http://your_server_domain_or_IP/info.php
Trình duyệt của bạn sẽ tải một trang web giống như trang sau được tạo bởi PHP với thông tin về máy chủ của bạn:


Nếu trang của bạn như được mô tả, bạn đã thiết lập xử lý PHP với Nginx thành công.

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

Hiện tại, hãy xóa tập tin:

Mã nguồn [Chọn]
# sudo rm /var/www/html/info.php
Với điều đó, bạn có một LEMP Stack được cấu hình và hoạt động đầy đủ trên máy chủ Ubuntu 18.04 của mình.

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

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 rằng các kết nối đến máy chủ của bạn được bảo mật. Để đạt được điều này, bạn có thể bảo mật cài đặt Nginx của mình bằng Let's Encrypt. Bằng cách làm theo hướng dẫn này, bạn sẽ nhận được chứng chỉ TLS / SSL miễn phí cho máy chủ của mình, cho phép máy chủ phân phát nội dung qua HTTPS.