Hướng dẫn cài đặt Linux, Nginx, MySQL, PHP (LEMP Stack) từ A tới Z- trên CentOS 8

Với lemp stack ta sẽ cài đặt các thành phần như sau: Nginx, MySQL, PHP, phpmyadmin.

Yêu cầu đối với VPS là ram >=512MB, hệ điều hành là CentOS 8 mới hoàn toàn.

Tắt Selinux

Sửa file sau: /etc/selinux/config

sudo nano /etc/selinux/config

Tìm dòng Cấu hình SELINUX thành disabled:

SELINUX=disabled

Cuối cùng reboot VPS để cập nhật selinux bằng lệnh:

reboot

Cài đặt nginx

ta cài đặt nginx với thư viện dnf

dnf install nginx

Khởi động Nginx service:

systemctl start nginx

Kiểm tra nginx đã hoạt động hay chưa :

systemctl status nginx

Kết quả:

nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since Sat 2019-11-02 01:22:01 UTC; 26s ago
  Process: 8867 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 8865 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 8864 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 8869 (nginx)
    Tasks: 2 (limit: 11543)
   Memory: 6.8M
   CGroup: /system.slice/nginx.service
           ├─8869 nginx: master process /usr/sbin/nginx
           └─8870 nginx: worker process

Nếu trạng thái là Active: active (running) tức là nginx đã được cài đặt và start đúng.

Thiết lập nginx chạy mỗi khi hệ thống khởi động:

systemctl enable nginx

Mở HTTP firewall port 80,443 nếu dùng firewalld:

firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --zone=public --permanent --add-service=https
firewall-cmd --reload

Giờ bạn có thể truy cập dạng http://IP kết quả truy cập được tức là cài đặt đã đúng.

11.02.2019-08.27.45

Để tối ưu cho nginx bạn  thêm đoạn sau vào file cấu hình /etc/nginx/nginx.conf ngay sát dấu ngoặc đóng cuối cùng.

server_tokens off;
server_names_hash_max_size 10000;
server_names_hash_bucket_size 1024;
keepalive_requests 100000;
gzip on;
gzip_min_length 1100;
gzip_disable "msie6";
gzip_buffers 4 32k;
gzip_vary on;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/javascript text/xml application/xml application/rss+xml application/atom+xml application/rdf+xml;
ignore_invalid_headers on;

client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;

reset_timedout_connection on;
connection_pool_size 256;

client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
client_max_body_size 100M;
client_body_buffer_size 128k;
request_pool_size 32k;
output_buffers 1 32k;
postpone_output 1460;

Hình ảnh:

11.02.2019-14.58.30

Sau đó bạn restart lại nginx.

Cài đặt mariadb 10.4

tạo file :
/etc/yum.repos.d/mariadb.repoVới nội dung như sau:

# MariaDB 10.4 CentOS repository list - created 2019-11-02 01:37 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]

name = MariaDB baseurl = http://yum.mariadb.org/10.4/centos8-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1

Sau khi tạo file xong ta cài đặt mariadb bằng các lệnh sau

sudo dnf install boost-program-options
sudo dnf install MariaDB-server MariaDB-client --disablerepo=AppStream 
sudo systemctl start mariadb
sudo systemctl enable mariadb

Như vậy mariadb đã cài đặt xong, giờ tiếp theo bạn thiết lập ban đầu cho mariadb bằng lệnh:

mysql_secure_installation

Phần thiết lập ban đầu bạn chỉ cần thay đổi root mysql, các tuỳ chọn khác không ảnh hưởng nhiều nên bạn có thể tuỳ chọn theo mong muốn.

11.02.2019-08.49.47

Cài đặt php-fpm

Cài đặt php

sudo dnf install php php-fpm php-common -y

Cài đặt thư viện php

sudo dnf install php*

Khởi động php-fpm

systemctl start php-fpm && systemctl enable php-fpm

Thiết lập vhost cho các website

để thêm một website lên VPS bạn làm lần lượt các bước sau.

Xoá pool mặc định:

