CentOS 6 + Plesk 11におけるNginxの設定カスタマイズ

先日、初めてPlesk環境のサーバーの設定変更を行う機会があったので、その手順をいくつかまとめておきます。
OSはCentOS 6、Pleskのバージョンは11.0.9です。
今回はNginx編です。

isdPlesk 11のWebサーバー構成

Plesk 11におけるWebサーバーの構成は、EX-CLOUDの以下のページがわかりやすいです。

・ウェブサーバの構成【Plesk11】
https://ex-cloud.jp/support/question/g-656

フロントエンドでNginx、バックエンドでApacheが稼働しています。
使用ポートは以下のとおりです。

HTTP Nginx TCP/80 → Apache TCP/7080
HTTPS Nginx TCP/443 → Apache TCP/7081

isdNginxの設定変更

Nginxのコンフィグファイル群はPleskに管理されているので、基本的には直接編集してはいけません。
編集しても、Plesk上でWebサービスに関する何らかの設定を行いリコンフィグが発生した場合は、元に戻されてしまいます。

ただし、カスタマイズする手段はいくつか用意されています。
グローバル設定の変更とバーチャルホスト毎の設定変更で方法が異なります。

グローバル設定の変更

グローバル設定を変更する場合は、Pleskがないサーバーと同様、/etc/nginx/nginx.conf を編集します。
このファイルはPleskに上書きされないようです。

必要に応じて、KeepAlive、gzip圧縮転送設定などを行います。

 # vi /etc/nginx/nginx.conf

...
    #keepalive_timeout  0;
    #keepalive_timeout  65;
    keepalive_timeout  3;
    keepalive_requests  300;
    #tcp_nodelay        on;

    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    gzip_types text/css application/x-javascript;
...

または、/etc/nginx/conf.d/*.conf がIncludeされているので、そこに新しいコンフィグファイルを生成して設定を記述するという方法もあります。
すでに、

aa500_psa_tweaks.conf
zz010_psa_nginx.conf

というファイルが存在しているので、設定が後勝ちになるよう、zzz010_psa_nginx.conf などのファイルを作成するとよいでしょう。

バーチャルホスト毎の設定変更

バーチャルホスト毎の設定変更については、Pleskの製作元Parallelsのサポートサイトにヒントがありました。

・[Plesk] CVE-2014-3566:SSL 3.0 フォールバックを悪用する POODLE 攻撃
http://kb.sp.parallels.com/jp/123160″>http://kb.sp.parallels.com/jp/123160

Pleskが自動生成するバーチャルホストのコンフィグについては、nginxDomainVirtualHost.phpというテンプレートが用意されているので、このデフォルトファイルを複製してから編集します。

 # mkdir -p /usr/local/psa/admin/conf/templates/custom/domain/
 # cp /usr/local/psa/admin/conf/templates/default/domain/nginxDomainVirtualHost.php \
  /usr/local/psa/admin/conf/templates/custom/domain/

例えば、SSLv3の脆弱性対策であれば、以下のように編集します。

 # vi /usr/local/psa/admin/conf/templates/custom/domain/nginxDomainVirtualHost.php

-- 変更前
    ssl_protocols               SSLv2 SSLv3 TLSv1;
--

-- 変更後
    ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
--

テンプレートはPHP形式なので、if文などをうまく使えば、バーチャルホスト毎に設定の違いを出すこともできます。

例えば、特定のバーチャルホストのみalias設定を追加したければ、以下のようにif文でコンフィグファイルの有無で分岐して、ファイルが存在すればinlcludeする、という方法があります。

 # vi /usr/local/psa/admin/conf/templates/custom/domain/nginxDomainVirtualHost.php

<?php if (file_exists($VAR->domain->physicalHosting->vhostDir . '/conf/alias.conf')): ?>
    include <?php echo $VAR->domain->physicalHosting->vhostDir;?>/conf/alias.conf;
<?php endif ?>

 # vi /var/www/vhosts/<特定のVirtualHost>/conf/alias.conf

alias      <設定したいエイリアスパス>;

また、なぜかバックエンドのApacheへのproxy_pass設定がIPアドレス(http://127.0.0.1:7080)となっています。
これをVirtualHost名でバックエンドに渡すには以下のようになります。

 # vi /usr/local/psa/admin/conf/templates/custom/domain/nginxDomainVirtualHost.php

-- 変更前
    location / { # IPv6 isn't supported in proxy_pass yet.
<?php if ($OPT['ssl']): ?>
        proxy_pass https://<?php echo ($OPT['ipAddress']->isIpV6() ? '127.0.0.1': $OPT['ipAddress']->escapedAddress) ?>:<?php echo $OPT['backendPort'] ?>;
<?php else: ?>
        proxy_pass http://<?php echo ($OPT['ipAddress']->isIpV6() ? '127.0.0.1': $OPT['ipAddress']->escapedAddress) ?>:<?php echo $OPT['backendPort'] ?>;
<?php endif ?>
--

-- 変更後
    location / { # IPv6 isn't supported in proxy_pass yet.
<?php if ($OPT['ssl']): ?>
        proxy_pass https://<?php echo $VAR->domain->asciiName ?>: $OPT['ipAddress']->escapedAddress) ?>:<?php echo $OPT['backendPort'] ?>;
<?php else: ?>
        proxy_pass http://<?php echo $VAR->domain->asciiName ?>: $OPT['ipAddress']->escapedAddress) ?>:<?php echo $OPT['backendPort'] ?>;
<?php endif ?>
--

テンプレートの編集後は、PleskにApacheとNginxを再構成させて、コンフィグファイルを生成します。

 # /usr/local/psa/admin/bin/httpdmng --reconfigure-all

Nginxをreloadする前に、生成されたバーチャルホストのコンフィグファイル /var/www/vhosts/<特定のVirtualHost>/conf/last_nginx.conf を確認します。
また、文法チェックも行うとよいでしょう。

 # view /var/www/vhosts/<特定のVirtualHost>/conf/last_nginx.conf
 # nginx -t

問題なければ、Nginxをreloadして設定変更を反映し、動作確認を行います。

 # /etc/init.d/nginx reload

isdまとめ

CentOS 6 + Plesk 11におけるNginxの設定カスタマイズ方法についてまとめました。
バーチャルホストのテンプレートを編集することで、自由に設定変更が可能なことがわかりました。

(関連記事)
・CentOS 6 + Plesk 11におけるApacheの設定カスタマイズ
https://inaba-serverdesign.jp/blog/20150216/centos6_plesk11_apache.html

・CentOS 6 + Plesk 11における各種設定カスタマイズ
https://inaba-serverdesign.jp/blog/20150217/centos6_plesk11_customize.html

Follow me!