Cài đặt và cấu hình LEMP Stack trên Centos 7

Trong hướng dẫn này, bạn cài đặt cấu hình LEMP Stack trên một máy chủ CentOS Hệ điều hành CentOS sẽ xử lý phần Linux. Bạn cài đặt phần còn lại bằng kho lưu trữ Software Collections và cấu hình chúng để phục vụ một trang web đơn giản.

Một ngăn xếp phần mềm LEMP là một nhóm phần mềm mã nguồn mở thường được cài đặt cùng nhau để cho phép máy chủ chứa các trang web động và ứng dụng web. Thuật ngữ này thực ra là một từ viết tắt đại diện cho hệ điều hành Linux, với máy chủ web ENginx (thay thế thành phần Apache trong ngăn xếp LAMP). Dữ liệu trang web được lưu trữ trong cơ sở dữ liệu MySQL (sử dụng MariaDB), và nội dung động được xử lý bởi PHP.

Các thành phần trong ngăn xếp LEMP đôi khi được cài đặt bằng cách sử dụng kho lưu trữ EPEL của CentOS Tuy nhiên, kho lưu trữ này chứa các gói phần mềm cũ. Ví dụ, bạn không thể cài đặt bất kỳ phiên bản nào của PHP cao hơn 5.4.16 từ EPEL, ngay cả khi phiên bản này đã không được hỗ trợ trong một thời gian dài. Để có được phiên bản phần mềm mới hơn, đề nghị sử dụng Software Collections, còn được gọi là SCLs. SCLs là các bộ tài nguyên phát triển do RedHat cung cấp, cho phép bạn sử dụng nhiều phiên bản phần mềm trên cùng một hệ thống mà không ảnh hưởng đến các gói đã được cài đặt trước đó.

Yêu cầu tiên quyết

Trước khi bắt đầu hướng dẫn này, bạn cài đặt một máy chủ CentOS 7, bao gồm một người dùng sudo không phải là người dùng root.

Bước 1 — Bật kho lưu trữ Software Collections

Để truy cập vào SCLs cho CentOS, cài đặt tệp phát hành CentOS Linux Software Collections bằng cách:

sudo yum install centos-release-scl

Xem danh sách các gói SCL có sẵn bằng lệnh sau:

yum --disablerepo='*' --enablerepo='centos-sclo-rh' --enablerepo='centos-sclo-sclo' list available

Để tránh xung đột trên toàn hệ thống, các gói SCL được cài đặt trong thư mục /opt/rh. Điều này cho phép bạn ví dụ, cài đặt Python 3.5 trên một máy CentOS 7 mà không cần gỡ bỏ hay ảnh hưởng đến Python 2.7.

Tất cả các tệp cấu hình cho các gói SCL được lưu trữ trong thư mục tương ứng bên trong thư mục /etc/opt/rh/. Các gói SCL cung cấp các tập lệnh shell định nghĩa các biến môi trường cần thiết để sử dụng các ứng dụng được bao gồm, chẳng hạn như PATH, LD_LIBRARY_PATHMANPATH. Các tập lệnh này được lưu trữ trong hệ thống với đường dẫn /opt/rh/package-name/enable.

Bây giờ bạn đã sẵn sàng bắt đầu cài đặt các gói phần mềm được đề cập trong hướng dẫn này.

Bước 2 — Cài đặt máy chủ web Nginx

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

Cài đặt Nginx bằng lệnh yum sau. Hãy đảm bảo thay giá trị được tô sáng bằng phiên bản Nginx bạn muốn cài đặt; phiên bản mới nhất sẽ có số cao nhất trong tên gói (112 vào thời điểm viết bài này):

sudo yum install rh-nginx112

Khi quá trình cài đặt hoàn tất, bắt đầu dịch vụ Nginx:

sudo systemctl start rh-nginx112-nginx

Xác nhận rằng Nginx đang chạy bằng cách nhập lệnh systemctl status:

sudo systemctl status rh-nginx112-nginx
Output
● rh-nginx112-nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/rh-nginx112-nginx.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2018-03-19 15:15:43 UTC; 1min 17s ago
Main PID: 10556 (nginx)
CGroup: /system.slice/rh-nginx112-nginx.service
├─10556 nginx: master process /opt/rh/rh-nginx112/root/usr/sbin/nginx
├─10557 nginx: worker process
└─10558 nginx: worker process