mv /etc/php-fpm.d/ww.conf /etc/php-fpm.d/ww.conf.bak

Thêm pool php cho website.

Ví dụ như tôi cần thêm website nguyenvanphong.com

Tạo user nguyenvanphong chỉ có quyền hoạt động trên site nguyenvanphong.com

useradd -M nguyenvanphong

Tạo file :

nano /etc/php-fpm.d/nguyenvanphong.com.conf

Nội dung:

[nguyenvanphong.com]
listen = /run/php-fpm/nguyenvanphong.com.sock;
user = nguyenvanphong
group = nguyenvanphong
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
pm = dynamic
pm.max_children = 15
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 500

Bạn lưu ý: Bạn thay nguyenvanphong.com thành tên domain của bạn, user/group bạn để mỗi domain được quản lý bởi mỗi user riêng, điều này sẽ tiện cho việc debug lỗi, kiểm tra luồng tiến trình cũng như tránh vấn đề mã độc được chạy bởi các user khác nhau.

Cuối cùng restart lại php-fpm và kiểm tra .

systemctl restart php-fpm

systemctl status php-fpm

● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2019-11-02 02:46:04 UTC; 5s ago
Main PID: 13600 (php-fpm)
Status: "Ready to handle connections"
Tasks: 6 (limit: 11543)
Memory: 33.4M
CGroup: /system.slice/php-fpm.service
├─13600 php-fpm: master process (/etc/php-fpm.conf)
├─13602 php-fpm: pool nguyenvanphong.com
├─13603 php-fpm: pool nguyenvanphong.com
├─13604 php-fpm: pool nguyenvanphong.com
├─13605 php-fpm: pool nguyenvanphong.com
└─13606 php-fpm: pool nguyenvanphong.com

Kết quả php-fpm được tạo và chạy với pool như bạn cấu hình là đúng. Như ví dụ phía trên pool này tạo và lắng nghe trên sock: /run/php-fpm/nguyenvanphong.com.sock ; sock này bạn sẽ dùng để xử lý php từ nginx truyền xuống.

Thay đổi dung lượng upload file php.

Mặc định việc tải site trên php-fpm được cấu hình là 2MB, Bạn chạy lệnh sau để thay đổi, giả sử tôi muốn nâng lên max là 512 MB.

sed -i '/upload_max_filesize/s/= *2M/=512M/' /etc/php.ini
sed -i '/post_max_size/s/= *8M/=512M/' /etc/php.ini

Restart php-fpm để nhận cấu hình mới.

systemctl restart php-fpm

Thêm Vhost nginx

Mặc định khi cài đặt nginx sẽ cấu hình một vhost và upstream mặc định, tuy nhiên bạn cần nhu cầu mỗi website hoạt động với các thư mục khác nhau vì vậy bạn cần bỏ vhost mặc định và cấu hình vhost cho từng domain.

Xoá Vhost và upstream mặc định.

Xoá vhost mặc định bằng cách sửa file .

/etc/nginx/nginx.conf

bạn chèn # phía trước các dòng lệnh cấu hình vhost mặc định.

11.02.2019-10.09.36

xoá upstream  và location xử lý php mặc định bằng lệnh:

mv /etc/nginx/default.d/php.conf /etc/nginx/default.d/php.conf.bak

mv /etc/nginx/conf.d/php-fpm.conf /etc/nginx/conf.d/php-fpm.conf.bak

Khai báo và thêm vhost domain mới trên nginx.

Vhost này tôi sẽ thêm cả upstream lẫn location xử lý php bên trong.

nano /etc/nginx/conf.d/nguyenvanphong.com.conf

Với nội dung (ở đây bạn sử dụng sock đã tạo ở phần thêm pool phía trên):

