1. Tổng quan
LAMP là một hệ thống các phần mềm để tạo dựng môi trường máy chủ web có khả năng chứa và phân phối các trang web động được viết bằng PHP ( nó cũng tương tự như LEMP).
LAMP bao gồm:
Linux: là hệ điều hành, cũng là phần mềm dùng để điều phối và quản lí các tài nguyên của hệ thống.
Apache: là phần mềm máy chủ web, có thể thực hiện các request được gọi tới máy chủ thông qua giao thức HTTP
Mysql/Mariadb: là hệ quản trị cơ sở dữ liệu giúp lưu trữ và truy xuất dữ liệu. Cả 2 hệ quản trị cơ sở dữ liệu này đều khá tương đồng với nhau (có thể tìm hiểu thêm tại đây)
PHP: Là ngôn ngữ lập trình cho kịch bản hoạt động của máy chủ.

2. Tiến hành cài đặt

2.1. Cài đặt linux

Đối với việc cài đặt hệ điều hành, bạn có thể hiện trên nhiều bản phân phối khác nhau của linux như Debian, Redhat, Ubuntu… Trong bài này, mình sử dụng hệ điều hành CentOS 7.

Lưu ý: Nếu bạn đang ở ngay Server Linux thì không cần phải SSH vào để cài đặt, còn bạn ở nơi khác muốn kết nối vào cài đặt thì phải SSH vào nhá, trong bài viết này thì mình đang ở ngay trên Server, nên các bước truy cập SSH mình xin được bỏ qua không giới thiệu thêm.

2.2. Cài đặt Apache

Để cài đặt, trên cửa sổ terminal gõ lệnh:

sudo yum -y install httpd

Cài xong, tiến hành khởi động lại service:

systemctl start httpd
systemctl enable httpd

Bạn có thể check lại trang thái hoạt động của service bằng cách gõ:

systemctl status httpd

Bạn cũng có thể kiểm tra trạng thái trên trình duyệt bằng cách gõ trên thanh url địa chỉ sau:
<địa chỉ ip server>

Nếu bạn sử dụng hệ điều hành trên máy ảo, bạn có thể tắt firewall để có thể truy cập trên browser của máy thực:

systemctl stop firewalld

Sau đó, gõ địa chỉ ip máy ảo trên thanh url cũng sẽ cho ra kết quả tương tự.

2.3. Cài đặt hệ quản lí cơ sở dữ liệu

Trên thực tế với LAMP, bạn có thể sử dụng mysql hoặc mariadb đều được, bài này mình sẽ hướng dẫn với mariadb.
Trên cửa sổ terminal, tiến hành cài đặt mariadb:

sudo yum -y install mariadb mariadb-server

Tiến hành khởi động mariadb service:

systemctl start mariadb

Cài lại mật khẩu mật khẩu cho quyền root của cơ sở dữ liệu:

sudo mysql_secure_installation

Ở bước này ta sẽ thiết lập một số cấu hình như sau:
Enter currret password for root (enter for none):
Bước này yêu cầu bạn nhập mật khẩu gần đây cho root. Nếu bạn mới cài lần đầu thì nhấn Enter để bỏ qua.

Set root password? (Y/n)

Nếu bạn cài lần đầu, hệ thống sẽ hỏi bạn muốn cài password cho quyền root không. Bạn gõ Y -> Enter, sau đó nhập mật khẩu và xác thực mật khẩu.
Với những máy mới cài mariadb lần đầu, hệ thống yêu cầu thêm một số thiết lập như sau:
Xoá bỏ các user khác.
Không cho phép root đăng nhập từ xa.
Xoá bỏ databases test.
Khởi chạy lại bảng Privilege (bảng phân quyền).
Bạn chỉ cần gõ Y cho những yêu cầu đó.
Sau khi thiết lập xong, kích hoạt mariadb để khởi động cùng hệ thống:

systemctl enable mariadb

2.4. Cài đặt php