Mar 19 15:15:43 lemp-centos-222 systemd[1]: Starting The nginx HTTP and reverse proxy server...
Mar 19 15:15:43 lemp-centos-222 nginx-scl-helper[10541]: nginx: the configuration file /etc/opt/rh/rh-nginx... ok
Mar 19 15:15:43 lemp-centos-222 nginx-scl-helper[10541]: nginx: configuration file /etc/opt/rh/rh-nginx112/...ful
Mar 19 15:15:43 lemp-centos-222 systemd[1]: Started The nginx HTTP and reverse proxy server.
Hint: Some lines were ellipsized, use -l to show in full.

Lúc này, máy chủ của bạn có thể bị lỗ hổng cho việc truy cập trái phép từ người dùng chưa được ủy quyền. Để khắc phục điều này, thiết lập một tường lửa sử dụng firewalld. Bạn có thể cần cài đặt firewalld trước, có thể thực hiện bằng lệnh sau:

sudo yum install firewalld

Tiếp theo, bắt đầu dịch vụ firewalld:

sudo systemctl start firewalld

Tiếp theo, thêm một số quy tắc tường lửa để cho phép truy cập SSH vào máy chủ của bạn, và kết nối HTTP và HTTPS đến Nginx:

sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --zone=public --permanent --add-service=http
sudo firewall-cmd --zone=public --permanent --add-service=https

Tải lại firewalld để thực hiện các quy tắc tường lửa mới:

sudo firewall-cmd --reload

Sau khi thêm các quy tắc tường lửa mới này, bạn có thể kiểm tra xem máy chủ có đang hoạt động bằng cách truy cập vào tên miền của máy chủ hoặc địa chỉ IP công cộng trong trình duyệt web của bạn.

Nếu bạn không có tên miền được chỉ định cho máy chủ của bạn và bạn không biết địa chỉ IP công cộng của máy chủ của bạn, bạn có thể tìm nó bằng cách nhập lệnh sau vào cửa sổ terminal của bạn:

curl -4 icanhazip.com

Nhập địa chỉ IP kết quả vào thanh địa chỉ của trình duyệt web của bạn, và bạn nên thấy trang mặc định của Nginx:

http://server_domain_or_IP

Cài đặt và định cấu hình LEMP Stack bằng Softwware Collections trên CentOS 7

Nếu bạn nhìn thấy trang này, bạn đã thành công cài đặt Nginx. Trước khi tiếp tục, bật Nginx để khởi động cùng hệ thống bằng lệnh sau:

sudo systemctl enable rh-nginx112-nginx

Máy chủ Nginx đã được cài đặt, bạn tiếp tục cài đặt phần mềm cơ sở dữ liệu MariaDB.

Bước 3 — Cài đặt MariaDB để quản lý dữ liệu trang web

Chúng ta đã có một máy chủ web, bây giờ sẽ cài đặt MariaDB, một phiên bản thay thế cho MySQL, giúp lưu trữ và quản lý dữ liệu.

Cài đặt MariaDB bằng lệnh sau. Một lần nữa, thay giá trị được highlight bằng bất kỳ phiên bản nào bạn muốn cài đặt, với số cao nhất là phiên bản mới nhất hiện có (102, vào thời điểm viết bài này):

sudo yum install rh-mariadb102

Khi quá trình cài đặt hoàn tất, bắt đầu dịch vụ MariaDB bằng lệnh sau:

sudo systemctl start rh-mariadb102-mariadb

Với điều đó, MariaDB đã được cài đặt và chạy. Tuy nhiên, cấu hình của nó chưa hoàn tất.

Để bảo mật cài đặt, MariaDB được cài đặt với một kịch bản bảo mật yêu cầu bạn sửa đổi một số cài đặt mặc định không an toàn. Chạy kịch bản này bằng cách nhập:

source /opt/rh/rh-mariadb102/enable
mysql_secure_installation

