ApacheBenchの使い方

ApacheBenchはApache HTTP Serverに同梱されている性能テストツール
単一のURLへのリクエストを生成するツール

$ ab -n 100 -c 10 http://google.com/
nオプション: 生成するリクエスト数
cオプション: 並列実行する数
$ ab -n 100 -c 10 http://google.com/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking google.com (be patient)…..done

Server Software: gws
Server Hostname: google.com
Server Port: 80

Document Path: /
Document Length: 219 bytes

Concurrency Level: 10
Time taken for tests: 1.533 seconds
Complete requests: 100
Failed requests: 0
Non-2xx responses: 100
Total transferred: 77300 bytes
HTML transferred: 21900 bytes
Requests per second: 65.23 [#/sec] (mean)
Time per request: 153.297 [ms] (mean)
Time per request: 15.330 [ms] (mean, across all concurrent requests)
Transfer rate: 49.24 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 1 2 3.0 1 13
Processing: 103 134 26.4 128 225
Waiting: 103 132 25.6 126 222
Total: 104 136 26.3 130 226

Percentage of the requests served within a certain time (ms)
50% 130
66% 134
75% 139
80% 142
90% 157
95% 217
98% 226
99% 226
100% 226 (longest request)

なるほど

httpd.confの書き方

Section 1: Global Environment
Apache全体に影響を与えるセクション
Server RootはApacheをインストールした場所のパスが指定
Timeoutはクライアントから接続要求を受け取ってからタイムアウトになるまでの時間
KeepAliveはクライアントから接続要求を受け取った際に、すぐにはHTTPセッションを閉じずに、ある一定の時間まで継続してセッションを保っておく機能
MaxKeepAliveRequests: KeepAliveがOnの時に接続要求を受け付ける最大許容値
Listenディレクティブは特定のIPアドレスや特定のIPやポート番号だけをlistenすることができる

Section 2: “Main” server configuration
サーバを実行するためのユーザとグループを指定
User apache
Group apache

ServerAdminは、サーバがエラードキュメントを返す際などに表示される管理者のメールアドレスを指定
ServerNameは、サーバ自身が使用するサーバ名とポート番号を指定
UseCanonicalNameは自身がURLをどのように決定するかを指定
DocumentRoot
Directory: サーバルートディレクトリに対する設定。2度目に出てくるDirectoryはドキュメントルートを指定
Option Mutliviews: 曖昧なURLを指定した場合でも、クライアントに対して最適な値を検索して返す
ユーザにホームページスペースを提供するのがUserDir
AccessFileName アクセス制御を行うためのファイル
はブラウザはアクセスできないようにする
TypesConfigはMIMEタイプ設定ファイルの位置を設定
AddType application/x-smaf mmn mmfを追加したい場合、以下のようにすることで実現
DefaultTypeはMIME Typeファイルに記述がなかった場合の扱いを指定
IfModule mod_mime_magic.c : mod_mine_magic.c モジュールが組み込まれているかどうかを確認し、もし組み込まれていればファイルの内容からさまざまな手がかりを探り出し、MIMEタイプを決定できる
HostnameLookups は IPアドレスをホスト名に変換し、ログに記録する機能を提供
ServerSignature はエラーメッセージなどをクライアントに帰す際のフッターラインを表示させるかどうかを指定するディレクティブ

うーむ、なかなか埋まらんな〜

[Apache] SSL証明書作成

$ httpd -version
Server version: Apache/2.4.37 (Red Hat Enterprise Linux)
$ sudo yum -y install openssl
$ sudo yum -y install mod_ssl

$ cd /etc/httpd/ssl/conf
$ sudo su root
# openssl genrsa 1024 > server.key
# openssl req -new -key server.key > server.csr
# openssl x509 -in server.csr -days 36500 -req -signkey server.key > server.crt

うん、OKかな

Apacheログローテーションとは?

logroteとは、ログファイルのローテーションを行うプログラム
ログファイルを別名でバックアップし、古くなったログファイルを順次削除する
apacheをパッケージからインストールした場合は、ログローテーションは自動でされる。以下のように表示されればインストールされている
$ rpm -qa|grep logrotate
logrotate-3.14.0-4.el8.x86_64

/var/log/httpd/*_log : ローテートするファイルを指定
daily: ローテーションを行う間隔を指定 daily, weekly, monthlyがある
rotate 2: 保存されるアーカイブファイルの数
missingok: missingokはログファイルがなくてもエラーにならない、nomissingokはログファイルがないとエラー
ifempty: ログファイルが空でもローテート、noifemptyは空だとローテーションしない
dateext: アーカイブされたファイルの末尾に年月日が付与される
postrotate: endscripまでのコマンドをログローテーション後に実行
/sbin/service httpd reload > /dev/null 2>/dev/null || true: httpdの再起動を行う処理。httpdが新たに作成したログファイルに記録し始める。
compress : gzipで圧縮
create 0644 hoge hoge: ローテーション後、空のログファイル作成 [パーミッション][ユーザ名][グループ名]
su root root : ローテートするユーザをrootに指定

なるほどねー 
一見複雑そうに見えるが、一つ一つ潰していくと、理解が深まるな

Apache virtualhostに記入する項目

### *.confの書き方
– Include: インクルード
e.g. Include /etc/httpd/conf/httpd.conf

– PidFile: PidFileは、サーバーがプロセスID(PID)を記録するファイル

– ScoreBoardFile: 他のプロセスから統計情報にアクセスできるようになる

– KeepAliveTimeout: 要求がなされてから接続を閉じるまでの、サーバーが待機する時間を秒数で設定。サーバーが要求を受信すると、代わりにTimeoutディレクティブが適用される。デフォルトでは、KeepAliveTimeoutは15秒に設定。

– MinSpareServers、MaxSpareServers: prefork MPMでのみ使用。着信要求の数に基づいて適切な数のスペアサーバープロセスを維持することで、 Apache HTTP サーバー が検出された負荷に対して動的に適応する方法を調整

– StartServers: 起動時に作成されるサーバー プロセス数を設定。Web サーバーがトラフィックの負荷に基づいて動的にサーバー プロセスを停止したり作成したりするので、このパラメータを変更する必要はない。 Web サーバーは、起動時に、preforkMPM 用に 8 サーバープロセスを、 workerMPM用に 2サーバープロセスを起動するように設定される。

– IfModule mod_ssl.c: mod_sslの設定。IfModuleは指定したモジュールが存在したときに処理される

– Listen: Apache がクライアントからのリクエストを受け付けるポート番号を指定するのに使用
以下のように複数指定することもできる
Listen 80
Listen 8080

– Group: サーバーがリクエストに応答する際に所属するグループ

– User:サーバがリクエストに応答する際に用いるユーザ ID

### VitualHostの書き方
– ServerAdmin: サーバがクライアントに送るエラーメッセージに含める電子メールアドレス
e.g. ServerAdmin root@localhost
– ServerName: 自分自身のホスト名を表す時に使用するホスト名とポート番号を設定
– DocumentRoot: Webから見えるメインのドキュメントツリーになるディレクトリ
– ErrorLog: エラーログを出力する場所を設定
– CustomLog: アクセスログを出力する場所, combinedはログのフォーマット
– ScriptAlias: CGI(Perl)を利用するための設定
– SSLEngine: On/OFFで、SSLを有効にするかどうかを指定
– SSLProtocol:使用するSSLプロトコルのバージョンを指定
– SSLCipherSuite: SSL機能で使用可能とする暗号種別を指定。ディレクティブに指定した暗号種別とクライアントが使用できる暗号種別との間で一致するものがあれば,SSL通信が確立されHTTPリクエストを受信
– SSLCertificateFile: Webサーバの証明書を格納したファイル名を指定。サーバ認証するためにWebサーバの証明書を先頭として,中間CA(認証局),ルートCAの順にCAの証明書を連結することができる。証明書はPEM形式。
– SSLCertificateFile: Webサーバの秘密鍵のファイル名を指定。秘密鍵のファイルはPEM形式。RSA暗号を利用した秘密鍵のファイルおよび楕円曲線暗号を利用した秘密鍵のファイルについてそれぞれ一つ指定
– SetEnvIf:クライアントからのリクエストを基に環境変数を定義

なるほど、中々いい感じ。

Apache virtualhostの書き方

/etc/httpd/conf/httpd.conf が大元となっており、/etc/httpd/conf.d/*.confを作成する。拡張子は.conf
個別のモジュールは /etc/httpd/conf.dや /etc/httpd/conf.modules.d に保存されている

<VitualHost *:80>
	ServerName any
	DocumentRoot /var/www/html
</VitualHost>
<VitualHost *:80>
	ServerName a.test
	DocumentRoot /var/www/html/site_a
</VitualHost>

– 文法テスト
apachectl configtest
– 再起動
systemctl restart httpd

/etc/httpd/conf/httpd.confを編集する方法もある

Listen 80
NameVirtualHost *:80

なるほど、設定項目を一つ一つ洗っていくしかないな。

ubuntu20.04にapache2とMod_wsgi

$ Mod_wsgi on
$ sudo apt install apache2 apache2-utils ssl-cert libapache2-mod-wsgi
$ sudo systemctl restart apache2
$ sudo mkdir -p /var/www/scripts
$ sudo vi /var/www/scripts/test_wsgi_script.py

def application(environ, start_response):
	status = '200 ok'
	html = '<html>\n' \
			'<body>\n' \
			'hello, mod_wsgi is working\n' \
			'</body>\n' \
			'</html>\n'
	response_header = [('Content-type', 'text/html')]
	start_response(status, response_header)
	return

$ sudo vi /etc/apache2/conf-available/mod-wsgi.conf

WSGIScriptAlias /test_wsgi /var/www/scripts/test_wsgi_script.py

$ sudo a2enconf mod-wsgi
$ sudo systemctl restart apache2
http://192.168.33.10/test_wsgi

[ubunut] apache2でサブドメインをnodeのexpressを動かしたい

### ローカル環境
挙動テスト用に簡単にインストールしてコードを書きます。
$ node –version
v14.17.6

$ npm install express

var express = require('express')
var app = express()
app.get('/', function(req, res){
	res.send('hello world')
})

app.listen(3000)

http://192.168.34.10:3000/

### vps
$ curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
$ sudo bash nodesource_setup.sh
$ sudo apt install nodejs
$ node -v
v14.18.1
$ cd /var/www/app
$ sudo npm install express
$ sudo touch app.js
$ sudo vi app.js // 上記と同じ

$ sudo vi /etc/apache2/sites-available/virtual.host.conf

<VirtualHost *:80>
DocumentRoot /var/www/app
ServerName ****-test.site
ServerAlias www.****-test.site
ProxyPass / http://***.**.***.**:3000/
ProxyPassReverse / http://***.**.***.**:3000/
# Other directives here

</VirtualHost>

Invalid command ‘ProxyPass’, perhaps misspe>

$ sudo a2enmod proxy_http
$ sudo systemctl restart apache2

$ node app.js

var express = require('express')
var app = express()
app.get('/', function(req, res){
	res.send('hello node')
})

app.listen(3000)

OK

$ sudo vi /etc/apache2/sites-available/virtual.host.conf

<VirtualHost *:80>
DocumentRoot /var/www/app
ServerName ****-test.site
ServerAlias www.sample-test.site
ProxyPass / http://***.**.**.***:3000
ProxyPassReverse / http://***.**.**.***:3000
# Other directives here

</VirtualHost>

<VirtualHost *:80>
DocumentRoot /var/www/node
ServerName ***.****-test.site
# Other directives here

</VirtualHost>

こうすることで、一つのディレクトリはnodeで動かし、サブドメインの方はapacheで動かすということもできる

OKKKKKKKKKKK
さ、ラズパイやろう