Yêu Cầu Ban Đầu
Trước khi tiến hành theo hướng dẫn này, bạn cần có một tài khoản người dùng không phải root trên máy chủ với quyền sudo. Hãy thiết lập tài khoản này theo hướng dẫn cài đặt ban đầu của máy chủ cho Ubuntu 18.04.
Khi bạn đã có tài khoản người dùng, bạn đã sẵn sàng thực hiện các bước được liệt kê trong hướng dẫn dưới đây.
Bước 1 – Cài đặt máy chủ Web Nginx
Để hiển thị các trang web cho khách truy cập, bạn sẽ sử dụng Nginx, một máy chủ web hiện đại và hiệu quả.
Tất cả phần mềm được sử dụng trong quy trình này sẽ được lấy từ các 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ộ công cụ quản lý gói apt để thực hiện các cài đặt cần thiết.
Vì đây là lần đầu tiên bạn sử dụng apt trong phiên làm việc 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ủ:
sudo apt update
Tiếp theo, cài đặt máy chủ:
sudo apt install nginx
Trên Ubuntu 18.04, Nginx được cấu hình để tự động chạy ngay sau khi cài đặt.
Nếu bạn đang sử dụng tường lửa ufw như đã được mô tả trong hướng dẫn cài đặt ban đầu, bạn sẽ cần cho phép các kết nối đến Nginx. Nginx đã tự đăng ký với ufw ngay khi cài đặt, nên quy trình này khá đơn giản.
Bạn nên kích hoạt cấu hình tường lửa với mức hạn chế nhất mà vẫn cho phép lưu lượng truy cập cần thiết. Vì trong hướng dẫn này bạn chưa cấu hình SSL cho máy chủ, bạn chỉ cần cho phép lưu lượng truy cập qua cổng 80.
Kích hoạt bằng cách nhập lệnh sau:
sudo ufw allow 'Nginx HTTP'
Bạn có thể kiểm tra thay đổi bằng cách xem trạng thái:
sudo ufw status
Lệnh trên sẽ hiển thị kết quả cho biết lưu lượng HTTP đã được cho 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 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ó đang hoạt động hay không bằng cách truy cập tên miền hoặc địa chỉ IP công khai của máy chủ trong trình duyệt web.
Nếu bạn không có tên miền trỏ về máy chủ và không biết địa chỉ IP công khai của máy chủ, bạn có thể tìm bằng cách chạy lệnh sau:
ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
Lệnh này sẽ in ra một số địa chỉ IP. Bạn có thể thử từng địa chỉ trong trình duyệt của mình.
Ngoài ra, bạn cũng có thể kiểm tra địa chỉ IP có thể truy cập từ các vị trí khác trên internet bằng cách sử dụng:
curl -4 icanhazip.com
Nhập địa chỉ nhận được vào trình duyệt, và nó sẽ dẫn bạn đến trang mặc định của Nginx:
http://server_domain_or_IP

