さくらのVPS 標準OSの環境構築(3) Webサーバーの設定

## 前回

[さくらのVPS 標準OSの環境構築(2) ファイアウォールとシステムの設定](http://qiita.com/takahiko-takei/items/ee233aac59976ce55f11)


## SFTPユーザーの作成

デプロイ時に使用する`SFTP`ユーザーを作成します。
ユーザーグループには`wheel`を指定します。
あわせて`SFTP`ユーザーのパスワードを設定します。

> `useradd SFTP_USER -G wheel && \`
> `passwd SFTP_USER`
> > `SFTP_USER`の部分を任意のユーザー名に差し替えてください。
> > 以降のログイン用ユーザーの表記は`SFTP_USER`に統一します。

```shell-session:実行結果
ユーザー SFTP_USER のパスワードを変更。
新しいパスワード: <- パスワードを入力
新しいパスワードを再入力してください: <- パスワードを再入力
passwd: 全ての認証トークンが正しく更新できました。
```

また、`SFTP`ユーザー用の公開鍵を作成します。
通常は新しく作りますが、今回は手順簡略のために`LOGIN_USER`の公開鍵`authorized_keys`を`SFTP_USER`の方へコピーし権限を変更して使用します。

> `cp /home/LOGIN_USER/.ssh/authorized_keys /home/SFTP_USER/.ssh/authorized_keys && \`
> `chmod 0600 /home/SFTP_USER/.ssh/authorized_keys && \`
> `chown SFTP_USER:SFTP_USER /home/SFTP_USER/.ssh/authorized_keys`


## Nginxのインストールと設定

`Nginx`は**リバースプロキシサーバー**として動作させ、その背後で`Apache`を動作させます。
画像などの静的コンテンツを`Nginx`で捌き、動的処理は`Apache`へ流すようにします。


### リポジトリの追加とインストール

手動で`yum`リポジトリを追加します。

> `vim /etc/yum.repo.d/nginx.repo`

```diff:/etc/yum.repo.d/nginx.repo
+ [nginx]
+ name=nginx repo
+ baseurl=http://nginx.org/packages/mainline/rhel/$releasever/$basearch/
+ gpgcheck=0
+ enabled=1
```

リポジトリが追加できたら、`yum`コマンドで`Nginx`をインストールします。

> `yum install nginx`

インストールできたら`Nginx`の自動実行の登録をします。

> `chkconfig nginx on`


### ファイルのオープン数と同時接続数の上限の設定とgzipの有効化

ファイルのオープン数と同時接続数の上限を引き上げ、レスポンスヘッダーのバージョン番号を非表示にします。
また、`gzip`を有効化し高速化を図ります。

> `vi /etc/nginx/nginx.conf`

```diff:/etc/nginx/nginx.conf
  :
+ worker_rlimit_nofile    10240;
  events {
-     worker_connections  1024;
+     worker_connections  10240;
  }

  http {
      :
-     #gzip                on;
+     gzip                on;
+     gzip_http_version   1.0;
+     gzip_types          text/xml
+                         text/css
+                         text/javascript
+                         application/xhtml+xml
+                         application/xml
+                         application/rss+xml
+                         application/atom_xml
+                         application/javascript
+                         application/json
+                         application/x-javascript
+                         application/x-httpd-php;
+     gzip_vary           on;
+     gzip_proxied        any;
+     gzip_comp_level     6;
+     gzip_disable        "MSIE [1-6]\.";
      :
+     server_tokens off;
  }
```


### リバースプロキシとして動作させる設定

`Nginx`をリバースプロキシとして動作させる設定を行います。
今回、複数ドメインのテストとして、通常の`(www.)example.com`とサブドメインの`sub.example.com`が設定されている前提で進めます。

> `vi /etc/nginx/conf.d/default.conf`

```diff:/etc/nginx/conf.d/default.conf
+ server {
+     listen      80;
+     server_name example.com www.example.com;
+ 
+     access_log  /var/log/nginx/example.com.access.log;
+     error_log   /var/log/nginx/example.com.error.log;
+ 
+     location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
+         root    /var/www/html/example.com/htdocs;
+         index   index.html;
+         ssi     on;
+     }
+ 
+     location / {
+         proxy_set_header Host               $host;
+         proxy_set_header X-Real-IP          $remote_addr;
+         proxy_set_header X-Forwarded-Host   $host;
+         proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
+ 
+         proxy_pass  http://127.0.0.1:8080;
+         proxy_redirect off;
+ 
+         proxy_connect_timeout 120;
+         proxy_read_timeout    120;
+         proxy_send_timeout    120;
+ 
+         proxy_max_temp_file_size 0;
+     }
+ }
+ 
+ server {
+     listen      80;
+     server_name sub.example.com;
+ 
+     access_log  /var/log/nginx/sub.example.com.access.log;
+     error_log   /var/log/nginx/sub.example.com.error.log;
+ 
+     location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
+         root    /var/www/html/sub.example.com/htdocs;
+         index   index.html;
+         ssi     on;
+     }
+ 
+     location / {
+         proxy_set_header Host               $host;
+         proxy_set_header X-Real-IP          $remote_addr;
+         proxy_set_header X-Forwarded-Host   $host;
+         proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
+ 
+         proxy_pass  http://127.0.0.1:8081;
+         proxy_redirect off;
+ 
+         proxy_connect_timeout 120;
+         proxy_read_timeout    120;
+         proxy_send_timeout    120;
+ 
+         proxy_max_temp_file_size 0;
+     }
+ }
```

保存したら、正常に起動出来るかどうか設定ファイルの構文チェックを行います。
`successful`が表示されていれば大丈夫です。

> `service nginx configtest`

```shell-session:実行結果
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```


## Apacheのインストールと設定

動的処理を担当する`Apache`をインストールします。
今回は`Apache`の`2.4`をインストールします。


### Software Collections(SCL)のインストール

CentOS6.xでは、標準の`yum`では`Apache2.4`をインストールすることはできません。
`SCL`とは、Red Hatが提供する最新アプリケーションの安定版のパッケージを提供し、かつ`yum`の旧パッケージと共存させてくれるパッケージです。

> `yum install centos-release-scl`
> `yum-config-manager --enable rhel-server-rhscl-7-rpms`


### インストール

SCLを用いて`Apache2.4`をインストールします。

> `yum install httpd24`
> `scl enable httpd24 bash`
> `chkconfig httpd24-httpd on`

`apxs`を使えるようにするため、`apr-devel.x86_64`もインストールします。

> `yum install apr-devel.x86_64`


### シンボリックリンクの作成

`Apache2.2`と同じように操作出来るようにシンボリックリンクを張ります。

> `ln -s /opt/rh/httpd24/root/etc/httpd /etc/httpd && \`
> `ln -s /opt/rh/httpd24/root/var/log/httpd /var/log/httpd && \`
> `ln -s /opt/rh/httpd24/root/var/www /var/www && \`
> `ln -s /opt/rh/httpd24/root/usr/bin/apxs /usr/bin/apxs && \`
> `ln -s /opt/rh/httpd24/root/usr/lib64/httpd /usr/lib64/httpd`


### ドキュメントルートの作成と権限の変更

ドメイン毎のドキュメントルートを作成し、SFTPで扱えるように権限を変更しておきます。
ドキュメントルートより上の階層に設定ファイルを設置したい場合もあると思うので、ドキュメントルートはドメイン別の中に`htdocs`で一階層下げてあります。

`(www.)example.com`用

> `mkdir -p /var/www/html/example.com/htdocs && \`
> `chmod 0755 /var/www/html/example.com && \`
> `chmod 0755 /var/www/html/example.com/htdocs && \`
> `chown SFTP_USER:SFTP_USER /var/www/html/example.com && \`
> `chown SFTP_USER:SFTP_USER /var/www/html/example.com/htdocs`

`sub.example.com`用

> `mkdir -p /var/www/html/sub.example.com/htdocs && \`
> `chmod 0755 /var/www/html/sub.example.com && \`
> `chmod 0755 /var/www/html/sub.example.com/htdocs && \`
> `chown SFTP_USER:SFTP_USER /var/www/html/sub.example.com && \`
> `chown SFTP_USER:SFTP_USER /var/www/html/sub.example.com/htdocs`


### mod_rpafモジュールのインストール

リバースプロキシからのアクセスをApache側で受け取る際に、リバースプロキシのアドレスが記録される対策として、mod_rpafモジュールをインストールします。
[GitHub](https://github.com/gnif/mod_rpaf)からソースコードをクローンし、`mod_rpaf.so`を生成しインストールします。

> `git clone https://github.com/gnif/mod_rpaf ~/mod_rpaf && \`
> `cd ~/mod_rpaf && \`
> `make && \`
> `make install`

インストールが完了したらGitHubからクローンしたソースファイルは削除します。

> `cd ~ && \`
> `rm -rf ~/mod_rpaf`


### 基本設定とバーチャルホスト設定

`Apache`の基本設定やバーチャルホストの設定を行います。

> `vi /etc/httpd/conf/httpd.conf`

Apacheを実行するユーザーとグループを`SFTP_USER`に設定します。

```diff:/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
- User apache
- Group apache
+ User SFTP_USER
+ Group SFTP_USER
```

レスポンスヘッダーのバージョン番号とサーバー署名を非表示にします。
下記を追記します。

```diff:/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
+ ServerTokens Prod
+ ServerSignature Off
```

`Nginx`の`default.conf`で指定したポート番号を指定します。
複数ポートを利用する場合、1行ずつ記述します。

```diff:/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
+ Listen 8080
+ Listen 8081
```

サーバー管理者のメールアドレス設定をします。

```diff:/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
+ ServerAdmin test@example.com
```

サーバー名を設定します。
ここはメインのドメインになります。

```diff:/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
+ ServerName example.com:8080
```

ドキュメントルートの設定をします。
オプションとしてブラウザでファイル一覧を表示させないように設定します。
あわせて、`.htaccess`ファイルでの設定の上書きが出来るように設定します。

```diff:/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
  :