Cửa sổ nhắc sẽ yêu cầu bạn nhập mật khẩu root hiện tại. Vì bạn vừa cài đặt MariaDB, có lẽ bạn chưa có mật khẩu, vì vậy hãy để trống bằng cách nhấn ENTER. Sau đó, cửa sổ nhắc sẽ hỏi bạn liệu bạn có muốn đặt mật khẩu root hay không. Hãy nhập Y và làm theo hướng dẫn:

. . .
Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorization.

Set root password? [Y/n] Y New password: password Re-enter new password: password Password updated successfully! Reloading privilege tables.. ... Success! . . .

Đối với các câu hỏi còn lại, nhấn phím ENTER để chấp nhận các giá trị mặc định. Điều này sẽ gỡ bỏ một số người dùng vô danh và cơ sở dữ liệu kiểm tra, vô hiệu hóa đăng nhập root từ xa và tải các quy tắc mới này để MariaDB ngay lập tức thực hiện các thay đổi chúng ta đã thực hiện.

Việc cuối cùng ở đây là cho phép MariaDB khởi động cùng hệ thống. Sử dụng lệnh sau để làm điều này:

sudo systemctl enable rh-mariadb102-mariadb

Lúc này, hệ thống cơ sở dữ liệu đã được thiết lập và bạn tiếp tục cài đặt PHP.

Bước 4 — Cài đặt và cấu hình PHP để xử lý

Bây giờ bạn đã cài đặt Nginx để phục vụ các trang và MariaDB để lưu trữ và quản lý dữ liệu. Tuy nhiên, bạn vẫn chưa cài đặt bất kỳ thành phần nào có thể tạo ra nội dung động. Đó là lúc PHP xuất hiện.

Vì Nginx không chứa xử lý PHP tích hợp 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 cho phần mềm này xử lý.

Cài đặt mô-đun này và cũng lấy một gói trợ giúp cho phép PHP giao tiếp với cơ sở dữ liệu backend của bạn. Quá trình cài đặt sẽ kéo theo các tệp lõi PHP cần thiết. Thực hiện điều này bằng cách nhập:

sudo yum install rh-php71-php-fpm rh-php71-php-mysqlnd

Các thành phần PHP của bạn đã được cài đặt, nhưng có một thay đổi cấu hình nhỏ bạn nên thực hiện để tăng cường bảo mật cho hệ thống.

Mở tệp cấu hình php.ini chính với quyền root:

sudo vi /etc/opt/rh/rh-php71/php.ini

Trong tệp này, tìm tham số thiết lập cgi.fix_pathinfo. Tham số này sẽ được ghi chú bằng dấu chấm phẩy (;) và được đặt thành "1" theo mặc định.

Đây là một cài đặt cực kỳ không an toàn vì nó cho biết cho PHP cố gắng thực thi tệp gần nhất nếu không tìm thấy tệp PHP được yêu cầu. Điều này cho phép người dùng tạo yêu cầu PHP một cách sao cho họ có thể thực thi các tập lệnh mà họ không được phép thực thi.

Thay đổi cả hai điều kiện này bằng cách gỡ bỏ ghi chú và đặt nó thành "0" như sau:

cgi.fix_pathinfo=0

Lưu và đóng tệp khi bạn hoàn thành (nhấn ESC, nhập :wq, sau đó nhấn Enter).

Tiếp theo, mở tệp cấu hình php-fpm www.conf:

sudo vi /etc/opt/rh/rh-php71/php-fpm.d/www.conf

Theo mặc định, tệp này được cấu hình để hoạt động với máy chủ Apache. Vì máy chủ của bạn đã cài đặt Nginx, tìm các dòng thiết lập usergroup và thay đổi giá trị của chúng từ "apache" thành "nginx":

user = nginx group = nginx

Sau đó, lưu và đóng tệp.

Tiếp theo, khởi động trình xử lý PHP:

sudo systemctl start rh-php71-php-fpm

Sau đó, bật php-fpm khởi động cùng hệ thống:

sudo systemctl enable rh-php71-php-fpm

Với điều đó, bạn đã thành công cài đặt PHP trên máy chủ của bạn. Tuy nhiên, nó vẫn cần được cấu hình để hoạt động với các phần mềm khác bạn đã cài đặt để cho phép máy chủ của bạn phục vụ nội dung trang web của bạn một cách chính xác.