server {
listen 80;
server_name  nguyenvanphong.com www.nguyenvanphong.com;
root /home/nguyenvanphong/nguyenvanphong.com/public_html;

# Load configuration files for the default server block.
# pass the PHP scripts to FastCGI server
#
# See conf.d/php-fpm.conf for socket configuration
#
        index index.php index.html index.htm;

        location ~ \.(php|phar)(/.*)?$ {
        fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;

        fastcgi_intercept_errors on;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_pass unix:/run/php-fpm/nguyenvanphong.com.sock;
        }


	location / {
        }

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

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

Tạo thư mục chứa website như đã cấu hình trên vhost.

mkdir -p /home/nguyenvanphong/nguyenvanphong.com/public_html

restart lại nginx, ở đây site nguyenvanphong.com sẽ được control bởi user nguyenvanphong và thư mục chứa website là: /home/nguyenvanphong/nguyenvanphong.com/public_html.

systemctl restart nginx

Kiểm tra

Sau khi cấu hình hoàn tất và trỏ domain về IP VPS, như trên tôi sử dụng domain nguyenvanphong.com để cấu hình.

Bạn tạo file info.php

nano /home/nguyenvanphong/nguyenvanphong.com/public_html/info.php

với nội dung sau để kiểm tra :

<?php
echo $_SERVER['SERVER_NAME'];

phpinfo();

?>

Nếu bạn truy cập link website hiển thị nội dung info php tức là bạn đã cấu hình đúng.

11.02.2019-11.44.07

Nếu bạn muốn thêm một website khác, bạn tạo vhost mới bao gồm tạo pool mới và cũng như vhost nginx cho domain mới như phía trên là được.

Cài đặt SSL:

Sau khi tạo vhost thêm website và trỏ IP hoàn tất bạn có thể cài đặt ssl như sau.

Cài đặt tool cấu hình ssl tự động.

Chạy lệnh sau để cài đặt:

curl https://get.acme.sh | sh
alias acme.sh=~/.acme.sh/acme.sh
acme.sh --upgrade --auto-upgrade

Cài đặt ssl cho domain nguyenvanphong.com

acme.sh --issue -w /home/nguyenvanphong/nguyenvanphong.com/public_html -d nguyenvanphong.com -d www.nguyenvanphong.com  -k 4096

Bạn sử dụng lệnh trên thay đổi phù hợp với website của bạn.

  • /home/nguyenvanphong/nguyenvanphong.com/public_html : là đường dẫn thư mục root chứa mã nguồn site nguyenvanphong.com
  • Bạn có thể bỏ bớt đi phần www nếu không muốn cài ssl cho tiền tố www nếu như vậy lệnh sẽ là:
acme.sh --issue -w /home/nguyenvanphong/nguyenvanphong.com/public_html -d nguyenvanphong.com -k 4096

Kết quả sẽ cho ra các file cấu hình ssl có dạng như:

[Sat Nov 2 06:59:46 UTC 2019] Your cert is in /root/.acme.sh/nguyenvanphong.com/nguyenvanphong.com.cer 
[Sat Nov 2 06:59:46 UTC 2019] Your cert key is in /root/.acme.sh/nguyenvanphong.com/nguyenvanphong.com.key 
[Sat Nov 2 06:59:46 UTC 2019] The intermediate CA cert is in /root/.acme.sh/nguyenvanphong.com/ca.cer 
[Sat Nov 2 06:59:46 UTC 2019] And the full chain certs is there: /root/.acme.sh/nguyenvanphong.com/fullchain.cer

Bạn mở file cấu hình vhost nginx của domain và redirect về https, như ví dụ file cần chỉnh sửa là:

/etc/nginx/conf.d/nguyenvanphong.com.conf

Bạn sửa toàn file thành:

server {
listen 80;
return 301 https://nguyenvanphong.com$request_uri;
}

Tiếp theo thêm file vhost của domain cấu hình https với port 443.

File tạo mới: /etc/nginx/conf.d/nguyenvanphong.com.ssl.conf

nano /etc/nginx/conf.d/nguyenvanphong.com.ssl.conf

Nội dung:

 server {
	listen       443 ssl http2;
        server_name  nguyenvanphong.com www.nguyenvanphong.com;
        server_name  nguyenvanphong.com www.nguyenvanphong.com;
        root /home/nguyenvanphong/nguyenvanphong.com/public_html;
        index index.php index.html index.htm;

        ssl_certificate "/root/.acme.sh/nguyenvanphong.com/fullchain.cer";
        ssl_certificate_key "/root/.acme.sh/nguyenvanphong.com/nguyenvanphong.com.key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers PROFILE=SYSTEM;
        ssl_prefer_server_ciphers on;

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

        location ~ \.(php|phar)(/.*)?$ {
        fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;

        fastcgi_intercept_errors on;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_pass unix:/run/php-fpm/nguyenvanphong.com.sock;
        }
	location / {
        }

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

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

Trong  đó bạn thay thế nội dung ssl_certificate, ssl_certificate_key phù hợp kết quả cài đặt ssl cho domain khi nãy bạn mới cài đặt. Đồng thời bạn cũng thay đổi tên domain nguyenvanphong.com thành tên domain của bạn.

Cuối cùng restart lại nginx và truy cập thử link domain với https.

systemctl restart nginx
11.02.2019-14.23.27

Cài đặt WordPress

Tôi sẽ cài mẫu wordpress mới nhất lên domain nguyenvanphong.com mới thiết lập.

Đầu tiên tôi tải và giải nén mã nguồn wordpress cài đặt theo bằng lệnh sau.

cd /home/nguyenvanphong/nguyenvanphong.com/public_html

wget https://wordpress.org/latest.zip  
unzip latest.zip 
mv wordpress/* .

rm -rf latest.zip
chown -R nguyenvanphong:nguyenvanphong *

Trong đó /home/nguyenvanphong/nguyenvanphong.com/public_html là thư mục chứa mã nguồn domain.

về lệnh chown, bạn cũng tương tự phân quyền lại cho đúng user ban đầu bạn cấu hình cho domain.

Tiếp theo tôi tạo 1 database. để đơn giản tôi sử dụng command mysql. để truy cập sử dụng command mysql bạn gõ lệnh sau.

mysql -u root -p

Sau đó bạn nhập mật khẩu root mysql ban đầu bạn đã thiết lập cho mariadb.

Cuối cùng bạn tạo database mới với cú pháp như sau:

CREATE DATABASE wordpress;
CREATE USER wordpress_user@localhost;
SET PASSWORD FOR wordpress_user@localhost= PASSWORD("123456");
GRANT ALL PRIVILEGES ON wordpress. * TO wordpress_user@localhost IDENTIFIED BY "123456";
FLUSH PRIVILEGES;
exit;

trong đó:

wordpress: là tên database muốn tạo.
wordpress_user: là tên user quản lý database muốn tạo.
123456: là mật khẩu của database.

Bạn thay thế các giá trị trên cho phù hợp với mong muốn của mình.

Cuối cùng tôi truy cập website và cài đặt wordpress mới như bình thường với database vừa tạo.

11.02.2019-14.42.11

Chạy cài thử với theme flastsome mặc định demo.

11.02.2019-15.21.07

Cài đặt Phpmyadmin.

Bài viết đến đây cũng khá đầy đủ toàn vẹn cho các bạn quản lý một website rồi.

Tuy nhiên có một số bạn không  dùng được dòng lệnh mysql để tạo database hoặc đơn giản là đéo thích.

bạn có thể cài đặt bản rút gọn vào thư mục website bất kỳ. chẳng hạn tôi chọn cài trong website nguyenvanphong.com .

truy cập vào thư mục chứa website nguyenvanphong.com

cd /home/nguyenvanphong/nguyenvanphong.com/public_html

Tải và giải nén

wget https://files.phpmyadmin.net/phpMyAdmin/4.7.6/phpMyAdmin-4.7.6-all-languages.zip
unzip phpMyAdmin-*.zip

Cuối cùng bạn có thể truy cập vào phpmyadmin trên trình duyệt bằng link dẫn.

https://nguyenvanphong.com/phpMyAdmin-4.7.6-all-languages

Lưu ý: Bạn thay nguyenvanphong.com bằng domain của bạn cho phù hợp.

Chúc các bạn thành công.

Leave a Reply