Ngăn xếp LEMP 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 được viết bằng PHP, bao gồm:
- Hệ điều hành Linux
- Máy chủ web Nginx (đọc là “engine-x” nên chữ E đại diện cho Nginx)
- Cơ sở dữ liệu MySQL
- Ngôn ngữ lập trình PHP
Nếu bạn từng nghe đâu đó về thuật ngữ LAMP thì khác biệt ở đây là chữ A (viết tắt của Apache, cũng là tên một loại máy chủ web).
Bạn hoàn toàn có thể cài đặt ngăn xếp LAMP thay vì LEMP.
Tuy nhiên, cá nhân tôi thích sử dụng máy chủ web Nginx vì nó được viết riêng để giải quyết các hạn chế về hiệu suất của máy chủ web Apache.
Bắt đầu nào!
Trước khi thực hiện các bước trong hướng dẫn này, bạn cần có một máy chủ web Ubuntu 22.04. Nếu bạn chưa có, bạn có thể đăng ký tài khoản Vultr và khởi tạo máy chủ mới.
Chuẩn bị công cụ
Để cài đặt một trang web WordPress trên Ubuntu, bạn cần đến một số công cụ khác nhau. Tuy nhiên, trong nội dung này bạn được hướng dẫn về cách cài đặt LEMP, vì vậy bạn chỉ cần Terminal để thực hiện gõ các câu lệnh.
Nếu bạn sử dụng Macbook giống tôi, bạn có sẵn ứng dụng Terminal trong tiện ích của máy tính.
Nếu bạn sử dụng máy tính hệ điều hành Windows, bạn có thể tải về phần mềm Bitvise SSH Client, nó cho phép bạn kiểm soát dữ liệu trên máy chủ, bao gồm quản lý các tệp và thực hiện lệnh.
Trong hướng dẫn này, tôi sử dụng Terminal của Macbook. Nếu bạn sử dụng terminal console trên Bitvise SSH Client, bạn thực hiện các thao tác tương tự.
Bây giờ, bạn sẽ truy cập vào Terminal:
Bước 1: Chọn Kết nối Từ xa Mới
Bước 2: Thêm IP máy chủ của bạn
Để lấy địa chỉ IP máy chủ của bạn, bạn truy cập vào bảng điều khiển dịch vụ VPS – trong trường hợp của tôi, đó là Vultr:
Bước 3: Truy cập vào Terminal
Để lấy mật khẩu người dùng root hệ thống, bạn truy cập vào bảng điều khiển dịch vụ VPS – trong trường hợp của tôi, đó là Vultr:
Khi kết quả trên màn hình của bạn hiện ra như sau, Terminal đã sẵn sàng để cài đặt LEMP:
Bước 1: Cài đặt Nginx
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 có thể sử dụng APT để hoàn thành các cài đặt cần thiết.
Đầu tiên, bạn gõ câu lệnh sau vào Terminal:
sudo apt update
Sau đó, chạy apt install
để cài đặt Nginx:
sudo apt install nginx
Khi kết quả hiển thị có dòng Do you want to continue? [Y/n]
, bạn gõ Y
và nhấn phím Enter để xác nhận rằng bạn muốn cài đặt Nginx. Sau khi quá trình cài đặt hoàn tất, máy chủ web Nginx sẽ hoạt động và chạy trên máy chủ Ubuntu của bạn.
Vì bạn chưa cấu hình SSL cho máy chủ của mình, bạn sẽ chỉ cần cho phép lưu lượng truy cập chạy trên cổng 80. Nếu bạn cấu hình SSL, bạn cần cho phép lưu lượng truy cập chạy trên cổng 443.
Kích hoạt tính năng này bằng cách nhập:
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:
sudo ufw status
Kết quả trả về như sau tức là lưu lượng HTTP hiện được cho phép:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
Bây giờ, bạn có thể kiểm tra xem máy chủ có đang 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 khai của máy chủ trong trình duyệt web của bạn.
Ví dụ trong trường hợp của tôi: http://66.42.58.201
Nếu bạn nhận được trang này, điều đó có nghĩa là bạn đã cài đặt thành công máy chủ web Nginx.
Nếu những dòng code dài trên terminal console khiến bạn bị bối rối, bạn có thể gõ lệnh clear
và nhấn phím Enter để xóa hết chúng.
Bước 2: Cài đặt MySQL
Bây giờ bạn đã thiết lập và chạy máy chủ web, bạn cần cài đặt hệ thống cơ sở dữ liệu để lưu trữ và quản lý dữ liệu cho trang web của mình.
MySQL là một hệ thống quản lý cơ sở dữ liệu phổ biến được sử dụng trong môi trường PHP.
Cài đặt MySQL bằng cách gõ lệnh:
sudo apt install mysql-server
Khi kết quả hiển thị có dòng Do you want to continue? [Y/n]
, bạn gõ Y
và nhấn phím Enter để xác nhận rằng bạn muốn cài đặt MySQL.
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 liệu 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:
sudo mysql_secure_installation
Bạn sẽ được hỏi rằng bạn có muốn cấu hình VALIDATE PASSWORD
? Đây là lúc bạn xem xét có nên thay đổi mật khẩu root mặc định hay không.
Bạn đừng nhầm lẫn root cơ sở dữ liệu với root hệ thống. Người dùng root này là người dùng quản trị có toàn quyền truy cập và đầy đủ các quyền đối với cơ sở dữ liệu. Nhờ đó, hacker có thể xâm hại vào máy chủ của bạn.
VALIDATE PASSWORD COMPONENT 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 component?
Press y|Y for Yes, any other key for No:
Bạn gõ Y
để đồng ý (khuyến nghị) hoặc bất cứ điều gì khác nếu không và nhấn phím Enter.
Khi bạn chọn Y
, tập lệnh sẽ yêu cầu bạn chọn mức độ mạnh của mật khẩu. Kết quả hiển thị:
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:
Trên thực tế, cá nhân tôi sau khi gõ Y
, kết quả không hiển thị phần thiết lập mật khẩu. Nếu bạn gặp trường hợp tương tự, bạn đừng bối rối bởi vì bạn vẫn có thể cài đặt mật khẩu người dùng root trong những bước tiếp theo.
- LOW (0): Là cấp độ thấp nhất. Mật khẩu tối thiểu 8 ký tự.
- MEDIUM (1): Là cấp độ trung bình. Mật khẩu tối thiểu 8 ký tự, bao gồm số, chữ in hoa, chữ thường và ký tự đặc biệt.
- STRONG (2): Là cấp độ mạnh nhất. Mật khẩu tối thiểu 8 ký tự, bao gồm số, chữ hoa, chữ thường, ký tự đặc biệt và dựa trên các từ thông dụng trong từ điển.
Tôi thường chọn 1
để giữ an toàn vì nếu chọn 2
thì việc đặt mật khẩu mới cũng sẽ trở nên khó khăn bởi độ khó của nó.
Tiếp theo, bạn gõ mật khẩu root mới của mình và nhấn phím Enter. Vì lý do bảo mật nên bạn sẽ không nhìn thấy các ký tự khi gõ.
Ví dụ: Hello735806@ (mật khẩu này đáp ứng tiêu chí của tùy chọn MEDIUM
).
Đối với câu hỏi còn lại, bạn nên gõ Y
và nhấn phím Enter. 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.
Khi bạn hoàn tất, hãy kiểm tra xem bạn có thể đăng nhập vào bảng điều khiển MySQL hay không:
Trong các hệ thống Ubuntu chạy MySQL 5.7 trở lên, người dùng MySQL root được 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 mật khẩu.
Nếu việc sử dụng plugin auth_socket
để 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 bước phần hướng dẫn cài đặt PHP.
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
.
Cá nhân tôi thường sử dụng mật khẩu khi kết nối với MySQL dưới dạng root.
Nếu ở những bước trước, bạn chưa thiết lập được mật khẩu root thì đây là lúc bạn có thể làm điều đó.
Để thực hiện việc này, trước tiên bạn gõ lệnh sau vào Terminal:
sudo mysql
Kết quả hiển thị:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5322
Server version: 8.0.34-0ubuntu0.22.04.1 (Ubuntu)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
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 cách gõ lệnh sau:
SELECT user,authentication_string,plugin,host FROM mysql.user;
Màn hình hiển thị:
mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+-------------------------------------------+-----------------------+-----------+
| 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 | *21FE6B48B889E5897627A973B7B779836AE95416 | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)
mysql>
Trong ví dụ này, bạn có thể thấy người dùng root trên thực tế xác thực bằng cách sử dụng plugin auth_socket
.
Để cấu hình tài khoản root được xác thực bằng mật khẩu, hãy chạy lệnh ALTER USER
sau:
Thay password
thành mật khẩu mà bạn đã đặt lại ở trên. Lần này khi bạn gõ mật khẩu, nó sẽ được hiển thị. Vì vậy, bạn cần chú ý an toàn nếu bạn đang thao tác ở nơi công cộng.
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Màn hình hiển thị (Hello735806@ là mật khẩu ví dụ mà tôi đã đặt):
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Hello735806@';
Query OK, 0 rows affected (0.00 sec)
mysql>
Sau đó, chạy lệnh FLUSH PRIVILEGES
để yêu cầu máy chủ tải lại các bảng và đưa các thay đổi mới của bạn có hiệu lực:
FLUSH PRIVILEGES;
Kết quả hiển thị:
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql>
Tiếp theo, bạn cần kiểm tra lại các phương thức xác thực được từng người dùng của bạn sử dụng để xác nhận rằng root không còn xác thực bằng plugin auth_socket
nữa. Gõ lệnh sau:
SELECT user,authentication_string,plugin,host FROM mysql.user;
Kết quả hiển thị:
mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | *EB686AB65D0655AB8D3ED3A28AF9C32F1D8CF8EB | mysql_native_password | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *50FE41EA3128F3ED04D1EF35CD0E8F782BBA19A9 | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)
mysql>
Bạn có thể thấy trong đầu ra, người dùng root hiện được xác thực bằng mật khẩu (mysql_native_password
).
Bằng cách gõ lệnh sau và nhấn phím Enter, bạn có thể thoát MySQL:
exit
Máy chủ MySQL của bạn hiện đã được cài đặt và bảo mật. Tiếp theo, bạn sẽ cài đặt PHP, thành phần cuối cùng trong ngăn xếp LEMP.
Bước 3: Cài đặt PHP
Sau khi bạn đã có máy chủ Nginx (để phục vụ trang web) và MySQL (để lưu trữ và quản lý dữ liệu), bạn sẽ cần một thứ gì đó có thể xử lý code và tạo nội dung động. Tôi đang đề cập đến PHP.
Vì Nginx không chứa native PHP processing 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).
Ngoài ra, bạn cũng sẽ cần thêm php-mysql
(một mô-đun PHP cho phép PHP giao tiếp với cơ sở dữ liệu dựa trên MySQL).
Để cài đặt php-fpm
và mô-đun php-mysql
, bạn gõ lệnh sau vào Terminal:
sudo apt install php8.1-fpm php-mysql
8.1 là phiên bản PHP hiện tại (tại thời điểm viết bài).
Khi kết quả hiển thị có dòng Do you want to continue? [Y/n]
, bạn gõ Y
và nhấn phím Enter để xác nhận rằng bạn muốn cài đặt PHP.
Như vậy, bạn đã cài đặt tất cả các thành phần của ngăn xếp LEMP bắt buộc.
Tuy nhiên, bạn vẫn cần thực hiện một vài thay đổi cấu hình Nginx để yêu cầu nó sử dụng bộ xử lý PHP cho nội dung động.
Bước 4: Cấu hình Nginx để sử dụng PHP
Nginx có một khối máy chủ được bật theo mặc định và được cấu hình để phục vụ các tài liệu bên ngoài một thư mục tại /var/www/html
.
Mặc dù điều này hoạt động tốt cho một trang web nhưng nó có thể trở nên khó quản lý nếu bạn lưu trữ nhiều trang web. Để tiện thao tác, tôi sẽ tạo cấu trúc thư mục bên trong /var/www
cho trang web your_domain
(tên miền tôi giả định là của bạn).
Để tạo thư mục web gốc cho your_domain
, bạn gõ lệnh sau vào Terminal:
sudo mkdir /var/www/your_domain
Tiếp theo, gán quyền sở hữu thư mục với $USER
biến môi trường, biến này sẽ tham chiếu đến người dùng hệ thống hiện tại của bạn:
sudo chown -R $USER:$USER /var/www/your_domain
Sau đó, mở tệp cấu hình mới trong sites-available
tại thư mục của Nginx:
sudo nano /etc/nginx/sites-available/your_domain
Điều này sẽ tạo ra một tập tin trống mới. Chèn cấu hình cơ bản sau:
server {
listen 80;
server_name your_domain www.your_domain;
root /var/www/your_domain;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Bạn muốn hiểu hơn về những gì bạn vừa thêm?
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ổng80
(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 cung cấp các tệp có tênindex.php
khi tệp chỉ mục được yêu cầu.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 đến tên miền của bạn.location /
— Khối vị trí đầu tiên bao gồm một chỉ thịtry_files
, kiểm tra sự tồn tại của các tệp phù hợp với yêu cầu URI. Nếu Nginx không thể tìm thấy tệp 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 cấu hìnhfastcgi-php.conf
và tệpphp8.1-fpm.sock
(tệp này khai báo socket nào được liên kết vớiphp-fpm
).location ~ /\.ht
— Khối vị trí cuối cùng xử lý các tệp.htaccess
mà Nginx không xử lý. Bằng cách thêm chỉ thịdeny all
, nếu bất kỳ tệp.htaccess
nào tình cờ tìm thấy đường vào gốc tài liệu, chúng sẽ không được cung cấp cho khách truy cập.
Khi bạn chỉnh sửa xong, bạn có thể lưu và đóng tệp bằng cách gõ tổ hợp phím CTRL+X
, sau đó gõ Y
và nhấn phím ENTER để xác nhận.
Tiếp theo, kích hoạt khối máy chủ mới của bạn bằng cách liên kết đến tệp đến thư mục /etc/nginx/sites-enabled/
của Nginx:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
Sau đó, hủy liên kết tệp cấu hình mặc định khỏi thư mục /sites-enabled/
:
sudo unlink /etc/nginx/sites-enabled/default
Kiểm tra tệp cấu hình mới của bạn để tìm lỗi cú pháp bằng cách nhập:
sudo nginx -t
hoặc:
nginx -t
Nếu có bất kỳ lỗi nào được hiển thị trong kết quả, hãy quay lại tệp cấu hình của bạn để kiểm tra nội dung trước khi tiếp tục.
Khi bạn đã sẵn sàng, hãy tải lại Nginx để áp dụng các thay đổi:
sudo systemctl reload nginx
hoặc:
service nginx restart
Điều này kết thúc quá trình cài đặt và cấu hình ngăn xếp LEMP của bạn.
Bước 5: Kiểm tra PHP với Nginx
Bạn cần kiểm tra ngăn xếp LEMP để xác thực rằng Nginx có thể chuyển tệp .php
cho bộ xử lý PHP một cách chính xác.
Để làm điều này, hãy tạo một tệp PHP thử nghiệm trong gốc tài liệu của bạn. Mở một tệp mới có tên info.php
trong gốc tài liệu của bạn bằng cách chạy lệnh sau:
nano /var/www/your_domain/info.php
Nhập các dòng sau vào tệp mới. Đây là mã PHP hợp lệ sẽ trả về thông tin về máy chủ của bạn:
<?php
phpinfo();
Khi bạn hoàn tất, bạn có thể lưu và đóng tệp bằng cách gõ tổ hợp phím CTRL+X
, sau đó gõ Y
và nhấn ENTER
để xác nhận.
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 địa chỉ IP của máy chủ, đằng sau thêm /info.php
.
Ví dụ trong trường hợp của tôi: http://66.42.58.201/info.php
Bạn sẽ thấy một trang web được tạo bởi PHP với thông tin về máy chủ của bạn:
Nếu bạn thấy một trang giống như thế này, 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 bạn nên xóa tệp bạn đã tạo vì nó chứa thông tin nhạy cảm về môi trường PHP và máy chủ Ubuntu của bạn. Bạn có thể tạo lại tệp này nếu cần nó sau này.
Bạn có thể sử dụng rm
để xóa tệp đó:
sudo rm /var/www/your_domain/info.php
Bây giờ bạn có một ngăn xếp LEMP được cấu hình đầy đủ và hoạt động trên máy chủ Ubuntu của mình.
Tạm kết
Mặc dù với người mới bắt đầu, việc cài đặt LEMP khá phức tạp về mặt kỹ thuật. Tuy nhiên với các bước trong hướng dẫn này, bạn có thể triển khai nó một cách dễ dàng.
Sử dụng một ngăn xếp linh hoạt như LEMP sẽ giúp cho trang web của bạn hoạt động một cách trơn tru và hiệu suất.
Bây giờ, bạn có thể cài đặt WordPress với LEMP trên Ubuntu và bảo mật trang web của mình bằng chứng chỉ SSL.