Open7
現職での新しい技術スタック説明用メモ 2024/09
内容予定
- AlmaLinux9 / Rocky Linux (Oracle/SQLServerのドライバ対応しているのを調べる)
- Docker
- NGINX + PHP-FPM
- PHP 8.3
- Laravel 11
- GitLab CI/CD
CentOS Linux 7のサポート終了について
ざっくり要約
- Red Hatはこれまで、有償のRed Hat Enterprise Linux(RHEL)の無償版としてCentOS Linuxを提供してきた
- CentOS LinuxはRHELのソースコードを元に、コミュニティ主導で開発されたため、RHELと高い互換性を持ち、商用利用にも適していた。
- 2020年にRed HatがCentOSの方針を変更し、CentOS Streamに全投資することになった
- CentOS StreamはRHELの開発ブランチとして機能する (つまり先行版)
- 開発版であるため、商用利用向けの安定性は保証されていない
- CentOS Linux 7 のサポートは2024/6/30まで
このまま使い続けると、セキュリティ的な脆弱性が発見されてもセキュリティパッチが提供されないため、システムが危険にさらされる可能性がある。また、CentOS Linux 7向けのパッケージの提供が継続されるかも不透明。実際に、yumコマンドで必要なパッケージが取得できないなどの問題がすでに発生しているため、移行先を検討する必要がある。
移行先のOS候補
要件
- RHELと互換性がある、使い勝手が似ている
- 無償で使える
- 商用利用できる信頼性があると望ましい
- 長期にわたってメンテナンスされ続ける見込み
- Docker、PHP、Apache、NGINX、PHP-FPM、Node.js、Postfix、Dovecot、NFS、Memcached、Redis、BIND、Squid、MySQL(AWSに引っ越す?)、Chrony、cronをサポート
- OracleDBとSQLServerのドライバ (PHP用)をサポート
候補
- AlmaLinux
- Rocky Linux
AlmaLinuxとRocky Linuxのブログを読んでみる
AlmaLinux
Rocky Linux
AlmaLinuxとRocky Linuxのフォーラム
NGINXとApacheをサクッとベンチマーク
環境構築
- AWS EC2
- t2.medium
- Official AlmaLinux OS 9.4 x86_64 image
### パッケージ最新化
$ sudo dnf update -y
### PHP8.3を入れる
$ sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
$ sudo dnf module enable php:remi-8.3 -y
$ sudo dnf install -y php php-fpm php-mbstring php-xml php-bcmath php-json php-zip
$ sudo systemctl start php-fpm
### PHP、PHP-FPMバージョン確認
$ php -v
PHP 8.3.11 (cli) (built: Aug 27 2024 19:16:34) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.3.11, Copyright (c) Zend Technologies
with Zend OPcache v8.3.11, Copyright (c), by Zend Technologies
$ php-fpm -v
PHP 8.3.11 (fpm-fcgi) (built: Aug 27 2024 19:16:34)
Copyright (c) The PHP Group
Zend Engine v4.3.11, Copyright (c) Zend Technologies
with Zend OPcache v8.3.11, Copyright (c), by Zend Technologies
### 色々導入
$ sudo dnf install -y epel-release
$ sudo dnf install -y git curl wget unzip vim httpd-tools dstat nginx httpd
### NGINX、Apacheバージョン確認
$ nginx -v
nginx version: nginx/1.20.1
$ httpd -v
Server version: Apache/2.4.57 (AlmaLinux)
Server built: Aug 5 2024 00:00:00
### Composerダウンロード
$ cd ~
$ curl -sS https://getcomposer.org/installer | php
### Laravelを雑にセットアップ
$ cd /var/www
$ sudo ~/composer.phar create-project --prefer-dist laravel/laravel laravel
$ sudo chmod -R 777 /var/www/laravel
$ sudo setenforce 0
### NGINXの設定
$ sudo vim /etc/nginx/conf.d/laravel.conf
server {
listen 80;
server_name my-ec2-ip;
root /var/www/laravel/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
error_log /var/log/nginx/laravel_error.log;
access_log /var/log/nginx/laravel_access.log;
}
### Apacheの設定
$ sudo vim /etc/httpd/conf.d/laravel.conf
<VirtualHost *:80>
ServerName my-ec2-ip
DocumentRoot /var/www/laravel/public
<Directory /var/www/laravel/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog /var/log/httpd/laravel_error.log
CustomLog /var/log/httpd/laravel_access.log combined
</VirtualHost>
NGINX 200並列
### NGINXサービス起動
$ sudo systemctl start nginx
### abでレスポンスタイムとりつつ、dstatでメモリの使用率とかをモニタリング
$ ab -n 2000 -c 200 http://54.95.241.58/
Concurrency Level: 200
Time taken for tests: 27.907 seconds
Complete requests: 2000
Failed requests: 0
Total transferred: 70308000 bytes
HTML transferred: 68040000 bytes
Requests per second: 71.67 [#/sec] (mean)
Time per request: 2790.723 [ms] (mean)
Time per request: 13.954 [ms] (mean, across all concurrent requests)
Transfer rate: 2460.30 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 1.9 1 16
Processing: 40 2590 1019.7 2419 10837
Waiting: 29 2589 1019.8 2418 10836
Total: 48 2591 1018.9 2419 10837
Percentage of the requests served within a certain time (ms)
50% 2419
66% 2616
75% 2789
80% 2933
90% 3509
95% 4407
98% 5653
99% 6667
100% 10837 (longest request)
$ dstat -cdmn
----total-usage---- -dsk/total- ------memory-usage----- -net/total-
usr sys idl wai stl| read writ| used free buf cach| recv send
| | 308M 2403M 2452k 1064M|
7 2 83 0 6| 0 280k| 315M 2396M 2452k 1064M| 252k 270k
59 9 10 6 20| 0 4811k| 323M 2387M 2452k 1064M|3280k 3329k
59 9 10 6 16| 0 4948k| 332M 2378M 2452k 1064M|3387k 3438k
62 9 8 4 21| 0 4705k| 346M 2365M 2452k 1064M|3096k 3142k
54 9 18 1 19| 0 4064k| 361M 2349M 2452k 1064M|2587k 2626k
55 9 15 2 21| 0 4436k| 371M 2339M 2452k 1064M|2840k 2882k
69 12 6 2 14| 0 5268k| 386M 2324M 2452k 1064M|3427k 3478k
49 7 25 0 18| 0 3500k| 401M 2310M 2452k 1064M|2294k 2328k
58 9 16 1 17| 0 4360k| 413M 2297M 2452k 1064M|2914k 2957k
45 6 25 1 24| 0 3332k| 428M 2282M 2452k 1064M|1994k 2024k
41 7 35 1 20| 0 2870k| 436M 2274M 2452k 1064M|1904k 1932k
55 7 14 1 23| 0 4316k| 443M 2267M 2452k 1064M|2876k 2919k
49 8 21 1 23| 0 4051k| 445M 2265M 2452k 1064M|2661k 2701k
50 7 18 2 24| 0 4285k| 447M 2263M 2452k 1064M|2660k 2699k
68 9 2 0 22| 0 4975k| 449M 2261M 2452k 1064M|3158k 3205k
44 6 23 1 27| 0 3381k| 450M 2260M 2452k 1064M|2153k 2185k
52 7 20 0 21| 0 4026k| 452M 2259M 2452k 1064M|2694k 2734k
54 9 21 3 17| 0 4337k| 453M 2257M 2452k 1064M|2844k 2886k
40 5 38 2 18| 0 3233k| 454M 2256M 2452k 1064M|1968k 1997k
34 5 47 2 11| 0 3075k| 448M 2262M 2452k 1064M|1858k 1885k
52 9 25 2 16| 0 4120k| 454M 2256M 2452k 1064M|2819k 2862k
59 8 22 1 8| 0 5107k| 461M 2249M 2452k 1064M|3228k 3276k
26 4 55 3 17| 0 2192k| 462M 2248M 2452k 1064M|1348k 1368k
61 8 18 3 13| 0 5902k| 466M 2244M 2452k 1064M|3388k 3439k
54 8 16 0 21| 0 4351k| 467M 2243M 2452k 1065M|2913k 2957k
52 6 26 3 17| 0 4216k| 437M 2273M 2452k 1065M|2752k 2791k
56 7 21 2 15| 0 4788k| 439M 2271M 2452k 1065M|2924k 2962k
18 5 65 5 10| 0 2993k| 440M 2270M 2452k 1065M|1876k 1900k
2 2 92 3 1| 0 1212k| 421M 2289M 2452k 1065M| 757k 768k
1 0 99 0 1| 0 0 | 424M 2287M 2452k 1065M| 80B 376B
### NGINXサービス停止
$ sudo systemctl stop nginx
Apache 200並列
### Apacheサービス起動
$ sudo systemctl start httpd
$ httpd -V | grep 'Server MPM'
Server MPM: event
### abでレスポンスタイムとりつつ、dstatでメモリの使用率とかをモニタリング
$ ab -n 2000 -c 200 http://my-ec2-ip/
Concurrency Level: 200
Time taken for tests: 30.931 seconds
Complete requests: 2000
Failed requests: 0
Total transferred: 70334000 bytes
HTML transferred: 68040000 bytes
Requests per second: 64.66 [#/sec] (mean)
Time per request: 3093.104 [ms] (mean)
Time per request: 15.466 [ms] (mean, across all concurrent requests)
Transfer rate: 2220.60 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 2.1 1 23
Processing: 68 2872 1161.8 2592 10189
Waiting: 56 2871 1161.8 2592 10187
Total: 68 2873 1161.5 2593 10189
Percentage of the requests served within a certain time (ms)
50% 2593
66% 2827
75% 3100
80% 3284
90% 3980
95% 5221
98% 6721
99% 8004
100% 10189 (longest request)
$ dstat -cdmn
----total-usage---- -dsk/total- ------memory-usage----- -net/total-
usr sys idl wai stl| read writ| used free buf cach| recv send
| | 403M 2306M 2452k 1066M|
3 1 93 0 4| 0 76k| 407M 2302M 2452k 1066M| 107k 123k
40 6 22 1 33| 0 1556k| 425M 2284M 2452k 1066M| 988k 1004k
46 10 15 3 29| 0 3817k| 449M 2260M 2452k 1066M|2414k 2452k
61 10 6 0 23| 0 4271k| 485M 2224M 2452k 1066M|2845k 2888k
46 10 18 2 29| 0 3253k| 528M 2181M 2452k 1066M|2078k 2110k
59 10 18 1 12| 0 4587k| 544M 2165M 2452k 1066M|2990k 3034k
39 7 32 1 20| 0 3279k| 549M 2159M 2452k 1066M|2113k 2144k
49 8 29 1 17| 0 3562k| 557M 2152M 2452k 1066M|2370k 2406k
73 13 8 1 5| 0 6440k| 561M 2148M 2452k 1066M|4084k 4181k
58 10 18 0 14| 0 4479k| 565M 2144M 2452k 1066M|2930k 2974k
46 8 20 1 30| 0 3614k| 567M 2142M 2452k 1066M|2301k 2335k
50 7 24 2 21| 0 3648k| 568M 2140M 2452k 1066M|2197k 2230k
46 9 27 1 18| 0 4486k| 570M 2139M 2452k 1066M|2644k 2684k
50 7 19 1 28| 0 3460k| 571M 2137M 2452k 1066M|2165k 2198k
44 7 41 2 9| 0 3540k| 573M 2136M 2452k 1066M|2296k 2331k
51 7 20 1 18| 0 4152k| 575M 2133M 2452k 1066M|2733k 2774k
54 9 13 1 24| 0 4307k| 576M 2132M 2452k 1066M|2697k 2737k
45 6 31 1 21| 0 3224k| 578M 2131M 2452k 1066M|2041k 2071k
30 6 46 2 22| 0 2268k| 579M 2129M 2452k 1066M|1458k 1479k
36 5 38 1 21| 0 2917k| 580M 2128M 2452k 1066M|1891k 1919k
39 6 41 1 15| 0 2902k| 581M 2127M 2452k 1066M|1862k 1889k
52 9 26 2 13| 0 4625k| 584M 2124M 2452k 1066M|2842k 2884k
41 6 46 1 9| 0 3171k| 586M 2122M 2452k 1066M|2077k 2108k
38 6 37 1 21| 0 3194k| 587M 2121M 2452k 1066M|2003k 2033k
64 10 7 1 17| 0 4987k| 591M 2118M 2452k 1066M|3208k 3255k
50 8 30 2 13| 0 4049k| 593M 2115M 2452k 1066M|2624k 2663k
47 7 28 2 18| 0 3811k| 596M 2112M 2452k 1066M|2479k 2516k
42 7 31 1 21| 0 3306k| 598M 2111M 2452k 1066M|2076k 2107k
58 8 26 3 5| 0 5100k| 600M 2108M 2452k 1067M|3299k 3345k
42 6 40 1 12| 0 3592k| 602M 2106M 2452k 1067M|2346k 2377k
29 4 49 4 19| 0 2997k| 604M 2105M 2452k 1067M|1876k 1901k
3 1 90 3 4| 0 1400k| 563M 2145M 2452k 1067M| 866k 879k
0 0 99 0 0| 0 0 | 561M 2148M 2452k 1067M| 204B 514B
1 1 99 0 1| 0 0 | 546M 2162M 2452k 1067M| 52B 318B
### Apacheサービス停止
$ sudo systemctl stop httpd
並行リクエスト数をさらに増やすと、それぞれデフォルトの設定だとNGINXはリクエストの処理に失敗し始める、Apacheはメモリ使用が比較的多くなる。
NGINXについてはworker_connectionsを増やす。また、
2024/09/23 05:09:57 [alert] 24993#24993: *11693 socket() failed (24: Too many open files) while connecting to upstream, client: my-ec2-ip, server: my-ec2-ip, request: "GET / HTTP/1.0", upstream: "fastcgi://unix:/run/php-fpm/www.sock:", host: "my-ec2-ip"
みたいな、ファイルオープン数に関するエラーも出るので、最大オープンファイル数を増やすことでチューニングできる。
Apacheのmod_phpモジュールについて
RHEL 8 で非推奨、RHEL 9 で使えないとのこと。
PHP7.3からPHP8.3へ引っ越すことで使えるようになる機能
個人的にありがたいやつ
- JITコンパイル
- readonly プロパティ
PHP-FPMコンテナの高速化
- OPcache有効化
- JITコンパイラ有効化
- Composer最適化
- php artisan config:cache