Nếu bạn nhận được trang web với nội dung “Welcome to nginx”, thì bạn đã cài đặt thành công Nginx.
Bước 2 – Cài đặt Mysql để quản lý dữ liệu Website
Giờ đây, khi đã có 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 website của bạn.
Cài đặt MySQL bằng cách nhập lệnh sau:
sudo apt install mysql-server
Phần mềm MySQL đã được cài đặt, nhưng cấu hình của nó vẫn chưa hoàn tất.
Để bảo mật cài đặt, MySQL đi kèm với một script hỏi bạn có muốn điều chỉnh một số thiết lập mặc định không an toàn hay không. Khởi chạy script bằng lệnh sau:
sudo mysql_secure_installation
Script này sẽ hỏi bạn có muốn cấu hình VALIDATE PASSWORD PLUGIN hay không.
Chú ý: Việc kích hoạt tính năng này tùy thuộc vào đánh giá của bạn. Nếu được bật, các mật khẩu không đáp ứng tiêu chí sẽ bị MySQL từ chối với thông báo lỗi. Điều này có thể gây rắc rối nếu bạn sử dụng mật khẩu yếu cùng với phần mềm tự động cấu hình thông tin đăng nhập MySQL, chẳng hạn như các gói Ubuntu cho phpMyAdmin. Bạn có thể giữ nguyên việc không bật xác thực, nhưng bạn luôn nên sử dụng mật khẩu mạnh và độc nhất cho các thông tin đăng nhập cơ sở dữ liệu.
Trả lời Y cho có, hoặc nhấn phím khác để bỏ qua và tiếp tục mà không kích hoạ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 đã bật tính năng xác thực, script cũng sẽ yêu cầu bạn chọn mức độ xác thực mật khẩu. Hãy nhớ rằng nếu bạn chọn mức 2 – mức mạnh nhất – bạn sẽ gặp lỗi khi đặt bất kỳ mật khẩu nào không chứa số, chữ viết hoa và viết thường, ký tự đặc biệt, hoặc dựa trên các từ trong từ điển phổ biế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 đặt và xác nhận mật khẩu root:
Please set the password for root here. New password: Re-enter new password:
Đối với các câu hỏi tiếp theo, hãy nhấn Y và nhấn ENTER. Điều này sẽ loại bỏ một số người dùng ẩn danh và cơ sở dữ liệu test, vô hiệu hóa đăng nhập root từ xa, và áp dụng ngay các thay đổi cấu hình cho MySQL.
Lưu ý rằng trên hệ thống Ubuntu chạy MySQL 5.7 (và các phiên bản sau), người dùng root của MySQL mặc định được cấu hình để xác thực bằng plugin auth_socket thay vì mật khẩu. Điều này giúp tăng cường bảo mật và tính tiện dụng, nhưng cũng có thể gây phức tạp 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 tài khoản người dùng.
Nếu bạn thấy việc sử dụng plugin auth_socket phù hợp với quy trình làm việc của mình, bạn có thể chuyển sang Bước 3. Tuy nhiên, nếu bạn muốn sử dụng mật khẩu khi kết nối MySQL với tư cách root, bạn cần chuyển phương thức xác thực từ auth_socket sang mysql_native_password. Để làm điều này, mở prompt MySQL từ terminal:
sudo mysql
Tiếp theo, kiểm tra phương thức xác thực của từng tài khoản MySQL với lệnh:
SELECT user,authentication_string,plugin,host FROM mysql.user;
Kết quả sẽ hiển thị như sau:
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)
Ví dụ trên cho thấy rằng tài khoản root đang sử dụng plugin auth_socket. Để cấu hình tài khoản root xác thực bằng mật khẩu, chạy lệnh ALTER USER sau (hãy thay ‘password’ bằng một mật khẩu mạnh mà bạn chọn):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Sau đó, chạy lệnh FLUSH PRIVILEGES để yêu cầu máy chủ nạp lại bảng quyền và áp dụng thay đổi:
FLUSH PRIVILEGES;
Kiểm tra lại phương thức xác thực của các tài khoản:
SELECT user,authentication_string,plugin,host FROM mysql.user;
Kết quả sẽ hiển thị rằng tài khoản root giờ đây đã xác thực bằng mật khẩu:
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)
Sau khi xác nhận, bạn có thể thoát khỏi shell MySQL:
exit
Lưu ý: Sau khi cấu hình tài khoản root của MySQL để 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 mysqlnhư trước nữa. Thay vào đó, bạn cần dùng:mysql -u root -pSau khi nhập mật khẩu đã đặt, bạn sẽ thấy prompt của MySQL.
Lúc này, hệ thống cơ sở dữ liệu đã đượ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 bộ xử lý PHP
Đến thời điểm này, bạn đã cài đặt Nginx để phục vụ các trang web và MySQL để lưu trữ, quản lý dữ liệu. Tuy nhiên, bạn vẫn chưa có thành phần nào xử lý nội dung động. Đây chính là lúc PHP phát huy vai trò.
Do Nginx không tích hợp sẵn xử lý PHP như một số máy chủ web khác, bạn sẽ cần cài đặt php-fpm, viết tắt của “fastCGI process manager”. Sau đó, bạn sẽ cấu hình Nginx để chuyển các yêu cầu PHP tới phần mềm này xử lý.
Chú ý: Tùy thuộc vào nhà cung cấp dịch vụ đám mây của bạn, có thể bạn cần thêm kho lưu trữ universe của Ubuntu, chứa phần mềm mã nguồn mở miễn phí do cộng đồng Ubuntu duy trì, trước khi cài đặt gói php-fpm. Bạn có thể làm điều này bằng cách nhập lệnh:
sudo add-apt-repository universe
Tiếp theo, cài đặt module php-fpm cùng với gói hỗ trợ php-mysql, cho phép PHP giao tiếp với backend cơ sở dữ liệu. Quá trình cài đặt sẽ kéo theo các tập tin lõi của PHP. Thực hiện lệnh sau:
sudo apt install php-fpm php-mysql
Dù đã cài đặt đầy đủ các thành phần của LEMP stack, bạn vẫn cần thực hiện một số thay đổi cấu hình để Nginx biết chuyển các tệp .php tới bộ xử lý PHP.
Điều này được thực hiện ở cấp độ “server block” (server block tương tự như virtual hosts của Apache). Để thực hiện, tạo một tệp cấu hình server block mới sử dụ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, tệp cấu hình sẽ được đặt tên là your_domain (hãy thay thế bằng tên miền của bạn):
sudo nano /etc/nginx/sites-available/your_domain
Bằng cách tạo tệp cấu hình server block mới thay vì chỉnh sửa tệp 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 nhẹ từ tệp cấu hình server block mặc định) vào tệp cấu hình mới:
/etc/nginx/sites-available/your_domain
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;
}
}
Giải thích các chỉ thị và khối location:
-
listen— Xác định cổng mà Nginx sẽ lắng nghe. Ở đây, nó lắng nghe ở cổng 80, cổng mặc định cho HTTP. -
root— Xác định thư mục gốc chứa các tập tin được phục vụ bởi website. -
index— Cấu hình Nginx ưu tiên phục vụ các tệp có tên index.php khi có yêu cầu truy cập index, nếu có. -
server_name— Xác định server block nào sẽ được sử dụng cho một yêu cầu đến máy chủ. Hãy chỉ định tên miền hoặc địa chỉ IP công khai của máy chủ. -
location /— Khối location đầu tiên bao gồm chỉ thịtry_files, kiểm tra sự tồn tại của các tệp khớp với yêu cầu URI. Nếu không tìm thấy, Nginx sẽ trả về lỗi 404. -
location ~ .php$— Khối location này xử lý việc chuyển tiếp các yêu cầu PHP bằng cách bao gồm tệp cấu hìnhfastcgi-php.confvà xác định socket tương ứng với php-fpm. -
location ~ /.ht— Khối location 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 có tệp .htaccess xuất hiện trong thư mục gốc, chúng sẽ không được phục vụ cho khách truy cập.
Sau khi thêm nội dung trên, lưu và đóng tệp. Nếu bạn dùng nano, nhấn CTRL + X sau đó nhấn Y và ENTER.
Kích hoạt server block mới bằng cách tạo một symbolic link từ tệp cấu hình mới (trong thư mục /etc/nginx/sites-available/) đến thư mục /etc/nginx/sites-enabled/:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
Sau đó, loại bỏ liên kết của tệp cấu hình mặc định khỏi thư mục /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, hãy tạo lại symbolic link bằng lệnh:
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
Kiểm tra tệp cấu hình mới có lỗi cú pháp không:
sudo nginx -t
Nếu có lỗi, hãy quay lại và kiểm tra lại tệp trước khi tiếp tục.
Khi sẵn sàng, tải lại Nginx để áp dụng các thay đổi:
sudo systemctl reload nginx
Khi đó, việc cài đặt và cấu hình LEMP stack của bạn đã hoàn tất. Tuy nhiên, bạn nên kiểm tra xem tất cả các thành phần có thể giao tiếp với nhau hay không.
Bước 4 – Tạo tệp PHP để kiểm tra cấu hình
LEMP stack của bạn giờ đây đã được cài đặt hoàn chỉnh. Bạn có thể kiểm tra để xác nhận rằng Nginx có thể chuyển các tệp .php chính xác tới bộ xử lý PHP.
Để làm điều này, sử dụng trình soạn thảo văn bản ưa thích để tạo tệp PHP kiểm tra tên là info.php trong thư mục gốc của website:
sudo nano /var/www/html/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:
/var/www/html/info.php <?php phpinfo();
Sau khi hoàn tất, lưu và đóng tệp.
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 tên miền hoặc địa chỉ IP công khai của máy chủ theo sau là /info.php:
http://your_server_domain_or_IP/info.php
Trình duyệt của bạn sẽ hiển thị một trang web được tạo bởi PHP chứa thông tin về máy chủ.

