NginxとはオープンソースのWebサーバー
Apacheよりも速い
nginx -V
nginx version: nginx/1.20.1 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.1.1g FIPS 21 Apr 2020 TLS SNI support enabled configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-compat --with-debug --with-file-aio --with-google_perftools_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'
bash: nginx: コマンドが見つかりません
のように表示される場合は、nginxがインストールされていない
nginxをインストールする場合、まずはリポジトリというのを設定する必要がある
ls -l /etc/yum.repos.d | grep 'nginx'
上記のコマンドで結果が表示されたらnginx用のリポジトリが既に設定されている
何も表示されない場合はnginx用のリポジトリがまだ存在していない
vi /etc/yum.repos.d/nginx.repo
/etc/yum.repos.dディレクトリに
nginx.repoというファイルを新規作成
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1
nginx.repoファイルに上記の内容を書き込む
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
nginx.repoファイルに上記の内容を書き込む
yum info nginx
上記のコマンドを実行し、nginxのパッケージ情報が表示されればOK
yum install nginx -y
nginxをインストールする
systemctl enable nginx systemctl start nginx
nginxのサービスを自動起動に設定
nginxのサービスを起動
/usr/share/nginx/html/がデフォルトのドキュメントルートとなっている
ブラウザで
http://IPアドレス
のようなURLへアクセスすると
/usr/share/nginx/html/ディレクトリの
index.htmlファイルが表示される
/etc/nginx/nginx.confがnginxの設定ファイル本体
nginx.confの中に
include /etc/nginx/conf.d/*.conf;
という記述がある
これの効果により、/etc/nginx/conf.d/ディレクトリに.confの拡張子でファイルを作成すれば、nginxの設定を追加できる
一般的に、1つのサイトに対して、1つの.confを作成する
vi /etc/nginx/conf.d/xxx.conf
xxx.confのようなファイルを新規作成
この中にnginx用の設定を書いていく
example.comというサイトを作ったら、example.com.confというファイルを作り、そこに設定を書く
aaa.comというサイトを作ったら、aaa.com.confというファイルを作り、そこに設定を書く
ファイル名は任意の文字列でOKだが、ドメイン名と一致させておくと分かりやすい
server {
listen 80;
server_name example.com;
root /home/user1/xxx;
index index.html;
}
ブラウザでexample.comにアクセスすると、
サーバー上の/home/user1/xxx/index.htmlが表示される
ブラウザでexample.com/aaa.htmlにアクセスすると、
サーバー上の/home/user1/xxx/aaa.htmlが表示される
(aaa.htmlというファイルがあればそのまま表示される)
ブラウザでexample.com/bbbにアクセスすると
サーバー上の/home/user1/xxx/bbb/index.htmlが表示される
(ファイル名がない場合はindex.htmlが補完される)
server {
}
の部分を、サーバーディレクティブと呼ぶ
server_nameでドメイン名を指定
rootでドキュメントルート(CentOS上でのディレクトリのパス)を指定
(デフォルトのドキュメントルートは、/usr/share/nginx/html)
indexでインデックスファイル名を指定
(index index.html;と設定した場合
example.comへアクセスすると
example.com/index.htmlへアクセスしたのと同じ効果になる)
vi /etc/nginx/nginx.conf
nginx.confを開く
user nginx;
のような部分を確認する
(各自の環境によって値が異なる)
user nginx;となっていれば、
ユーザー名がnginxで、グループ名もnginx
(ユーザー名とグループ名が同じときは、グループ名を省略できる)
user httpd www;となっていれば、
ユーザー名がhttpdで、グループ名がwww
ドキュメントルートが/home/user1/exampleの場合
(/etc/nginx/conf.d/example.com.confに以下のような設定をしている場合)
server {
root /home/user1/example;
}
cd /home/user1/example chown -R nginx:nginx . find . -type d -exec chmod 700 {} + find . -type f -exec chmod 600 {} +
ドキュメントルート(/home/user1/example)へ移動
ドキュメントルート以下のディレクトリ・ファイルの所有者をnginx:nginxにする
(/etc/nginx/nginx.confのuserで指定されたユーザー名:グループ名)
ディレクトリのパーミッションを700にする
ファイルのパーミッションを600にする
ドキュメントルートが/home/user1/exampleの場合
chmod o+x / chmod o+x /home chmod o+x /home/user1
ドキュメントルートよりも上位の各ディレクトリに対して、othersに実行権限(+x)が必要
この権限がないと、nginxがドキュメントルートへアクセスできない
nginx -t
.confに構文エラーがないかテストするコマンド
エラーがある状態でsystemctl restart nginxをしてしまうと、nginxのサービスがダウンするので注意
systemctl restart nginx
nginxのサービスを再起動する。
.confの設定を書き替えた後は、nginxの再起動が必要
| プレフィックス | 効果 |
|---|---|
| なし | 前方一致 正規表現よりも優先度が低い |
| ^~ | 前方一致 正規表現よりも優先度が高い |
| = | 完全一致 |
| ~ | 正規表現 大文字・小文字を区別する |
| ~* | 正規表現 大文字・小文字を区別しない |
location /aaa {
return 301 http://google.com;
}
location ~ \.php {
return 301 http://yahoo.co.jp;
}
/aaa/xxx.phpにアクセスした場合、location /aaaにもlocation ~ \.phpにもマッチする。
プレフィックスなしよりも~(正規表現)の方が優先されるので、location ~ \.phpが採用されヤフーへリダイレクトされる
location ^~ /aaa {
return 301 http://google.com;
}
location ~ \.php {
return 301 http://yahoo.co.jp;
}
/aaa/xxx.phpにアクセスした場合、location ^~ /aaaにもlocation ~ \.phpにもマッチする。
^~(前方一致)は~(正規表現)より優先されるので、location ^~ /aaaが採用されグーグルへリダイレクトされる
下記のコマンドによりDHE用の鍵(2048ビット)を生成
openssl dhparam 2048 -out /etc/nginx/dhparam2048.pem
-out /etc/nginx/dhparam2048.pemの部分で保存先をしていしているので、コマンド自体はどこのディレクトリから実行してもOK
/etc/nginx/というディレクトリに
dhparam2048.pemというファイルが作成される
dhparam2048.pemには、Diffie-Helmanの鍵交換アルゴリズムで使われる素数が格納されている
vi /etc/nginx/nginx.conf
nginx.confを開く
ssl_protocols TLSv1.2 TLSv1.3;
ssl_dhparam /etc/nginx/dhparam2048.pem;
ssl_prefer_server_ciphers on;
ssl_ciphers "AES128+ECDHE:AES256+ECDHE:AES128+EDH:AES256+EDH:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4!CAMELLIA!AES128-SHA!AES128-SHA256!AES128-GCM-SHA256:!AES256-GCM-SHA384:!AES256-SHA256:!AES256-SHA!AES256-CCM8!AES256-CCM!AES128-CCM!ARIA128-GCM-SHA256!AES128-CCM8!ARIA256-GCM-SHA384";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
nginx.confというファイルの
httpディレクティブの先頭に上記の設定を追加
ssl_dhparamには、先ほど作成したDHE用の鍵ファイルのパス(/etc/nginx/dhparam2048.pem)を指定する
server {
listen 443 ssl http2;
(中略)
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
listenに443 ssl http2を設定
ssl_certificateにfullchain.pemのパスを指定
ssl_certificate_keyにprivkey.pemのパスを指定
server {
listen 80;
server_name example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
(中略)
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
listen 443 ssl http2;のserverディレクティブとは別に
listen 80;のserverディレクティブをもう1つ追加して
http://example.comから
https://example.comへ301リダイレクトするように設定
https://www.example.comのようなURLへアクセスしたときに
https://example.comのようなURLへ自動的にリダイレクトさせる
「wwwありのURL」と「wwwなしのURL」が同一のURLになるようにリダイレクトすることをURLの正規化という
server {
listen 443 ssl http2;
server_name example.com www.example.com;
if ($host ~* www.example.com) {
return 301 https://example.com$request_uri;
}
}
listen 443 sslのserverディレクティブに
ホスト名がwww.example.comのときだけ、example.comに301リダイレクトをする設定を追加
ブラウザで下記4つのURLへアクセス
http://example.comhttp://www.example.comhttps://example.comhttps://www.example.com
4つともhttps://example.comに転送されればOK
WordPressの場合は「wwwありのURL」から「wwwなしのURL」へ自動的にリダイレクトされるので
nginxでURL正規化のリダイレクト設定をする必要はない
WordPressの管理画面で
設定 > 一般 を開くと
WordPress アドレス (URL)サイトアドレス (URL)という2つの項目がある
ここに
https://example.comと書いておけば
https://www.example.comというURLでアクセスしても
自動的にhttps://example.comにリダイレクトされる
vi /etc/nginx/conf.d/example.com.conf
location ^~ /aaa/ {
return 403;
}
http://example.comのルートディレクトリが/home/user1/xxxだった場合、
/home/user1/xxx/aaa/ディレクトリにあるファイルは非公開になる
vi /etc/nginx/mime.types
/etc/nginx/mime.typesというファイルを確認すると
MIMEタイプ(image/svg+xmlなど)と
拡張子(svg svgzなど)の対応関係が一覧で確認できる
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
font/woff woff;
font/woff2 woff2;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
/var/log/nginx/access.logというログファイルにnginxのアクセスログが記録されている
これは、/etc/nginx/nginx.confというファイルの中で
access_log /var/log/nginx/access.log main;
と記述されているため
/var/log/nginx/error.logというログファイルにnginxのエラーが記録されている
これは、/etc/nginx/nginx.confというファイルの中で
error_log /var/log/nginx/error.log;
と記述されているため
FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream
拡張子が.phpのURLへアクセスすると上記のようなエラーが出る場合
などが原因として考えられる
location ~* /(uploads|files)/.*\.php$ {
deny all;
}
(uploads|files)のように書くと、uploadsまたはfilesという意味になる
()で区切ることでその中をグループ化できる
また、()のなかを$1のような変数で後から参照することができる
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
(?:uploads|files)のように書くと、純粋なグループ化のみを行い、後方参照の効果は発生しなくなる
グループ化と後方参照を使っている場合に、正規表現を修正すると$1・$2などのナンバリングがずれる可能性がある
後方参照が不要なものには(?:)でグループ化しておくことで、後方参照のナンバリングが複雑化しにくい
server {
listen 80 default_server;
server_name example.net www.example.net;
...
}
listenにdefault_serverを書くと、デフォルトサーバーになる
どの.confのどのserver_nameにも一致しないとき、default_serverのserverディレクティブが適用される
nginx upstream timed out (110: Connection timed out)
/var/log/nginx/error.logに、上記のようなエラーが記録された
タイムアウトまでの時間を変更すると改善される
nginxのタイムアウト値を変更するときは、
を連動して変更する
phpの設定を変更
vi /etc/php.ini
max_execution_time = 300
max_execution_time = 30の部分を
max_execution_time = 300に変更
デフォルトでは30秒でタイムアウトするようになっているが、
300秒(5分)に拡大する
php-fpmの設定を変更
vi /etc/php-fpm.d/www.conf
request_terminate_timeout = 300
request_terminate_timeout = 0の部分を
request_terminate_timeout = 300に変更
デフォルトでは0(無制限)になっているが、
phpやnginxに合わせて値を変更する
nginxの設定を変更
vi /etc/nginx/nginx.conf
fastcgi_buffers 8 128k; fastcgi_buffer_size 128k; fastcgi_read_timeout 300;
バッファーの個数とサイズを合わせて設定
WordPressに画像をアップロードするときなどに
413 Request Entity Too Large
や
辿ったリンクは期限が切れています。
というエラーが出ることがある
これは、ファイルサイズの制限に引っかかっている
vi /etc/php.ini
;post_max_size = 8M post_max_size = 20M
post_max_size = 8Mをコメントアウト、
post_max_size = 20Mを追加
;upload_max_filesize = 2M upload_max_filesize = 20M
upload_max_filesize = 2Mをコメントアウト、
upload_max_filesize = 20Mを追加
client_max_body_size 20M;
client_body_buffer_size 128k;
client_max_body_sizeのデフォルト値は1M(1メガバイト)
20Mなら20メガバイト
各自の環境に合わせて数値を設定する
client_body_buffer_sizeのデフォルト値は8k(8キロバイト)
このサイズを超えるリクエストボディを受け取ると一時ファイルに書き込まれる
client_body_buffer_sizeサイズが小さいと、一時ファイルに書き込まれる回数が増えるので動作が遅くなる
vi /etc/nginx/nginx.conf
user httpd www;
もし、user httpd www;と書いてあれば
nginxの実行ユーザーはhttpd:www(ユーザー名がhttpdで、グループがwww)
もし、user nginx nginx;と書いてあれば
nginxの実行ユーザーはnginx:nginx(ユーザー名がnginxで、グループがnginx)
user nginx;と書いてあれば
nginxの実行ユーザーはnginx:nginx(ユーザー名がnginxで、グループがnginx)
ユーザー名とグループ名が同じ場合はグループ名の方を省略できる
vi /etc/nginx/fastcgi.conf
# PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;
/etc/nginxというディレクトリの
fastcgi.confというファイルに
fastcgi_param REDIRECT_STATUS 200;
という設定が書かれているか確認
PHPをインストールするときのオプションに–enable-force-cgi-redirectを設定した場合は、この設定が必要
PHP5.3以降では、–enable-force-cgi-redirectがデフォルトで有効になっている
PHP の Configure オプション
おそらくNginxをインストールした時点で
自動的にfastcgi.confというファイルが作成されて
fastcgi_param REDIRECT_STATUS 200;
という設定もデフォルトであるはず
vi /etc/nginx/fastcgi.conf
fastcgi_param HTTPS $https if_not_empty;
httpsのURLでアクセスすると$httpsの変数にonが入るので
fastcgi_param HTTPS onという設定をしたことになる
httpのURLでアクセスすると$httpsの変数はundefinedなので
if_not_emptyの効果により
fastcgi_param HTTPS $httpsの行は丸ごと無視される