Phiên bản có sẵn trong repo của CentOS đang là 5.4. Phiên bản này khá cũ và sẽ khiến bạn gặp một số vấn đề xảy ra khi tiến hành cài đặt wordpress. Vì vậy bạn cần phải cài đặt phiên bản 7x để khắc phục. Bạn cần tiến hành thêm kho vào Remi CentOS:

rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm

Cài yum-utils vì chúng ta cần tiện ích yum-config-manager để cài đặt:

yum -y install yum-utils

Tiến hành cài đặt php. Ở đây ta cần lưu ý về phiên bản cài đặt như sau:
Bản 7.0:

yum-config-manager --enable remi-php70
yum -y install php php-opcache php-mysql

Bản 7.1:

yum-config-manager --enable remi-php71
yum -y install php php-opcache php-mysql

Bản 7.2:

yum-config-manager --enable remi-php72
yum -y install php php-opcache php-mysql

Bản 7.3:

yum-config-manager --enable remi-php73
yum -y install php php-opcache php-mysql

Trong bài này, mình cài phiên bản 7.2
Sau khi cài đặt xong, thực hiện restart lại apache:

systemctl restart httpd

Tiến hành kiểm tra kết quả. Ta thêm file sau:
echo “<?php phpinfo();?>” > /var/www/html/info.php
Sau đó restart lại apache:

systemctl restart httpd

Vào trình duyệt, gõ trên thanh url địa chỉ sau:
<địa chỉ ip>/info.php

2.5. Cài đặt Lest’s Encrypt

Đầu tiên chúng ta phải cài đặt github

yum -y install git

Cài github xong chúng ta sẽ clone mã nguồn của Let’s Encrypt về thư mục /opt/letsencrypt:
git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Cập nhật phiên bản mới nhất của Let’s Ecncrypt

cd /opt/letsencrypt && git pull

Tạm thời tắt webservice vì quá trình cài đặt sẽ cần cổng 80 và 443

service httpd stop

Bắt đầu cài đặt

cd /opt/letsencrypt
./letsencrypt-auto

Trong quá trình cài đặt, chúng ta sẽ được hỏi email trong trường hợp cần lấy lại SSL và đồng ý một số điều khoản và điều kiện. Về sau để cài đặt SSL cho các tên miền khác, bạn chỉ cần vào thư mục

/opt/letsencrypt

và chạy câu lệnh

./letsencrypt-auto

là các tên miền cần cài đặt sẽ được hiện ra
Khi cài đặt hoàn tất Let’s Encrypt sẽ liệt kê ra các tên miền có sẵn trên máy chủ
Chọn số ứng với tên miền cần cài đặt SSL và hệ thống sẽ tự động sinh ra các tập tin CRT và private key để cài đặt SSL theo đường dẫn cung cấp sẵn
Lưu ý chúng ta phải cài đặt mod SSL cho apache

yum install mod_ssl -y

Tạo một thư mục chứa SSL và sao chép các tập tin CRT và key này vào đường dẫn chứa các chứng thư ví dụ như tạo một thư mục ssl theo đường dẫn /etc/httpd

mkdir /etc/httpd/ssl

Sau đó sao chép chứng thư được cung cấp

cp /etc/letencrypt/live/domain/CRT.pem /etc/httpd/ssl/domain.pem
cp /etc/letencrypt/live/domain/privatekey.pem /etc/httpd/ssl/domain.key

Mở tập tin

ssl.conf

theo đường dẫn

/etc/httpd/conf.d/ssl.conf

và thêm khối sau vào cuối tập tin (lưu ý thay đổi các giá trị cho phù hợp với tên miền của bạn)

<VirtualHost *:443>
DocumentRoot “/var/www/html/domain.com/”
ServerName domain.com:443
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/domain.pem
SSLCertificateKeyFile /etc/httpd/ssl/domain.key
CustomLog logs/ssl_request_log
“%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x ”%r” %b”
</VirtualHost>

Đóng và save sau đó restart dịch vụ

httpd

rồi truy cập thử vào website với giao thức

https

Để gia hạn dịch vụ SSL các bạn đánh dòng sau:

/opt/letsencrypt/letsencrypt-auto renew –pre-hook “service httpd stop” –post-hook “service httpd start”