Nếu trang hiển thị như mô tả, bạn đã cài đặt thành công bộ xử lý PHP cho Nginx.
Sau khi xác nhận rằng Nginx đã hiển thị trang đúng, bạn nên xóa tệp kiểm tra này vì nó có thể cung cấp thông tin nhạy cảm cho người dùng không được phép. Bạn có thể tạo lại tệp này sau nếu cần.
Để xóa tệp, nhập lệnh:
sudo rm /var/www/html/info.php
Với đó, bạn đã có một LEMP stack được cấu hình đầy đủ và hoạt động trên máy chủ Ubuntu 18.04 của bạn.
Kết luận
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ụ hầu hết các website hoặc ứng dụng từ máy chủ của mình.
Từ đây, có rất nhiều bước tiếp theo bạn có thể thực hiện. Ví dụ, bạn nên đảm bảo rằng kết nối tới máy chủ của bạn được bảo mật. Để làm được điều này, bạn có thể bảo vệ cài đặt Nginx bằng Let’s Encrypt. 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ủ, cho phép nó phục vụ nội dung qua HTTPS.
Sau khi cài đặt Nginx và MySQL, bạn cần một VPS đáng tin cậy để chạy LEMP Stack mượt mà. Giá thuê VPS hiện nay rất cạnh tranh, phù hợp với mọi nhu cầu. Tìm hiểu các gói giá thuê VPS hấp dẫn trong DataOnline của chúng tôi để tối ưu chi phí cho dự án của bạn!
中文 (中国)
English
