ネット上のアクセスボリュームをUPさせ効率の良い集客をご提案します。

カテゴリー「Linux Tips」の記事

Apache最大同時接続数の設定考察について

 / Linux Tips, テクニカル, トピックス


Apache Webサーバは、接続に関するプロセスの作り方を3種類のモジュールタイプで提供している。

それはprefork/worker/eventがその3種類に該当し、いずれかのモジュールタイプを選択して利用することになる。デフォルトはpreforkである。

preforkは単純に1セッションづつ扱うhttpdプロセスを決められた最大数(maxclients)まで状況に応じて生成してゆく方式である。

なぜ、このpreforkをデフォルトにしているかだが、様々なサーバ環境構築で万人が使って失敗しにくいというのが本音だろう。パフォーマンスが高いのは間違いなくworker,eventタイプである。

worker,eventはapache連携する他のサーバとの兼ね合いがあるためスレッドの生成パターンが相性良くないと落ちてしまう原因を作る
その意味では玄人なモジュールタイプである。fastcgiでPHPを使う場合(php-fpm)使う際はworker、eventを使うがこちらはapacheと相性が良いのは間違いない。http2に切り替えているサイトも多いのでmod_phpからfastcgiで使うパターンが最近ではかなり増えているようだ。


preforkモードでのApacheセッション設定

MacClients及びServerLimitの設定値 計算方法

昔から色々な説が飛び交っているけれど、私は概ね次のように考えて設計している。


MaxClients = サーバ合計メモリ * (80%〜70%) / httpdプロセスの最大メモリ使用量


httpdプロセス最大メモリ容量 = (親httpdメモリ容量 + 子httpdの平均物理メモリ使用量 ✕ MaxClients)ー httpd子共有プロセスメモリ使用量 + その他WEB連携サーバ(MySQLサーバ,FastCGIプロセス等)

  • ※httpdプロセスで使うメモリ容量はそのサーバマシンで他に何(プロセス)が動いているかでメモリ考慮割合は異なるがおおよそサーバ全体メモリが5GB以下なら最初の運用は70%以下の容量に抑えて計算するのが安全と思う。後はログや統計を見ながら少しづつアップさせできるだけSAWPが頻繁に起きない程度にしておくことをお勧めする。
    他のプロセスが極めて使用率が低いなら多少増やしてSWAP対応もありだが、SWAPも使い出すと止まらなくなるためリクエストに対するレスポンスWait時間が長くなり遅くなる。落ちる場合も当然ある。
  • ※子httpdの平均物理メモリ使用量、親httpdのメモリ使用量、その他のメモリ使用量はtopコマンドのRESをチェックし計算する。子httpdプロセス共有は(SHR)で計算する。
  • ※親プロセスから子プロセスをforkすると、子プロセスが親プロセスのメモリ空間をshareします。すなわちそのshare分(SHR)を引く必要があります。
  • ※パラメータで ServerLimit > MaxClients になるように設定する。
  • ※セッションの終了とセッションの開始はTCPのリサイクルに要する時間、ハンドシェークのステータス変化に遅延が生じるため「ServerLimit > MaxClients」のようにしないとセッションの要求と需要が噛み合って来ない。適正値は実験で求めるとよい。サイト毎のサーバやネットワーク、コンテンツの性格、ユーザの傾向にも依存するため余裕をもって値を設計するとよいだろう。

測定の際に使うtopコマンドの使い方

下記はapacheユーザだけ特定してtopコマンドでプロセスを表示する 方法です。当然httpdプロセスのみ表示されるためメモリの使用量が観測しやすくなります。

HTTP2対応 CaddyWEBサーバで仮想サーバ作る場合のやり方

 / Linux Tips, テクニカル, トピックス


caddy Webサーバで仮想サーバを作る場合は、/etc/caddy/配下にvhostsフォルダを作成し大元の設定ファイルをコピーしてドメインに該当する箇所とSSLの在り処、Pushする箇所のみ書き換えれば良い。
仮想サーバ設定はimportのある最下行だけ削除しましょう。仮想サーバ設定ファイルは名前は何でも良い。拡張子が.confであるならすべてそのフォルダーにあるファイルを読み込んでくれる。 仮想サーバは大元設定ファイル(Caddifile)の一番最下行にあるimport文で仮想ホストのインクルードを行う。ワイルドカードが使えるのでこの一行でvhostsに配置する仮想サーバ設定は終わりだ。 今回はWEBメールのRoundcubeとPhpMyadminを以下の設定を修正してやってみたがあっさり動いた。caddyは設定が簡単でいいね。

ssh.com形式(SECSH)をOpenSSH形式へ鍵の形式変換

 / Linux Tips, トピックス, ノウハウ


ssh.com形式(SECSH)をOpenSSH形式へ形式変換を行います。Linodeで使っていると接続元端末のソフトによってはssh.comの形式で使えません。「Invalid Format Error」が画面に表示されます。 大変不便です。ということで変換を行う方法を備忘録として残します。

Linodeで生成された秘密鍵を保存すると以下のようになっています。SECSH形式というものです。かつてはこちらが本家本元のSSHの形式でしたがOpenSSHの方が利用者数が増え今では標準が塗り替えられてしまいました。
エディターでオープンすると鍵の始まりと終わりが通常普段使っているOpenSSHの形式と違うものであることがわかります。 下記に相互の変換方法を記す。  

SECSH → OpenSSH

 

OpenSSH → SECSH

最後に変換したlinode_new.keyを使って見ると問題なく接続できました。

