Caddy trên AlmaLinux 9 - Quá ảo

Tính cài Webinoly hoặc CentminMod cho thèng haproxy.tech, mà không hiểu vì lý do thần thánh nào đó, ngay thời điểm đó, khi chạy setup cài đặt mặc định, cả Webinoly và Centmin đều có lỗi???

Quá là hi hữu luôn, cách đây ít hôm tình cờ xem 1 bài viết về cài đặt LCMP từ teddysun nên quyết định tự tạo độ khó cho game, sử dụng LCMP ((Linux + Caddy + MariaDB + PHP) trên AlmaLinux OS 9, VPS thì dùng gói miễn phí của Oracle cho thèng haproxy.tech 😛

Nói chung ở thèng haproxy.tech thì cứ cái gì mới nhất tống hết vào, AlmaLinux 9 nhìn có vẻ mới nên dùng thử luôn 😛

Các bước tuần tự như bên dưới, cơ bản thì cứ copy, paste vào là xong 😀

Các bước nhỏ ban đầu

  • Tạo tài khoản root cho AlmaLinux OS 9 trên Oracle
sudo passwd root

(Điền mật khẩu và enter) – làm 2 lần để đổi password cho root

  • Tiếp theo gõ
sudo yum install nano -y
sudo nano /etc/ssh/sshd_config

Thêm vào 3 dòng

PermitRootLogin yes
PasswordAuthentication yes
ClientAliveInterval 7200

Ctrl+O -> Enter -> Ctrl+X để save và exit.

  • Gõ tiếp lệnh sau để khởi động lại ssh:
sudo service sshd restart

Lúc này đã có thể login với tài khoản root

  • Cập nhập AlmaLinux
sudo dnf update -y
  • Thêm kho lưu trữ Epel
sudo dnf install epel-release -y
  • Cài đặt htop, zip, unzip, screen
sudo dnf install htop -y
sudo dnf install zip -y
sudo dnf install unzip -y
sudo dnf install screen -y
sudo dnf install wget -y
sudo dnf install wget -y
  • Cài đặt RAM ảo
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo sysctl vm.swappiness=10
  • Tiếp theo là tắt SELINUX
sed -i 's@^SELINUX.*@SELINUX=disabled@g' /etc/selinux/config
setenforce 0
  • Tắt Firewall
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl mask --now firewalld

Cá nhân thì mình không sử dụng firewall mặc định trên OS, tại …. không thích 😀

Cài xong xuôi nếu thích thì cấu hình firewall từ cơ sở hạ tầng của Oracle sau

  • Thay đổi DNS server
sudo nano /etc/resolv.conf

Nếu thấy có dòng nào bắt đầu bằng nameserver thì xóa đi, thay bằng 2 dòng bên dưới

nameserver 8.8.8.8
nameserver 1.1.1.1
  • Cuối cùng là và khởi động lại OS cho sạch sẽ các thứ
sudo reboot

Thời gian khởi động trên AlmaLinux hay CentOS thường khá chậm so với Ubuntu

1. Cài đặt và cấu hình Caddy Web Server

dnf install -y dnf-plugins-core
dnf copr enable @caddy/caddy -y && dnf install -y caddy && caddy version

Việc cài đặt Caddy nhanh một cách lú người 😀

  • Tạo các thư mục mặc định
mkdir -p /data/www/default
mkdir -p /var/log/caddy/
mkdir -p /etc/caddy/conf.d/
chown -R caddy.caddy /data/www/default
chown -R caddy.caddy /var/log/caddy/
  • Chỉnh sửa cấu hình Caddy
nano /etc/caddy/Caddyfile
  • Xóa hết nội dung bên trong và thay bằng nội dung bên dưới
{
    admin off
}
:80 {
    # Set this path to your site's directory.
    root * /data/www/default
    encode gzip
    # Enable the static file server.
    file_server {
        index index.html
    }
    # Serve a PHP site through php-fpm:
    php_fastcgi unix//run/php-fpm/www.sock {
        split .php
        index index.php
    }
    log {
        output file /var/log/caddy/access.log
    }
}
import /etc/caddy/conf.d/*.conf

Ctrl+O -> Enter -> Ctrl+X để save và exit.

2. Cài đặt và cấu hình MariaDB

  • Cài đặt phiên bản MariaDB 10.11
wget -qO mariadb_repo_setup.sh https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
chmod +x mariadb_repo_setup.sh
./mariadb_repo_setup.sh --mariadb-server-version=mariadb-10.11
dnf install -y MariaDB-common MariaDB-server MariaDB-client MariaDB-shared MariaDB-backup
  • Chỉnh sửa /etc/my.cnf.d/server.cnf để tạo mã hóa mặc định utf8mb4
lnum=$(sed -n '/\[mariadb\]/=' /etc/my.cnf.d/server.cnf)
sed -i "${lnum}acharacter-set-server = utf8mb4\n\n\[client-mariadb\]\ndefault-character-set = utf8mb4" /etc/my.cnf.d/server.cnf
  • Khởi động MariaDB
systemctl start mariadb
  • Sửa mật khẩu của tài khoản root và các thứ không cần thiết
db_pass="Thisisdbrootpassword"
mysql -e "grant all privileges on *.* to root@'127.0.0.1' identified by \"${db_pass}\" with grant option;"
mysql -e "grant all privileges on *.* to root@'localhost' identified by \"${db_pass}\" with grant option;"
mysql -uroot -p${db_pass} 2>/dev/null <<EOF
drop database if exists test;
delete from mysql.db where user='';
delete from mysql.db where user='PUBLIC';
delete from mysql.user where user='';
delete from mysql.user where user='mysql';
delete from mysql.user where user='PUBLIC';
flush privileges;
exit
EOF

3. Cài đặt và cấu hình PHP

  • Cài đặt phiên bản PHP 8.2
dnf config-manager --set-enabled crb
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
dnf module reset -y php
dnf module install -y php:remi-8.2
  • Cài đặt các module
dnf install -y php-cli php-bcmath php-embedded php-gd php-imap php-mysqlnd php-dba php-pdo php-pdo-dblib php-pgsql php-odbc php-enchant php-gmp php-intl php-ldap php-snmp php-soap php-tidy php-opcache php-process php-pspell php-shmop php-sodium php-ffi php-brotli php-lz4 php-xz php-zstd
dnf install -y php-pecl-imagick-im7 php-pecl-zip php-pecl-mongodb php-pecl-swoole5 php-pecl-grpc php-pecl-yaml php-pecl-uuid
  • Chỉnh sửa tệp cấu hình php-fpm của PHP để hỗ trợ Caddy ( /etc/php-fpm.d/www.conf)
sed -i "s@^user.*@user = caddy@" /etc/php-fpm.d/www.conf
sed -i "s@^group.*@group = caddy@" /etc/php-fpm.d/www.conf
sed -i "s@^listen.acl_users.*@listen.acl_users = apache,nginx,caddy@" /etc/php-fpm.d/www.conf
sed -i "s@^;php_value\[opcache.file_cache\].*@php_value\[opcache.file_cache\] = /var/lib/php/opcache@" /etc/php-fpm.d/www.conf
  • Thay đổi quyền thư mục của PHP để hỗ trợ Caddy
chown root.caddy /var/lib/php/session
chown root.caddy /var/lib/php/wsdlcache
chown root.caddy /var/lib/php/opcache
  • Chỉnh sửa tệp cấu hình PHP để phù hợp hơn với môi trường sản xuất và hỗ trợ các kết nối MariaDB (/etc/php.ini )
sed -i "s@^disable_functions.*@disable_functions = passthru,exec,shell_exec,system,chroot,chgrp,chown,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore@" /etc/php.ini
sed -i "s@^max_execution_time.*@max_execution_time = 300@" /etc/php.ini
sed -i "s@^max_input_time.*@max_input_time = 300@" /etc/php.ini
sed -i "s@^post_max_size.*@post_max_size = 50M@" /etc/php.ini
sed -i "s@^upload_max_filesize.*@upload_max_filesize = 50M@" /etc/php.ini
sed -i "s@^expose_php.*@expose_php = Off@" /etc/php.ini
sed -i "s@^short_open_tag.*@short_open_tag = On@" /etc/php.ini
sock_location="/var/lib/mysql/mysql.sock"
sed -i "s#mysqli.default_socket.*#mysqli.default_socket = ${sock_location}#" /etc/php.ini
sed -i "s#pdo_mysql.default_socket.*#pdo_mysql.default_socket = ${sock_location}#" /etc/php.ini

4. Khởi động dịch vụ

  • Khởi động PHP, Caddy và bật tự khởi động sau khi reboot server
systemctl start php-fpm
systemctl start caddy
systemctl enable mariadb
systemctl enable php-fpm
systemctl enable caddy

5. Cài đặt WordPress cho haproxy.tech

Tạo file cấu hình Caddy cho haproxy.tech

touch /etc/caddy/conf.d/haproxy.tech.conf
nano /etc/caddy/conf.d/haproxy.tech.conf
  • Điền vào nội dung bên dưới
www.haproxy.tech {
    redir https://haproxy.tech{uri}
}
haproxy.tech {

    header {
   #     Strict-Transport-Security "max-age=31536000; preload"
   #     X-Content-Type-Options nosniff
   #     X-Frame-Options SAMEORIGIN
    }
    # Set this path to your site's directory.
    root * /data/www/haproxy.tech
    tls [email protected]
     encode gzip
    @disallowed {
       path /xmlrpc.php
        path /wp-content/uploads/*.php
    }
    rewrite @disallowed /index.php
    # Serve a PHP site through php-fpm
    php_fastcgi unix//run/php-fpm/www.sock
    # Enable the static file server.
    file_server {
        index index.html
    }
    log {
        output file /var/log/caddy/ssl_access.log {
            roll_size 100mb
            roll_keep 3
            roll_keep_for 7d
        }
    }
}

Cấu hình ở dòng 10, bắt đầu bằng tls email address là cấu hình cơ bản của Caddy, không rõ sao teddysun lại không dùng?

Không cấu hình dòng này, kết nối qua Cloudflare rất hay bị tình huống timeout

  • Khởi động lại Caddy
systemctl restart caddy

Tạo 1 database mới cho Wordpress

  • Login với tài khoản root
mysql -u root -p

Điền vào password root tạo ở bước 2

  • Tạo 1 database với tên wordpress
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • Tạo tài khoản wordpressuser với password là password
GRANT ALL ON wordpress.* TO 'wordpressuser'@'localhost' IDENTIFIED BY 'password';
  • Thoát ra
FLUSH PRIVILEGES;
EXIT;

Cài đặt Wordpress

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
mv wp-cli.phar /usr/local/bin/wp
mkdir -p /data/www/haproxy.tech
cd /data/www/haproxy.tech
wp core download --allow-root
wp core config --dbhost=localhost --dbname=wordpress --dbuser=wordpressuser --dbpass=password --allow-root
chown -R caddy:caddy /data/www/haproxy.tech
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

Lúc này bạn có thể gõ domain haproxy.tech vào trình duyệt để cài đặt tài khoản admin 😀

Chú ý ở dòng 8, set user là caddy:caddy thì mọi thứ mới chạy bình thường, phân quyền thư mục 755, file 644 thoải mái :]]

Có 1 điểm khá hài khi mình đọc bài viết gốc LCMP từ teddysun, lý do anh ấy chuyển từ Apache sang Caddy chỉ là vì Caddy hỗ trợ gia hạn chứng chỉ https … tốt hơn 😀 chạy acme.sh thi thoảng nó bị ngáo ngáo, không renew làm ssl bị lỗi 😛 thực tế thì từ 2017-2018, sau bài viết về HSTS, mình cũng đã nghỉ hẳn cái trò con bò là dùng ssl của Letsencrypt, dùng ssl của Cloudflare hạn sử dụng 15 năm, làm 1 lần là thôi, tự dưng ôm đầu máu vào cái vụ cứ 90 ngày bắt renew 1 lần làm gì 😛

Mà rõ ràng trên Apache, Nginx hay gì đều có thể dùng ssl của Clouflare trong 1 nốt nhạc, chuyển sang Caddy chỉ vì vụ này nghe cũng hơi kì 😛

6. Tinh chỉnh hiệu năng cho LCMP

  • Cấu hình PHP (etc/php.ini)
nano etc/php.ini

Sửa lại các giá trị upload file và bỏ giới hạn các hàm trong PHP

max_execution_time = 3000
max_input_time = 3000
memory_limit = 512M
upload_max_filesize = 50000M
post_max_size = 50000M
disable_functions = (xóa hết các dòng có sẵn tại đây)

Sử dụng opcache với thông số như bên dưới (dùng cấu hình từ Webinoly)

[opcache]
; see /etc/php.d/10-opcache.ini
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=100000
opcache.max_wasted_percentage=10
  • Cấu hình PHP-FPM (/etc/php-fpm.d/www.conf) (dùng cấu hình từ Webinoly)
nano /etc/php-fpm.d/www.conf

Sửa lại

pm.max_children = 6
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 1000
ping.path = /ping
request_terminate_timeout = 60
  • Khởi động lại PHP
systemctl restart php-fpm
  • Thêm vào ít dòng cấu hình riêng cho wp-config.php
define( 'DISABLE_WP_CRON', true );
define( 'COOKIE_DOMAIN', 'haproxy.tech' );
define( 'FS_METHOD', 'direct' );
define( 'WP_MEMORY_LIMIT', '256M' ); 
define( 'WP_MAX_MEMORY_LIMIT', '512M' );
  • Cấu hình MariaDB
nano /etc/my.cnf

Thêm vào bên trong các dòng bên dưới

# The MariaDB configuration file
[mysqld]
innodb_buffer_pool_size = 200M
innodb_log_file_size = 100M
innodb_buffer_pool_instances = 8
innodb_io_capacity = 5000
max_binlog_size = 100M
expire_logs_days = 3
  • Khởi động lại MariaDB
systemctl restart mariadb
  • Addon cài thêm

Mình có cập nhập curl lên bản mới nhất theo hướng dẫn tại đây

sudo dnf install wget gcc openssl-devel -y
wget https://curl.se/download/curl-8.1.2.tar.gz
gunzip -c curl-8.1.2.tar.gz | tar xvf -
cd curl-8.1.2
./configure --with-ssl
make
make install
reboot
curl -V
curl 8.1.2 (x86_64-pc-linux-gnu) libcurl/8.1.2 OpenSSL/3.0.7
Release-Date: 2023-05-30
Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS HSTS HTTPS-proxy IPv6 Largefile NTLM NTLM_WB SSL threadsafe TLS-SRP UnixSockets

Xong xuôi hết các thứ thì reboot VPS, cài đặt thử 1 ít plugin, theme, viết thử bài, ấn cập nhập các thứ, kiểm tra có vấn đề gì không 😛

7. Các vấn đề gặp phải

Vấn đề khá quái, có vẻ như liên qua tới Zend OPcache, nếu bạn vào 1 trang, mà trang đó PHP chưa bao giờ chạy, thì lần đầu tiên, nó load đặc biệt lâu, kiểu vừa ấn vào edit theme, nó phải load các file php lần đầu tiên ra, chưa cache được, nhưng từ lần sau cache rồi, chạy bình thường

Vấn đề này trên Nginx, OpenLiteSpeed, LiteSpeed hay Apache thì mình chưa gặp bao giờ, nó có chậm, cũng chỉ chậm hơi 1 tẹo, còn trên Caddy thì đặc biệt chậm

Ở phần cấu hình PHP, tác giả có thêm 1 dòng là sed -i “s@^;php_value\[opcache.file_cache\].*@php_value\[opcache.file_cache\] = /var/lib/php/opcache@” /etc/php-fpm.d/www.conf

Ý nghĩa đại khái nếu RAM đầy, nó sẽ chuyển file php đã được cache xuống HDD, vấn đề là kể cả mình có bỏ đi dòng này, thì khi load lần đầu các file PHP nặng, nó vẫn rất chậm

Khả năng khá cao lỗi đã được gạch ở trên là do AlmaLinux OS 9 trên Oracle có vấn đề, thử dùng hệ điều hành khác là Oracle Linux 8, cũng trên Oracle thì không gặp tình trạng này

8. Bất ngờ hay gây lú???

Nếu bạn đọc hết 7 đầu mục lớn ở trên, sẽ thấy LCMP trên AlmaLinux 9, khá là củ chuối, thậm chí vấn đề gặp phải khi dùng VPS Oracle có ổ cứng quá chậm khá là tệ

Tiện thể mình nhìn các đoạn code của teddysun, thấy ảnh viết khá tuần tự, hoàn toàn có thể viết 1 script nhỏ khác để chạy tuần tự các bước như trên, tiện cũng đang rảnh nên mình đưa luôn trên Github

Lúc này công đoạn cài đặt LCMP trên AlmaLinux 9 bao gồm khoàng 2 bước

  • Cài đặt wget
sudo dnf install wget -y
  • Cài đặt LCMP
sudo wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/LCMP/main/setup.sh -O setup_lcmp.sh && sudo chmod +x setup_lcmp.sh && sudo ./setup_lcmp.sh

Muốn cài đặt cho domain nào thì bạn chỉ làm bước 5 là được (các bước 1,2,3,4,6 đã được làm sẵn) nhưng lúc này VPS miễn phí của Oracle bị ngáo, VPS mới tạo ra không ping tới được :]]

Đành tạo 1 con VPS trên UpCloud dùng AlmaLinux 9 để thử code chạy ổn không 😀

Thời gian update, cài đặt tất cả mọi thứ trên UpCloud chưa tới 5 phút, copy đoạn code ở bước 5 xuống, enter thêm 2-3 cái là đã cài đặt xong Wordpress trên thèng haproxy.tech

Trên UpCloud thì không gặp vấn đề bị chậm OPcache như Oracle, trang nào ấn vào cũng chạy vèo vèo

-> chậm là do Oracle chứ không phải do cách cấu hình Caddy có vấn đề

Tiện lỡ tạo 1 con VPS trên Upload rồi thì thử hiệu năng luôn xem làm sao, vì trước giờ mình đều dùng cùng 1 cấu hình 1Gb RAM trên Upload

2023-06-23_12-03-52

Task nếu chỉ cài đặt Wordpress cơ bản khá ít 😀 nhưng lượng RAM sử dụng đang khá là nhiều 😛 vấn đề này thì cũng dễ lý giải, do đợt này mình cấu hình MariaDB hơi khác 1 chút 😛

Tuy thế khi thử tới bài test hiệu năng chịu tải tại loader.io khá là lú người

2023-06-23_12-07-38

Ở bài test 100 kết nối mỗi giây trên Wordpress mặc định, gần như các script auto đều pass

Cụ thể con số này ở Webinoly là 5.1s, Centmin Mod là ~4.7s, WPTangToc ~4.5s và đáng sợ làm sao, LCMP có thể xuống ~ 3.9s

Thành thật mà nói mình khá hoang mang về kết quả này, tác giả Centmin Mod là bậc thầy về tốc độ, tác giả Webinoly mình cũng rất ngưỡng mộ về chuyện tối ưu hệ thống, Caddy cài mặc định chẳng làm vẹo gì mà hơn được Nginx tối ưu tận răng thì vô lý quá 😀

Ngồi ngẫm lại thì thấy sự khác biệt nhiều nhất, có lẽ là ở PHP, trước đây khi dùng trên các trang cần ổn định, mình luôn duy trì dùng PHP 7.4, còn trên LCMP thì mình cho lên 8.2, tuy thế PHP nó liên quan nhiều ở tốc độ tải trang, chứ không phải ở vấn đề chịu tải

Ở MariaDB thì mình cũng chỉ cấu hình bừa, thực tế mình cũng chẳng hiểu các con số đó có nghĩa là gì =))

Kết luận:

Việc cài đặt và cấu hình LCMP ((Linux + Caddy + MariaDB + PHP) khá nhanh, cài đặt cũng khá đơn giản, chủ yếu vì teddysun viết cả rồi, copy paste về là chính 😀

Hiệu năng mặc định trên Caddy + MariaDB + PHP theo mình khá phò, dù Nginx (OpenLiteSpeed / LiteSpeed) + MariaDB + PHP cài mặc định cũng phò chẳng kém :]]

Tinh chỉnh hiệu năng như bước 6 thì kết quả cho ra khá là gây lú, mình nghĩ cần nhiều người cài đặt xong xem kết quả của họ làm sao mới có thể kết luận thêm 😀

Caddy được 1 ưu điểm như mình có nói ở trên, là hỗ trợ tạo ssl tốt, không cần cấu hình gì cả, nó cũng là 1 trong các webserver đầu tiên hỗ trợ HTTP/3

Dù 2 điểm này, ai dùng Cloudflare thì đều … đã có :]] thành ra ưu điểm của nó khá vô dụng với cá nhân mình

Khuyết điểm của nó thì sau khi google tầm 5 phút, bà con kháo nhau là Caddy không có cơ chế cache, muốn dùng phải cài addon bên thứ 3 viết vào, chứ mặc định Caddy không có, khuyết điểm này thì cũng vô dụng với mình, vì mình luôn dùng Cloudflare để cache 😛

Tạm thì ưu và khuyết của Caddy, với mình đều vô dụng cả 😀

Thực tế khuyết điểm nặng nhất của Caddy, theo mình là số lượng người sử dụng, theo các bài google, thì chắc chỉ 0.1% các trang web trên thế giới đang dùng Caddy làm webserver, nếu gặp lỗi gì, gần như bạn rất khó để tìm ra hướng dẫn hay giải pháp xử lý 😛

Comment policy: We love comments and appreciate the time that readers spend to share ideas and give feedback.
Notes: However, those deemed to be spam or solely promotional will be deleted.

You can create a Gravatar account, add avatar, then use that email to comment here, your account will have a more beautiful Avatar, easier to recognize with other members.

Please use real emails, you can receive notifications when comments are replied