Bước 5 — Cấu hình Nginx để sử dụng trình xử lý PHP

Ở thời điểm này, bạn đã cài đặt tất cả các thành phần cần thiết của ngăn xếp LEMP. Thay đổi cấu hình duy nhất bạn cần thực hiện là cho Nginx biết sử dụng trình xử lý PHP của bạn để xử lý nội dung động.

Thay đổi cấu hình này được thực hiện ở mức khối máy chủ (máy chủ khối tương tự với virtual hosts của Apache). Mở tệp cấu hình khối máy chủ Nginx mặc định bằng cách nhập:

sudo vi /etc/opt/rh/rh-nginx112/nginx/nginx.conf

Bỏ dấu chấm thăng (#) từ đầu mỗi dòng để bỏ ghi chú khối location ~ .php$ (đoạn mã trong tệp xử lý yêu cầu PHP, nằm trong khối máy chủ). Bạn cũng cần cập nhật tùy chọn fastcgi_param thành SCRIPT FILENAME $document_root$fastcgi_script_name. Điều này thông báo cho PHP vị trí của thư mục gốc tài liệu nơi nó có thể tìm thấy các tệp để xử lý.

Sau khi thực hiện các thay đổi cần thiết, khối máy chủ sẽ trông như sau:

...
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /opt/rh/rh-nginx112/root/usr/share/nginx/html;

# Load configuration files for the default server block.
include /etc/opt/rh/rh-nginx112/nginx/default.d/*.conf;

location / {
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
...

Khi bạn đã thực hiện các thay đổi, bạn có thể lưu tệp và thoát khỏi trình soạn thảo.

Tiếp theo, kiểm tra tệp cấu hình của bạn để xem có lỗi cú pháp không bằng cách chạy các lệnh sau:

source /opt/rh/rh-nginx112/enable
sudo nginx -t

Nếu có bất kỳ lỗi nào được báo cáo, hãy kiểm tra lại tệp của bạn trước khi tiếp tục.

Khi tệp cấu hình của bạn hợp lệ, tải lại Nginx để triển khai các thay đổi bạn đã thực hiện:

sudo systemctl reload rh-nginx112-nginx

Bây giờ Nginx, PHP và MariaDB đã được cài đặt và cấu hình, chỉ còn lại là xác nhận rằng cấu hình ngăn xếp LEMP có thể phục vụ nội dung cho khách truy cập của trang web của bạn một cách chính xác.

Bước 6 — Tạo một Tệp PHP để kiểm tra cấu hình

Ngăn xếp LEMP của bạn đã được cài đặt hoàn chỉnh và bạn có thể kiểm tra nó để xác minh rằng Nginx có thể chính xác chuyển các tệp .php cho trình xử lý PHP của bạn. Điều này được thực hiện bằng cách tạo một tệp PHP kiểm tra trong thư mục gốc của chúng ta.

Mở một tệp mới có tên info.php trong thư mục gốc:

sudo vi /opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php

Thêm 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 thành, lưu và đóng tệp. Sau đó, truy cập trang này trong trình duyệt web của bạn bằng cách truy cập tên miền của máy chủ hoặc địa chỉ IP công cộng của máy chủ của bạn, tiếp theo là /info.php:

http://server_domain_or_IP/info.php

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

Nếu bạn nhìn thấy một trang nhìn như vậy, bạn đã thành công cấu hình xử lý PHP với Nginx.

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

Xóa tệp bằng cách nhập:

sudo rm /opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php

Với điều đó, bạn đã xác minh rằng tất cả các thành phần của ngăn xếp LEMP được cài đặt và cấu hình chính xác trên máy chủ của bạn.

Kết luận

Như vậy bạn đã có một ngăn xếp LEMP đầy đủ trên máy chủ CentOS Điều này cung cấp một nền tảng linh hoạt để phục vụ nội dung web cho khách truy cập của bạn.

SCLs cũng được sử dụng để cài đặt các phiên bản khác nhau của phần mềm và chuyển đổi giữa chúng. Bạn xem danh sách tất cả các bộ sưu tập đã được cài đặt trên hệ thống bằng cách chạy:

scl --list

Mọi người cũng tìm kiếm: centos software collections, lemp stack