FTP接続と開発者向けユーザディレクトリの設定について(セキュアにするには)

 / Linux Tips, トピックス


WEBサーバを設置して、複数の業者にコンテンツを任せようとするとついてまわるのはアクセス権の問題が圧倒的に多いのではないかと思う。WEBサーバはよく使われるのはApache Webサーバだが、そうするとフォルダーやファイルに対してのアクセス権限はデフォルトで行くならapacheユーザ、apacheグループになるだろう。


つまりコンテンツレベルのディレクトリ、ファイルアクセスはWEBサーバの設定に設置したUser,Groupディレクティブが使用されるわけです。WORDPRESSやフレームワーク、MovableType等様々ありますがこれらのプログラムでできているコンテンツはこのディレクティブの設定で動作します。


つまりCMSのようなブラウザ画面で更新ならapacheユーザ、グループでアクセスすることになります。FTPでアクセスする場合は、apacheユーザ、グループでアクセスすることは無いでしょう。それは危険だからです。


話は長くなりましたが、そうするとFTPで直接アクセスして編集するとなると何が怖いかと言えば、システムを探索されてハッキングされることかもしれません。

chrootすれば、ユーザがログインしたフォルダーより上の階層ディレクトリへ行くことができません。
しかし、欠点があります。WEBサーバのドキュメントルートは大体は/var/wwwの直下にあります。
ユーザは/home/user01のような感じのフォルダーへログインすることでしょう。離れたフォルダーへアクセスするにはソフトリンク(ln -s 大本 リンク先)を使うのが鉄則ですが残念ながらchrootするとソフトリンクしたフォルダーへはアクセスができません。
通常ならここで諦めて/etc/vsftpd/chroot_listにchrootを無効化するユーザを書くことになるかもしれません。


リファレンス:Vsftpdのインストール、ftps、chroot設定など大変参考になるサイト

しかし、chrootを外してセキュリティ設定を緩めるのは嫌ですよね!
そこでchrootでもソフトリンクの如くフォルダー間を接続する方法があります。それはmountコマンドの「–bind」オプションです。
下記のような感じでフォルダーをマウントすればchroot環境でも利用が可能です。



これが済んだら次に考えなければ行けないのがファイルのパーミッションです。大抵はapacheユーザ、グループでドキュメントルートは設定されているはずです。


コンテンツに自由にアクセスするにはapacheグループにユーザを追加します。しかし、WORDPRESSのようなCMSやフレームワークはフォルダー階層構造が複雑です。
グループユーザに対しchmodで775や664の設定をくまなく隅々まで実施するのは骨が折れる作業です。


でもこれを簡単に行う方法があります。findとxargsをパイプで組み合わせれば簡単にディレクトリとファイルのパーミッションを再帰的に探索して
設定してくれます。たまに連続置換などでお世話になるコマンドかと思いますがまさにそれを使います。


apacheグループに開発ユーザを追加した場合の理想の権限

  • ファイルの場合:664
  • ディレクトリの場合:775

以下のコマンドをコンテンツのフォルダーへ移動して実施すると一括でパーミッションを変更することができます。非常に楽ちんですね!

ファイルの場合のドキュメントルート配下権限一括置換)

ディレクトリの場合のドキュメントルート配下権限一括置換)

※以上でフォルダーの権限は置換されます。

Caddy 高速WEB サーバ(http2 quic対応) on CentOS7

 / Linux Tips, Wordpress, テクニカル, トピックス, ノウハウ


http2対応の高速サーバを今回扱ってみる。このサーバはGo言語で開発されたWEBサーバです。導入にはコンパイルから行う場合はGo言語開発環境が必要ですが
バイナリーから入れるのであれば、特にGo言語開発環境は必要ありません。導入方法は幾つかやり方があります。一番簡なのはCentOS7の場合ならepelレポジトリー
から導入するのが簡単です。今回はこのサーバを理解するため少し手間がかかるバイナリーダウンロードから導入する方法を紹介します。
尚、今回は既存のサイトをcaddyで設置するやり方ですが、新規サイトであればSSL接続の鍵の取得などを無償のLet’s Encryptから自動取得してくれます。

バイナリーパッケージのダウンロード

バイナリーパッケージを配置し実行環境を作る。

caddy起動をsystemdに登録する

caddyサーバの15,16行目の実行ユーザとグループを指定します。
22行目を編集します。-quic追加とcaddyプロセスログファイルの出力先を変更します。

caddy設定ファイルを作成する

www.testserv.netでhttps接続のListenや設定情報は以下のように行います。
予め、selinuxはOFFにしておきましょう。caddyは比較的デバッグ情報が寡黙の傾向にあるのでくだらないことで悩まず最初は「setenforce 0」で無効。 きちんとWEBサーバとして動いたら、「setenforce 1」で影響がないか確認すると良いと思います。 尚、この設定でQualisのSSLテスト評価で「A+」取得できました。

php-fpmの設定

caddyを起動する

トラブルシューティング

うまくcaddyが起動できていない場合は、おおよそlogのディレクトリパーミッション、SSL鍵のディレクトリパーミッションが原因のケースが多い。 あるいはログファイルなら予め0サイズのログファイル名をtouchコマンドで作っておくことをお勧めする。 「journalctl -xe」を実行して調べてみると良い。また、firewalldやiptablesでportが開放されているかチェックし、開放されてなければ該当portをオープンにしましょう。

※まだまだ発展途上なところがありますが、個人的には大変気に入りました。設定がシンプルで少ない設定で動かせるところが良いと思います。当社でもApache2.4からこのサーバに切り替えて使っています。

TOPへ戻る