Hướng dẫn cài đặt và cấu hình LEMP Stack trên CentOS 7
Bạn không sử dụng CentOS 7?
Xem bài viết cho các distro khácGiới thiệu
LEMP Stack là một nhóm các phần mềm nguồn mở được cài đặt cùng nhau để xây dựng server để quản lý các website động và ứng dụng web. Thuật ngữ này là từ viết tắt từ chính 4 thành phần của nó:
- L - Hệ điều hành Linux.
- E - Nginx phát âm là "engine-ex", là một webserver nhanh, nhẹ, hiệu suất cao.
- M - MySQL hoặc MariaDB, hệ quản trị cơ sở dữ liệu quan hệ.
- P - Ngôn ngữ lập trình PHP.
Trong bài viết này, mình sẽ hướng dẫn các bạn cài đặt và cấu hình LEMP trên hệ điệu hành CentOS 7.
Yêu cầu thiết yếu
- Distro CentOS 7
- Sử dụng user có quyền sudo
- Có kiến thức cơ bản về PHP, MySQL
Bước 1: Cài đặt Nginx
Nginx không có sẵn trong kho lưu trữ CentOS mặc định nên trước tiên chúng ta cần thêm kho lưu trữ EPEL bằng cách chạy lệnh sau:
Tiếp theo, cài đặt Nginx bằng lệnh sau:
Sau khi đã cài đặt xong, khởi đông và enable Nginx bằng cách:
Kiểm tra trạng thái của Nginx:
Chú ý, mặc định Nginx hoạt động ở cổng 80, vì vậy nếu đang sử dụng firewalld hoặc iptables thì cần cấu hình mở cổng 80 như sau:
hoặc:
Kiểm tra xem Nginx đã bind trên cổng 80 hay chưa bằng lệnh:
Lưu ý, để sử dụng được lệnh netstat, cần cài đặt gói net-tools:
Chú ý, nếu Nginx không bind được vào cổng 80 thì cần thay đổi trạng thái của SELinux thành permissive hoặc disabled và restart Nginx:
Để chắc chắn Nginx đã cài đặt chính xác, trên trình duyệt web, hãy truy cập địa chỉ IP của server, kết quả nhận được sẽ là 1 trang HTML giống như này:
Hướng dẫn xem IP hiện tại của server: link
Nếu bạn sử dụng server chỉ có giao diện dòng lệnh (CLI) thì đừng lo, vẫn có cách kiểm tra bằng công cụ curl:
Kết quả trả về nội dung của trang web mặc định của Nginx:
Bước 2: Cài đặt MariaDB
Lưu ý: Kho lưu trữ mặc định của CentOS 7 sẽ cài đặt MariaDB ngay cả khi bạn gõ lệnh cài đặt MySQL. MariaDB là một nhánh dựa trên MySQL do cộng đồng phát triển khi Oracle mua lại MySQL. Hai cơ sở dữ liệu hoạt động gần như tương tự nhau.
MariaDB 5.5 được cung cấp đi kèm với kho lưu trữ măc định của CentOS. Tuy khá ổn định nhưng phiên bản này đã rất lỗi thời.
123HOST đã có bài viết hướng dẫn cài MariaDB mới nhất, bạn có thể xem tại đây
Trong bài viết này, mình sẽ hướng dẫn thêm 1 cách để cài đặt bất kỳ phiên bản MariaDB nào
Đầu tiên, hãy truy cập vào trang kho lưu trữ của MariaDB và tạo tệp repo cho phiên bản MariaDB mà bạn muốn. Với MariaDB 10.6 trên CentOS 7 thì cần chọn như sau:
Lưu ý: những phiên bản có tag RC hay alpha đều chưa ổn định, tốt nhất là bạn không nên chọn nó.
Bây giờ, copy và paste nội dung vừa sinh ra vào 1 tệp trong đường dẫn /etc/yum.repos.d :
Lưu và thoát file, sau đó tiến hành cài đặt MariaDB bằng lệnh:
Tiếp theo, khi quá trình cài đặt hoàn tất, hãy khởi động và enable MariaDB:
Kiểm tra trạng thái của MariaDB:
Cấu hình bảo mật cho MariaDB:
MariaDB sẽ yêu cầu cung cấp root password hiện tại (root password cho MariaDB chứ không phải root password của CentOS), nhưng chúng ta chỉ vừa mới cài đặt MariaDB. Vì vậy, chỉ cần nhấn enter:
Tiếp theo, Switch to unix_socket authentication: xác thực bằng unix_socket, chọn Y để bật, n để tắt.
Sau đó, prompt sẽ hỏi chúng ta có muốn đặt mật khẩu mới cho MariaDB root user hay không. Nhấn Enter, nhập mật khẩu mà bạn muốn và xác nhận lại mật khẩu đó:
Nhấn ENTER cho các câu hỏi còn lại để chấp nhận các giá trị mặc định. Thao tác này sẽ xóa một số người dùng và cơ sở dữ liệu mẫu, vô hiệu hóa đăng nhập root từ xa (chỉ được phép đăng nhập root từ localhost) và reload cấu hình.
Bây giờ, MariaDB Server, tiến hành đăng nhập bằng root user mà chúng ta vừa đặt mật khẩu:
Sử dụng cú pháp MySQL để tạo database:
tạo bảng:
thêm dữ liệu vào bảng vừa tạo:
tạo user newuser với mật khẩu là password:
Tại thời điểm này, newuser không có quyền làm bất cứ điều gì với cơ sở dữ liệu. Dó đó, ta sẽ cấp quyền truy cập trên database example_database cho newuser:
Reload privileges:
Thoát MariaDB:
MariaDB hiện đã được cài đặt và bảo mật. Tiếp theo, chúng ta sẽ cài đặt PHP, thành phần cuối cùng trong LEMP Stack.
Bước 3: Cài đặt PHP
PHP là thành phần để hiển thị nội dung động, nó xử lý các tập lệnh, kết nối với cơ sở dữ liệu MySQL để lấy thông tin và chuyển nội dung đã xử lý cho máy chủ web để hiển thị.
Không giống như Apache, Nginx cần một chương trình trung gian giữa nó và trình biên dịch PHP được gọi là PHP-FPM để xử lý các PHP request. Điều này giúp Nginx cải thiện hiệu suất đáng kể trên những trang PHP. Ngoài ra, chúng ta sẽ cần 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.
Kho lưu trữ mặc định của CentOS 7 đi kèm với phiên bản PHP 5.4 cũ và đã lỗi thời. Vì vậy, để có thể sử dụng các phiên bản PHP mới hơn, chúng ta cần cài đặt kho lưu trữ Remi theo lệnh sau:
Tiếp theo, hãy chọn phiên bản PHP cần cài đặt và kích hoạt gói Remi tương ứng với phiên bản đó. Trong bài viết này, chúng ta sẽ cài đặt PHP 8.0, kích hoạt nó bằng câu lệnh:
Lưu ý: số 80 tương ứng với PHP 8.0, bạn có thể thay thế bằng phiên bản PHP bạn muốn (Ví dụ: 72 – 73 –74 tương ứng 7.2 –7.3 – 7.4..)
Bây giờ, có thể sử dụng lệnh yum để cài đặt php 8.0, bao gồm cả các gói kèm theo (php-fpm, php-mysql):
Kiểm tra lại phiên bản PHP vừa cài đặt bằng lệnh:
Như vây, chúng ta đã cài đặt PHP 8.0 và các gói cần thiết kèm theo thành công.
Bước 4: Tạo user và phân quyền
Trong phần này, chúng ta sẽ đi sâu hơn vào vai trò của PHP-FPM:
- FPM là viết tắt của “FastCGI Process Manager”, mỗi khi có 1 request được gửi đến, nó sẽ được xử lý bởi 1 worker (process), PHP-FPM có nhiệm điều khiển công việc tải request đến worker, sinh và diệt các worker.
- Tập hợp các worker lại với nhau được gọi là 1 pool (nhóm). và với 1 Server PHP-FPM có thể có nhiều pool, trong mỗi pool sẽ lại có nhiều worker đang xử lý request.
Hình ảnh trên minh họa cách PHP-FPM điều phối request gửi đến, 1 worker chỉ có thể xử lý 1 request tại 1 thời điểm, trong pool này đang có 5 worker chờ để xử lý request, các request sẽ đợi đến khi có worker rảnh sẽ được PHP-FPM điều phối đi để xử lý
Lấy ví dụ thực tế với một dây chuyền sản xuất bánh kẹo. Ở đây PHP-FPM có trách nhiệm quản lý các worker (công nhân) đang đứng đợi các gói bánh (request) được chuyển tới bằng dây chuyền (Nginx). Sau khi đóng gói bánh vào thùng, công nhân (worker) đưa thùng bánh (response) trả lại dây chuyền (Nginx) để mang ra bán cho khách hàng. Mỗi công nhân chỉ xử lý 1 gói bánh 1 lúc thôi, khi xong thì mới xử lý đến gói bánh tiếp theo.
Vậy mục đích sinh ra pool để làm gì ? Việc tạo ra các pool riêng biệt trong thực tế là việc chạy nhiều website ở trên cùng 1 Server. Trong môi trường như này, khi các website đều chạy dưới quyền 1 user, nếu có lỗ hổng từ 1 website thì hacker có thể truy cập vào website để lấy cắp dữ liệu. Vì vậy ta nên chia ra mỗi website được xử lý bởi 1 pool riêng biệt, mỗi pool lại có owner User khác nhau làm tăng khả năng bảo mật. Ngoài ra, ở mỗi pool ta còn có thể cấu hình tối ưu cho riêng từng site để tăng hiệu suất.
Tìm hiểu lý thuyết đến đây là đủ rồi, chúng ta cùng bắt tay vào thực hành để tạo ra 2 website website1 và website2, cấu hình php-fpm cho chúng.
Đầu tiên, tạo user cho từng website, không cung cấp cho chúng quyền đăng nhập hoặc liên kết thông tin nào khác:
Thêm chúng vào group nginx để cho phép webserver tương tác với user và ngược lại
Tiếp theo, tạo thư mục lưu trữ cho từng web riêng biệt và gán quyền cho user tương ứng vừa tạo:
Cài đặt này sẽ làm user website1 không thể xem hay can thiệp được vào dữ liệu user website2 (không có quyền).
Tạo php-fpm pool mới cho từng site bằng cách copy file cấu hình mặc định:
Xóa bỏ pool mặc định:
Cấu hình pool website1:
Tìm và thay thế những dòng sau
thành:
Chỉnh sửa trên đã thực hiện 3 việc:
- Cấp quyền truy cập vào các thư mục như httpd cho user website1.
- Thay đổi php-fpm từ listen trên cổng 9000 qua TCP sang listen trực tiếp trên socket file /var/run/website1-fpm.sock.
- Thay đổi owner và group của tệp socket trên thành nginx.
Cấu hình tương tự như vậy với website2
Tiến hành khởi động và enable php-fpm:
Kiểm tra trạng thái:
Như vậy, môi trường PHP đã sẵn sàng. Trong bước tiếp theo, chúng ta sẽ cấu hình Nginx để nó gửi tất cả các PHP request đến cho PHP-FPM.
Bước 5: Cấu hình Nginx
Ngoài file cấu hình mặc định /etc/nginx/nginx.conf, Nginx còn cung cấp thư mục /etc/nginx/conf.d để lưu trữ các file cấu hình cho từng trang web riêng biệt (khá tương tự với virtual host của Apache).
Chúng ta sẽ tạo mới file cấu hình cho website1 và website2 của mình tại thư mục này:
Giải thích:
- listen - cổng mà site sẽ lắng nghe. website1 listen trên port 80 nên sẽ ghi đè lên cấu hình mặc định của nginx.
- server_name – Tên domain/sub của site
- root – đường dẫn mã nguồn
- fastcgi_pass – đường dẫn của file sock php-fpm
Kiểm tra cú pháp của tệp cấu hình vừa tạo:
Restart Nginx để áp dụng các thay đổi:
Bước 6: Kiểm tra hoạt động
Thêm test file trong thư mục gốc của mỗi trang web để kiểm tra cấu hình và xác minh user nào phục vụ từng trang web.
Lưu và thoát. Tiến hành làm tương tự với website2
Từ trình duyệt web, hãy truy cập địa chỉ có dạng:
http://server_host_or_IP:port/
Kiểm tra trang PHP information cho mỗi trang web. Tại phần PHP Variables, $ _SERVER ['USER'] phải là website1 cho website1 và website2 cho website2.
Tiếp theo, chúng ta sẽ tạo 1 file php có thực hiện kết nối đến MySQL để kiểm tra kết nối của PHP với MySQL:
Giải thích: Trong file test.php trên mình đã thực hiện kết nối đến MySQL bằng thông tin của user newuser, database example_database mà chúng ta đã tạo trong bước 2. Sau đó, thực hiện lấy và show dữ liệu có trong bảng example_table.
Từ trình duyệt web, hãy truy cập địa chỉ có dạng:
http://server_host_or_IP/test.php
Và ta da, chúng ta sẽ nhìn thấy 1 trang trông như thế này:
Tổng kết
Như vậy, trong bài viết 123HOST đã hướng dẫn các bạn cách cài đặt và cấu hình LEMP Stack trên Centos 7 hoàn tất một cách đầy nhất. Hy vọng bài viết này sẽ giúp bạn cài đặt thành công.!
Tính năng đang được phát triển