Nginxで単一および複数のWordPressサイト設定を構成する方法
序章
WordPressは、今日インターネットで使用されている最も人気のあるCMS(コンテンツ管理システム)です。 WordPressサイトはApacheやNGINXなどのHTTPサーバーを使用して提供できますが、ApacheはWebサイトを提供するための優れたオプションですが、スケーラブルなイベント駆動型アーキテクチャ、低リソース、静的ファイルの配信の向上により、多くのサイトがNGINXに移行しました。 このチュートリアルでは、マルチサイト構成、書き換えルール、繰り返し構成を適用するための.confファイルの使用など、さまざまなタイプのWordPressインストール用にNGINXを構成する方法を学習します。
要件
このガイドでは、ファイルをインストールおよび編集するためにsudoが必要になります。 サーバーの初期設定を完了したと思います。
MySQL、PHP、NGINXをインストールする必要があります。 これらのガイドに従って、UbuntuまたはDebianにLEMPをインストールできます。
サーバーブロックが異なることに注意してください。このチュートリアルでは、PHP-FPMにUNIXソケットを使用させています。
基本的なNGINX最適化
NGINXワーカーのプロセスと接続を調整する
多くの場合、NGINXワーカーの数をプロセッサの数と同じに設定することをお勧めします。プロセッサの数は、次を使用して決定できます。
cat /proc/cpuinfo | grep processor
メインのNGINX構成ファイルを開きます。
sudo nano /etc/nginx/nginx.conf
システムの仕様に応じて、ワーカーの数を増減します。
worker_processes 1;
NGINXは、ワーカーが一度に維持できる接続の数を制限します。Webサイトに多くの訪問者がいる場合は、接続の制限を増やすことができます。 理論的には、接続の最大数=ワーカー*制限。
worker_connections 768;
Gzipを有効にする
ファイルをGzipで圧縮して、WordPressを高速化できます。ユーザーが要求するデータサイズが小さいほど、応答が速くなります。 CSSファイルとHTMLファイルについて考えてみてください。これらには、多くの類似した文字列、繰り返されるテキスト、空白があります。 Gzipは、DEFLATEと呼ばれるアルゴリズムを使用して、同じ文字列の以前の場所にリンクすることで重複する文字列を削除し、はるかに小さいファイルを作成します。 Gzipセクションを見つけて有効にします。
gzip on;
gzip_types text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
保存して終了します。
NGINX.confファイルの作成
複数のWordPressWebサイトをホストしている可能性があるため、各サーバーブロックに同じ構成を何度も書き込む代わりに、サーバーブロックからロードできるいくつかの.confファイルを作成します。
次の手順では、構成を保持する3つのファイルを作成します。
- common.conf:すべてのサイトに適用可能な構成。
- wordpress.conf:すべてのWordPressサイトに適用可能な構成。
- multisite.conf:サブディレクトリを持つWordPressマルチサイトの特別な構成。
「グローバル」というディレクトリにすべてのファイルを作成しますが、最初に上記のディレクトリを作成する必要があります。
sudo mkdir /etc/nginx/global
簡単にするために、 / etc / nginx /globalを現在のディレクトリとして設定します。
cd /etc/nginx/global
common.confファイル
あらゆる種類のWebサイトに適用できる最初の.confファイルを作成しましょう。
sudo nano common.conf
これにより、空のファイルが開き、次の構成をコピーします。
# Global configuration file.
# ESSENTIAL : Configure Nginx Listening Port
listen 80;
# ESSENTIAL : Default file to serve. If the first file isn't found,
index index.php index.html index.htm;
# ESSENTIAL : no favicon logs
location = /favicon.ico {
log_not_found off;
access_log off;
}
# ESSENTIAL : robots.txt
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# ESSENTIAL : Configure 404 Pages
error_page 404 /404.html;
# ESSENTIAL : Configure 50x Pages
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/www;
}
# SECURITY : Deny all attempts to access hidden files .abcde
location ~ /\. {
deny all;
}
# PERFORMANCE : Set expires headers for static files and turn off logging.
location ~* ^.+\.(js|css|swf|xml|txt|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
access_log off; log_not_found off; expires 30d;
}
listen 80;
は、サーバーのリスニングポートを指定します。
index index.php...
は、提供するデフォルトのファイル(WordPress index.php)を指定します。 最初のファイルが見つからない場合は、2番目のファイルが使用されます。 HTMLサイトがあるかもしれません。そのため、index.htmlとindex.htm;を含めています。
location = /robots.txt {allow all;}
は、robots.txtへのアクセスを許可します。robots.txtに別のディレクトリを指定する場合は、エイリアスを追加できます。
location /robots.txt {
alias /var/www/example.com/public/sample_robots.txt;
}
location ~ /\. {deny all;}
Linuxオペレーティングシステムでは、隠しファイルは「。」で始まります。セキュリティ上の理由から、.htaccessなどの一部の隠しファイルへのアクセスはブロックする必要があります。
location ~* ^.+\.(js|css|swf...
期限切れヘッダーは、サーバーに特定のファイルを要求するか、ブラウザーのキャッシュから特定のファイルを取得するかをブラウザーに通知します。 有効期限が30日になると、画像などの静的ファイルを30日間保存するようにブラウザに指示します。
保存して終了。
wordpress.confファイル
すべてのWordPressサイトに適用できる.confファイルを作成しましょう。
sudo nano wordpress.conf
これにより、空のファイルが開き、次の構成をコピーします。
# WORDPRESS : Rewrite rules, sends everything through index.php and keeps the appended query string intact
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
# SECURITY : Deny all attempts to access PHP Files in the uploads directory
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
# REQUIREMENTS : Enable PHP Support
location ~ \.php$ {
# SECURITY : Zero day Exploit Protection
try_files $uri =404;
# ENABLE : Enable PHP, listen fpm sock
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
# PLUGINS : Enable Rewrite Rules for Yoast SEO SiteMap
rewrite ^/sitemap_index\.xml$ /index.php?sitemap=1 last;
rewrite ^/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
#Yeah! you did it.
try_files $uri $uri/ /index.php?q=$uri&$args
WordPressでカスタムパーマリンク構造を選択できるようにするために必要な書き換えルール。
location ~* /(?:uploads|files)/.*\.php$ {deny all;}
これにより、悪意のあるコードがWordPressメディアディレクトリからアップロードおよび実行されるのを防ぐことができます。
location ~ \.php$ {...}
WordPressはphpサイトであるため、phpスクリプトをPHP5に渡す方法をNGINXに指示する必要があります。
try_files $uri =404;
これはセキュリティルールです。決定されたphpファイルを提供するか、404エラーが発生するだけです。
より多くのルール:たとえば、すべてのインストールでカスタムルールを必要とする同じWPプラグインを使用する場合は、この.confファイルにさらにルールを追加できます。 私はすべてのWebサイトでYoastSEOを使用しているため、ここで必要な書き換えルールを追加しています。このようにして、サーバーブロックごとに同じ書き換えルールをコピーする必要はありません。
multisite.confファイル
「醜い」パーマリンクを処理できるためURLの書き換えが不要な単一サイトのWordPressとは異なり、MultiSiteのインストールでは、サブサイトのURLをフォーマットするためのカスタム書き換えルールが必要です。 マルチサイトのWordPressインストールに適用できる.confファイルを作成しましょう。
sudo nano multisite.conf
これにより、空のファイルが開き、必要な書き換えルールがコピーされます。
# Rewrite rules for WordPress Multi-site.
if (!-e $request_filename) {
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last;
}
保存して終了します。
小さなメモ
現在の作業ディレクトリは/etc / nginx / global です。変更する場合は、次のように入力できます。
cd /desired_directory
サーバーブロックの作成
最初のサーバーブロックを作成するときが来ました。 .confファイルにはすでにすべてが構成されているため、デフォルトのサーバーブロックファイルを複製する必要はありません。 デフォルトのサーバーブロックを無効にしましょう。
sudo rm /etc/nginx/sites-enabled/default
そして、サーバーブロックファイルを作成します。
sudo nano /etc/nginx/sites-available/demo
これにより、空のファイルが開きます。達成したい内容に応じて、次の構成をコピーします。
簡単なWordPressのインストール
このドメインwww.demo.comでWordPressサイトを構成するとします。 まず、ルールを配置するサーバーブロックserver {...}
を作成する必要があります。 特定のURLに使用するサーバーブロックを指定する必要があります。 common.conf & wordpress.conf 最後に、サーバー内のWordPressインストールの場所をNGINXに通知します。
server {
# URL: Correct way to redirect URL's
server_name demo.com;
rewrite ^/(.*)$ http://www.demo.com/$1 permanent;
}
server {
server_name www.demo.com;
root /home/demouser/sitedir;
access_log /var/log/nginx/www.demo.com.access.log;
error_log /var/log/nginx/www.demo.com.error.log;
include global/common.conf;
include global/wordpress.conf;
}
ニーズに合わせて、次のデータを変更することを忘れないでください。
- server_name :特定のURLに使用されるサーバーブロックを決定します。
- root :サイトが保存されているパス。
- アクセスログとエラーログ :ログのパスを設定します
サーバーブロックが2つあることがわかります。これは、 www.demo.com & demo.com 異なるURLです。 おそらく、Google、Bing、ユーザーなどが必要なURLを選択するようにしたいでしょう。この場合、私のWebサイトを www.demo.com にしたいので、パーマネントを構成しました。 をdemo.comからwww.demo.comにリダイレクトします。 複数のドメインを指定することもできます。
server {
# URL: Correct way to redirect URL's
server_name demo.com sub.demo.com example.com;
サブディレクトリを持つマルチサイト
サブディレクトリを使用したマルチサイトインストールが必要な場合は、multisite.confに保存されている書き換えルールを含める必要があります。
# URL: add a permanent redirect if required.
server {
server_name www.demo1.com;
root /home/demouser/sitedir1;
access_log /var/log/nginx/www.demo1.com.access.log;
error_log /var/log/nginx/www.demo1.com.error.log;
include global/common.conf;
include global/wordpress.conf;
include global/multisite.conf;
}
サブドメインを持つマルチサイト
サブドメインを使用したマルチサイトインストールが必要な場合は、ワイルドカードを使用してドメインをリッスンするようにこのサーバーブロックを構成する必要があります。
server {
server_name *.demo2.com;
root /home/demouser/sitedir2;
access_log /var/log/nginx/demo2.com.access.log;
error_log /var/log/nginx/demo2.com.error.log;
include global/common.conf;
include global/wordpress.conf;
}
HTMLおよびその他のWebサイト
単純なhtmlWebサイトまたは他のWebアプリケーションをホストする場合は、カスタムルールを指定するか、さらに.confファイルを作成して、サーバーブロックに含める必要があります。
# URL: add a permanent redirect if required.
server {
server_name www.demo3.com;
root /home/demouser/sitedir3;
access_log /var/log/nginx/demo3.com.access.log;
error_log /var/log/nginx/demo3.com.error.log;
# custom rules
}
保存して終了することを忘れないでください。
サーバーブロックファイルの有効化
最後のステップは、sites-availableディレクトリとsites-enabledディレクトリの間にシンボリックリンクを作成して、ホストをアクティブ化することです。
sudo ln -s /etc/nginx/sites-available/demo /etc/nginx/sites-enabled/demo
構成に多くの変更を加えました。 NGINXをリロードし、変更を表示します。
sudo service nginx reload;
ファイナルノート
追加の仮想ホストを作成するには、上記のプロセスを繰り返すだけで、毎回適切な新しいドメイン名で新しいドキュメントルートを設定するように注意してください。 複数のサーバーブロックを1つのファイルにまとめることもできます。
server {
server_name demo.com;
rewrite ^/(.*)$ http://www.demo.com/$1 permanent;
}
server {
server_name www.demo.com;
root /home/demouser/sitedir;
access_log /var/log/nginx/www.demo.com.access.log;
error_log /var/log/nginx/www.demo.com.error.log;
include global/common.conf;
include global/wordpress.conf;
}
server {
server_name www.demo1.com;
root /home/demouser/sitedir1;
access_log /var/log/nginx/www.demo1.com.access.log;
error_log /var/log/nginx/www.demo1.com.error.log;
include global/common.conf;
include global/wordpress.conf;
include global/multisite.conf;
}
# More server blocks....