文書の過去の版を表示しています。
Nginx
NginxとはオープンソースのWebサーバー。
Apacheよりも速い。
nginxのバージョンを確認する
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用リポジトリを設定
nginx用リポジトリを確認
ls -l /etc/yum.repos.d | grep 'nginx'
nginx のリポジトリがcentos上にあるか確認。
nginx用リポジトリを作成
vi /etc/yum.repos.d/nginx.repo
/etc/yum.repos.d
ディレクトリに
nginx.repo
というファイルを新規作成。
CentOS8の場合
- 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
CentOS7の場合
- nginx.repo
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1
nginx用リポジトリを確認
yum info nginx
nginxの情報を表示する。
nginxをインストールする
yum install nginx -y
nginx
をインストールする。
nginxのサービスを起動
systemctl enable nginx systemctl start nginx
nginx
のサービスを自動起動に設定。
nginx
のサービスを起動。
nginxデフォルトのドキュメントルート
/usr/share/nginx/html/
がデフォルトのドキュメントルートとなっている。
ブラウザで
http://IPアドレス
のようなURLへアクセスすると
/usr/share/nginx/html/
ディレクトリの
index.html
ファイルが表示される。
nginxの.confを設定する
.conf(設定ファイル)の場所
/etc/nginx/nginx.conf
がnginxの設定ファイル本体。
nginx.conf
の中に
include /etc/nginx/conf.d/*.conf;
という記述がある。
これの効果により、/etc/nginx/conf.d/
ディレクトリに.conf
の拡張子でファイルを作成すれば、nginxの設定を追加できる。
一般的に、1つのサイトに対して、1つの.conf
を作成する。
.confを新規作成する
vi /etc/nginx/conf.d/xxx.conf
xxx.conf
のようなファイルを新規作成。
この中にnginx用の設定を書いていく。
example.com
というサイトを作ったら、example.com.conf
というファイルを作り、そこに設定を書く。
aaa.com
というサイトを作ったら、aaa.com.conf
というファイルを作り、そこに設定を書く。
ファイル名は任意の文字列でOKだが、ドメイン名と一致させておくと分かりやすい。
.confの基本設定
- example.com.conf
server { listen 80; server_name example.com; root /home/user1/xxx; index index.html; }
ブラウザでexample.com
にアクセスすると、
サーバー上の/home/user1/xxx/index.html
が表示される。
(ファイル名が指定されていないとindex
に指定したものがファイル名として保管される)
ブラウザでexample.com/aaa.html
にアクセスすると、
サーバー上の/home/user1/xxx/aaa.html
が表示される。
(aaa.html
というファイルがあればそのまま表示される)
ブラウザでexample.com/bbb
にアクセスすると、
サーバー上の/home/user1/xxx/bbb/index.html
が表示される。
server { }
の部分を、サーバーディレクティブと呼ぶ。
server_name
でドメイン名を指定。
root
でドキュメントルート(CentOS上でのディレクトリのパス)を指定。
デフォルトのドキュメントルートは、/usr/share/nginx/html
index
でインデックスファイル名を指定。
example.com
へアクセスすると、
example.com/index.html
へアクセスしたのと同じ効果になる。
nginxの実行ユーザーを確認する
vi /etc/nginx/nginx.conf
nginx.conf
を開く。
user nginx;
のような部分を確認する。
(各自の環境によって値が異なる)
user nginx;
となっていれば、
ユーザー名がnginx
で、グループ名もnginx
。
(ユーザー名とグループ名が同じときは、グループ名を省略できる)
user httpd www;
となっていれば、
ユーザー名がhttpd
で、グループ名がwww
。
nginx、ドキュメントルートの権限設定をする
ドキュメントルートおよびドキュメントルートの中のディレクトリ・ファイル
ドキュメントルートが/home/user1/example
の場合。
(/etc/nginx/conf.d/example.com.confに以下のような設定をしている場合)
- 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の.confをテストする
nginx -t
.conf
に構文エラーがないかテストするコマンド。
エラーがある状態でsystemctl restart nginx
をしてしまうと、nginx
のサービスがダウンするので注意。
nginxを再起動する
systemctl restart nginx
nginx
のサービスを再起動する。
.conf
の設定を書き替えた後は、nginx
の再起動が必要。
.phpファイルを実行できるようにする
デフォルトでは、ブラウザでexample.com/index.php
などへアクセスすると、ブラウザが勝手にindex.php
をダウンロードする。
index.php
をダウンロードではなく、実行・ページを表示させるには、nginxの設定が必要。
location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param REDIRECT_STATUS 200; fastcgi_param HTTPS on; fastcgi_pass 127.0.0.1:9000; #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; }
location { }
のことをロケーションディレクティブと呼ぶ。
location ~ \.php$
のように書くことで、
拡張子が.php
のファイルに対してディレクティブ内のルールが適用される。
include fastcgi_params
により、
/etc/nginx/fastcgi_params
のファイルの中身が読み込まれる。
fastcgi_param XXX aiueo
のように書くと、
.php
ファイルの中で$_SERVER['XXX']
という変数でaiueo
という値が使用できるようになる。
(任意の変数名に、任意の値をセットできる)
# PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;
PHP
をインストールするときのオプションに–enable-force-cgi-redirect
を設定した場合は、この設定が必要。
PHP5.3以降では、–enable-force-cgi-redirect
がデフォルトで有効になっているらしい。
PHP の Configure オプション
locationディレクティブのプレフィックス
プレフィックス | 効果 |
---|---|
なし | 前方一致 正規表現よりも優先度が低い |
^~ | 前方一致 正規表現よりも優先度が高い |
= | 完全一致 |
~ | 正規表現 大文字・小文字を区別する |
~* | 正規表現 大文字・小文字を区別しない |
location競合の例1
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競合の例2
location ^~ /aaa { return 301 http://google.com; } location ~ \.php { return 301 http://yahoo.co.jp; }
/aaa/xxx.php
にアクセスした場合、location ^~ /aaa
にもlocation ~ \.php
にもマッチする。
^~(前方一致)
は~(正規表現)
より優先されるので、location ^~ /aaa
が採用されグーグルへリダイレクトされる。
httpsの設定
全体設定(nginx.confへの設定)
DHE用の鍵を生成
openssl dhparam -out /etc/nginx/dhparam2048.pem 2048
DHE用の鍵を2048ビットで生成。
/etc/nginx
ディレクトリに、dhparam2048.pem
というファイル名で保存する。
dhparam2048.pem
には、Diffie-Helmanの鍵交換アルゴリズムで使われる素数が格納されている。
sslのプロトコルなどを設定
vi /etc/nginx/nginx.conf
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;
ssl_dhparam
は、DHE用の鍵ファイルのパスを指定する。
サイト単位の設定(サイト.confへの設定)
ssl_certificateとssl_certificate_keyを設定
- example.com.conf
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
を設定。
ssl_certificate
にfullchain.pem
のパスを指定。
ssl_certificate_key
にprivkey.pem
のパスを指定。
httpからhttpsへリダイレクト
- example.com.conf
server { listen 80; server_name example.com; return 301 https://example.com$request_uri; }
http://example.com
から
https://example.com
へリダイレクト。
wwwありドメインからwwwなしドメインへリダイレクト
- example.com.conf
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.com
http://www.example.com
https://example.com
https://www.example.com
4つともhttps://example.com
に転送されればOK。
特定のディレクトリだけ非公開にする方法
vi /etc/nginx/conf.d/example.com.conf
- example.com.conf
location ^~ /aaa/ { return 403; }
http://example.com
のルートディレクトリが/home/user1/xxx
だった場合、
/home/user1/xxx/aaa/
ディレクトリにあるファイルは非公開になる。
nginxで扱えるMIMEタイプ一覧
vi /etc/nginx/mime.types
/etc/nginx/mime.types
というファイルを確認すると、
MIMEタイプ(image/svg+xml
など)と
拡張子(svg
など)の対応関係が一覧で確認できる。
- mime.types
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; }
ユーザーディレクトリの下にpublic_htmlを作成する方法
nginxのデフォルトのドキュメントルートは/usr/share/nginx/html
となっている。
これとは別に、/home/user1/public_html
というディレクトリを作成し、
nginxで公開する。
public_htmlディレクトリを作成
cd /home/user1 mkdir public_html
public_htmlディレクトリの権限設定
cd /home/user1/public_html chown -R nginx:nginx . find . -type d -exec chmod 700 {} + find . -type f -exec chmod 600 {} + chmod o+x / chmod o+x /home chmod o+x /home/user1
index.htmlを作成
vi /home/user1/public_html/index.html
index.html
というファイルを新規作成。
- index.html
<html> <p>This is index.html in user1/public_html</p> </html>
index.html
の中は、上記のようなものを書く。
public_htmlの動作確認1
ブラウザで
http://IPアドレス
のようなURLにアクセスする。
This is index.html in user1/public_html
と表示されればOK。
この時点ではnginxの設定がまだなので、
This is index.html in user1/public_html
とは表示されないはず。
nginxの.confを設定
default.confを作成
vi /etc/nginx/conf.d/default.conf
default.conf
を新規作成。
もしも、default.conf
というファイルがもともと存在する場合は、
default.conf
をdefault.conf.original
のようなファイル名にリネームしてバックアップしておく。
そして、空のdefault.conf
を新規作成する。
default.confを設定
- default.conf
server { listen 80 default_server; root /home/user1/public_html; index index.html; }
nginxを再起動
nginx -t systemctl restart nginx
nginx
のサービスを再起動。
public_htmlの動作確認2
ブラウザで
http://IPアドレス
のようなURLにアクセスする。
This is index.html in user1/public_html
と表示されればOK。
nginxログの保管場所
nginxのアクセスログのパス
/var/log/nginx/access.log
というログファイルにnginxのアクセスログが記録されている。
これは、/etc/nginx/nginx.conf
というファイルの中で
- nginx.conf抜粋
access_log /var/log/nginx/access.log main;
と記述されているため。
nginxのエラーログのパス
/var/log/nginx/error.log
というログファイルにnginxのエラーが記録されている。
これは、/etc/nginx/nginx.conf
というファイルの中で
- nginx.conf抜粋
error_log /var/log/nginx/error.log;
と記述されているため。
Primary script unknownエラー
FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream
拡張子が.php
のURLへアクセスすると上記のようなエラーが出る場合、
- ドキュメントルートのパスが間違っている
- ファイルのパーミッションが間違っている
- php-fpmの設定が間違っている
などが原因として考えられる。
()グループ化と$1後方参照
()でグループ化
location ~* /(uploads|files)/.*\.php$ { deny all; }
(uploads|files)
のように書くと、uploads
またはfiles
という意味になる。
()
で区切ることでその中をグループ化できる。
また、()
のなかを$1
のような変数で後から参照することができる。
(?:)でグループ化
location ~* /(?:uploads|files)/.*\.php$ { deny all; }
(?:uploads|files)
のように書くと、純粋なグループ化のみを行い、後方参照の効果は発生しなくなる。
グループ化と後方参照を使っている場合に、正規表現を修正すると$1
・$2
などのナンバリングがずれる可能性がある。
後方参照が不要なものには(?:)
でグループ化しておくことで、後方参照のナンバリングが複雑化しにくい。
デフォルトサーバー
- example.com.conf抜粋
server { listen 80 default_server; server_name example.net www.example.net; ... }
listen
にdefault_server
を書くと、デフォルトサーバーになる。
どの.confのどのserver_name
にも一致しないとき、default_server
のserver
ディレクティブが適用される。
nginxとphp.iniのタイムアウト制限を緩和する
- error.log抜粋
nginx upstream timed out (110: Connection timed out)
/var/log/nginx/error.log
に、上記のようなエラーが記録された。
タイムアウトまでの時間を変更すると改善される。
nginxのタイムアウト値を変更するときは、
- php
- php-fpm
- nginx
を連動して変更する。
php.iniを設定
phpの設定を変更。
vi /etc/php.ini
- php.ini抜粋
max_execution_time = 300
max_execution_time = 30
の部分を
max_execution_time = 300
に変更。
デフォルトでは30秒でタイムアウトするようになっているが、
300秒(5分)に拡大する。
www.confを設定
php-fpmの設定を変更。
vi /etc/php-fpm.d/www.conf
- www.conf
request_terminate_timeout = 300
request_terminate_timeout = 0
の部分を
request_terminate_timeout = 300
に変更。
デフォルトでは0(無制限)になっているが、
phpやnginxに合わせて値を変更する。
nginx.confを設定
nginxの設定を変更。
vi /etc/nginx/nginx.conf
- nginx.conf
fastcgi_buffers 8 128k; fastcgi_buffer_size 128k; fastcgi_read_timeout 300;
バッファーの個数とサイズを合わせて設定。
nginxとphp.iniのアップロードファイルサイズ制限を緩和する
WordPressに画像をアップロードするときなどに
413 Request Entity Too Large
や
辿ったリンクは期限が切れています。
というエラーが出ることがある。
これは、ファイルサイズの制限に引っかかっている。
php.iniを設定
vi /etc/php.ini
POSTデータの最大サイズを変更
- php.ini抜粋
;post_max_size = 8M post_max_size = 20M
post_max_size = 8M
をコメントアウト、
post_max_size = 20M
を追加。
1ファイルあたりの最大アップロードサイズを変更
- php.ini抜粋
;upload_max_filesize = 2M upload_max_filesize = 20M
upload_max_filesize = 2M
をコメントアウト、
upload_max_filesize = 20M
を追加。
nginx.confを設定
- nginx.conf抜粋
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
サイズが小さいと、一時ファイルに書き込まれる回数が増えるので動作が遅くなる。