Open7

現職での新しい技術スタック説明用メモ 2024/09

こーひーあーるこーひーあーる

内容予定

  • AlmaLinux9 / Rocky Linux (Oracle/SQLServerのドライバ対応しているのを調べる)
  • Docker
  • NGINX + PHP-FPM
  • PHP 8.3
  • Laravel 11
  • GitLab CI/CD
こーひーあーるこーひーあーる

CentOS Linux 7のサポート終了について

https://blog.centos.org/2020/12/future-is-centos-stream/
https://www.redhat.com/ja/topics/linux/what-is-centos-stream
https://www.redhat.com/ja/blog/centos-linux-has-reached-its-end-life-eol

ざっくり要約

  • 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
https://almalinux.org/blog/our-value-is-our-values/
https://almalinux.org/blog/future-of-almalinux/

Rocky Linux
https://rockylinux.org/ja/news/keeping-open-source-open

AlmaLinuxとRocky Linuxのフォーラム

https://forums.almalinux.org/
https://forums.rockylinux.org/

こーひーあーるこーひーあーる

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"
みたいな、ファイルオープン数に関するエラーも出るので、最大オープンファイル数を増やすことでチューニングできる。

こーひーあーるこーひーあーる

PHP7.3からPHP8.3へ引っ越すことで使えるようになる機能

個人的にありがたいやつ

  • JITコンパイル
  • readonly プロパティ