- DocumentRoot "/opt/rh/httpd24/root/var/www/html"
+ DocumentRoot "/var/www/html"
  :
- <Directory "/opt/rh/httpd24/root/var/www/html">
+ <Directory "/var/www/html">
  :
```

```diff:/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
  :
  <Directory "/var/www/html">
      :
-     Options Indexes FollowSymLinks
+     Options FollowSymLinks SymLinksIfOwnerMatch
      :
-     AllowOverride None
+     AllowOverride All
      :
  </Directory>
  :
```

Indexファイルに`index.php`が使えるように設定します。
あわせて、`index.php`が優先されるように設定します。

```diff:/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
  :
  <IfModule dir_module>
-     DirectoryIndex index.html
+     DirectoryIndex index.php index.html
  </IfModule>
  :
```

`.php`ファイルが実行出来るように、拡張子を追加します。
また、`.shtml`は使用しないのでコメントアウトします。

```diff:/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
  :
  <IfModule mime_module>
      :
+     AddType application/x-httpd-php .php
      :
-     AddType text/html .shtml
-     AddOutputFilter INCLUDES .shtml
+     #AddType text/html .shtml
+     #AddOutputFilter INCLUDES .shtml
      :
  </IfModule>
  :
```

最後にバーチャルホストの設定を追記します。

```diff:/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
+ # Virtual Host
+ <VirtualHost 127.0.0.1:8080>
+     ServerName example.com
+     DocumentRoot /var/www/html/example.com/htdocs
+     ErrorLog /var/log/httpd/example.com.access.log
+ 
+     RPAF_Enable On
+     RPAF_SetHostName On
+     RPAF_ProxyIPs 127.0.0.1 10.0.0.1
+     RPAF_Header X-Forwarded-For
+     <Directory "/var/www/html/example.com/htdocs">
+         Require all granted
+     </Directory>
+ </VirtualHost>
+ 
+ <VirtualHost 127.0.0.1:8081>
+     ServerName sub.example.com
+     DocumentRoot /var/www/html/sub.example.com/htdocs
+     ErrorLog /var/log/httpd/sub.example.com.access.log
+ 
+     RPAF_Enable On
+     RPAF_SetHostName On
+     RPAF_ProxyIPs 127.0.0.1 10.0.0.1
+     RPAF_Header X-Forwarded-For
+     <Directory "/var/www/html/sub.example.com/htdocs">
+         Require all granted
+     </Directory>
+ </VirtualHost>
```


### mod_rpafモジュールを読み込む設定

基本モジュール用設定ファイル`00-base.conf`を編集します。

> `vi /etc/httpd/conf.modules.d/00-base.conf`

下記を追記して、`mod_rpaf.so`が読み込まれるように設定します。

```diff:/opt/rh/httpd24/root/etc/httpd/conf.modules.d/00-base.conf
+ LoadModule rpaf_module modules/mod_rpaf.so
```


### テストページの削除(バックアップ)

このままだと`404 NotFound`などになった際にApacheのテストページが表示されてしまうので、ファイルを削除するかファイル名を変えておきます。

> `cd /opt/rh/httpd24/root/usr/share/httpd/noindex/`
> `mv index.html index.html.bak`


### 設定の構文チェック

正常に起動出来るかどうか、設定の構文チェックを行います。

> `service httpd24-httpd configtest`

```shell-session:実行結果
Syntax OK
```

`Syntax OK`が表示されていれば大丈夫です。


### NginxとApacheの起動

全ての設定が完了したら`Nginx`と`Apache`を起動します。

> `service nginx start && \`
> `service httpd24-httpd start`

```shell-session:実行結果
nginx を起動中:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
```


### LogWatchの設定の修正

`Apache`は標準で監視対象ですが`Nginx`は監視されません。
`Nginx`のログが含まれるように設定を行います。

`Apache`用の設定ファイルをコピーして編集します。

> `cp /usr/share/logwatch/scripts/services/http /etc/logwatch/scripts/services/nginx && \`
> `cp /usr/share/logwatch/default.conf/services/http.conf /etc/logwatch/conf/services/nginx.conf && \`
> `cp /usr/share/logwatch/default.conf/logfiles/http.conf /etc/logwatch/conf/logfiles/nginx.conf`

監視サービスの設定を行います。

> `vi /etc/logwatch/conf/services/nginx.conf`

```diff:/etc/logwatch/conf/services/nginx.conf
  :
- Title = "httpd"
+ Title = "nginx"
  :
- LogFile = http
+ LogFile = nginx
  :
```

監視ログファイルの設定を行います。

> `vi /etc/logwatch/conf/logfiles/nginx.conf`

```diff:/etc/logwatch/conf/logfiles/nginx.conf
  :
- #LogFile = httpd/*access_log
- #LogFile = apache/*access.log.1
- #LogFile = apache/*access.log
- #LogFile = apache2/*access.log.1
- #LogFile = apache2/*access.log
- #LogFile = apache2/*access_log
- #LogFile = apache-ssl/*access.log.1
- #LogFile = apache-ssl/*access.log
+ LogFile = nginx/*access.log
  :
- #Archive = archiv/httpd/*access_log.*
- #Archive = httpd/*access_log.*
- #Archive = apache/*access.log.*.gz
- #Archive = apache2/*access.log.*.gz
- #Archive = apache2/*access_log.*.gz
- #Archive = apache-ssl/*access.log.*.gz
+ Archive = nginx/*access.log.*.gz
  :
```


## SSHの設定の修正

ドキュメントルートなども作られたため、`SFTP`を利用できるように`SSH`の設定を修正します。

> `vi /etc/ssh/sshd_config`

`Subsystem sftp`を指定します。

```diff:/etc/ssh/sshd_config
  # override default of no subsystems
- #Subsystem      sftp    /usr/libexec/openssh/sftp-server
+ Subsystem       sftp    internal-sftp
```

`Match User`を指定します。
`ChrootDirectory`は、`Apache`のドキュメントルートを指定しておきます。

```diff:/etc/ssh/sshd_config
+ Match User SFTP_USER
+     ChrootDirectory /var/www/html
+     ForceCommand internal-sftp
```

設定を保存したら、`sshd`を再起動します。

> `service sshd restart`


## 次回

[さくらのVPS 標準OSの環境構築(4) MariaDBとPHPのセットアップ](http://qiita.com/takahiko-takei/items/bcbfc8195188a3bce6d7)