カテゴリー : Nginx

Nginx 最新安定版を Ubuntu LTS 16.04 にインストールする手順

Nginx 最新安定版 v1.12.0 を Ubuntu LTS 16.04 にインストールする手順をご紹介します。

Nginx

インストールできる Nginx のバージョン確認

apt-cache policy コマンドで、インストールできる Nginx のバージョンを確認します。

$ apt-cache policy nginx
nginx:
  Installed: (none)
  Candidate: 1.10.0-0ubuntu0.16.04.4
  Version table:
     1.10.0-0ubuntu0.16.04.4 500
        500 http://mirrors.linode.com/ubuntu xenial-updates/main amd64 Packages
        500 http://mirrors.linode.com/ubuntu xenial-updates/main i386 Packages
        500 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu xenial-security/main i386 Packages
     1.9.15-0ubuntu1 500
        500 http://mirrors.linode.com/ubuntu xenial/main amd64 Packages
        500 http://mirrors.linode.com/ubuntu xenial/main i386 Packages

続きを読む

[Nginx] http を https にリダイレクトする設定 & HTTP Strict Transport Security (HSTS) 対応

Nginx で http リクエストを https にリダイレクトする設定と HTTP Strict Transport Security (HSTS) の設定の2つをご紹介します。

http を https へリダイレクトする設定

以下のように return 301 https://$host$request_uri; の部分で 301 リダイレクトさせてます。

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}
 
server {
    # 'http2' requires nginx 1.9.5+. If using older nginx, replace with 'spdy'.
    listen 443 ssl http2;
    server_name example.com;
}

HTTP Strict Transport Security (HSTS) の設定

server {
    listen 443 ssl http2;
 
    # HTTP Strict Transport Security: tells browsers to require https:// without first checking
    # the http:// version for a redirect. Warning: it is difficult to change your mind.
    # 
    #    max-age: length of requirement in seconds (31536000 = 1 year)
    #    includeSubdomains: force TLS for *ALL* subdomains (remove if this is not what you want)
    #    preload: indicates you want browsers to ship with HSTS preloaded for your domain.
    # 
    #    Submit your domain for preloading in browsers at: https://hstspreload.appspot.com
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
 
 
    # If you won't/can't turn on HTTPS for *all* subdomains, use this simpler version:
    # add_header Strict-Transport-Security "max-age=31536000;" always;
}

HSTS Preload リストへ登録する

Google では ドメインを HSTS Pre-loaded List に登録するサービス を行っています。記載された手順に従ってドメインを登録すれば、今後ブラウザとそのドメインとの間に安全でない通信は起こらなくなります。これに登録するには Strict-Transport-Security ヘッダに preload パラメータを含める必要があります。

[引用元] HTTP Strict Transport Security – Web セキュリティ | MDN

とのことなので HSTS Preload List Submission から登録しましょう。

HSTS Preload List を登録するための条件として、

  • サブドメインは指定できないのでネイキッドドメインを指定する
  • add_header で includeSubDomains を設定する

などが必要です。

今の時代 GoogleのHTTPSサイト優遇方針で待ったなし! と言われていることもあり、未対応のサイト運営者は早めに対応したほうがよさそうです。

参考情報

[Nginx] upstream timed out (110: Connection timed out) while reading response header from upstream

当サイト codenote.net が 504 Gateway Time-out で接続しにくい状態になっていました。

まず、Nginx のエラーログを確認すると upstream timed out (110: Connection timed out) while reading response header from upstream というエラーが出てました。

$ tail -F /var/log/nginx/codenote.net/error.log 
2015/03/28 23:45:04 [error] 20407#0: *537270 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 223.135.69.50, server: codenote.net, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/www.sock", host: "codenote.net"

ひとまず PHP-FPM のプロセスを再起動して一旦は直ったものの、またすぐに繋がらなくなりました。

$ service php-fpm restart
Stopping php-fpm:                                          [  OK  ]
Starting php-fpm:                                          [  OK  ]

調査してみると PHP-FPM の設定に問題があるようで、確認してみたら process manager の設定がほぼデフォルトのままの状態でした。ちゃんと設定していたはずなんですけど…

/etc/php-fpm.d/www.conf

以下、pm (process manager) のデフォルト設定です。

; Choose how the process manager will control the number of child processes.
; Possible Values:
;   static  - a fixed number (pm.max_children) of child processes;
;   dynamic - the number of child processes are set dynamically based on the
;             following directives:
;             pm.max_children      - the maximum number of children that can
;                                    be alive at the same time.
;             pm.start_servers     - the number of children created on startup.
;             pm.min_spare_servers - the minimum number of children in 'idle'
;                                    state (waiting to process). If the number
;                                    of 'idle' processes is less than this
;                                    number then some children will be created.
;             pm.max_spare_servers - the maximum number of children in 'idle'
;                                    state (waiting to process). If the number
;                                    of 'idle' processes is greater than this
;                                    number then some children will be killed.
; Note: This value is mandatory.
pm = dynamic
 
; The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes to be created when pm is set to 'dynamic'.
; This value sets the limit on the number of simultaneous requests that will be
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
; CGI.
; Note: Used when pm is set to either 'static' or 'dynamic'
; Note: This value is mandatory.
pm.max_children = 9
 
; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 3
 
; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 2
 
; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 4
 
; The number of requests each child process should execute before respawning.
; This can be useful to work around memory leaks in 3rd party libraries. For
; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
; Default Value: 0
pm.max_requests = 200

下記の設定に変更しました。

pm = static
pm.max_children = 30
pm.max_requests = 500

pm = static は最初から小プロセスの起動数を固定する設定です。dynamic だと動的ですが、最初から確保できる static の方が利用するリソースが把握しやすいので static にします。

max_children は起動する小プロセスの最大数です。

max_requests は子プロセスが再起動するまでに実行するリクエスト数です。

PHP-FPM の process manager の設定を変更後、504 Gateway Time-out は表示されず快適にアクセスできるようになりました。

参考情報

[Nginx] Compile オプションの確認方法

Nginx のコンパイルオプションは、 nginx -V で確認できます。

# nginx -V
nginx version: nginx/1.4.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'

yum 経由でインストールした場合でも、この方法で確認できます。


参考情報

SE奮闘記: nginxのgzip_staticを有効に設定

[Mac] Nginx を Homebrew でインストール

Mac に Nginx を Homebrew でインストールしました。

% brew install nginx
% nginx -v
nginx version: nginx/1.4.1

Nginx を自動起動する設定をします。

% ln -sfv /usr/local/opt/nginx/*.plist ~/Library/LaunchAgents
% launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist

Nginx を手動で起動したい場合は、下記のコマンドを実行します。

% nginx

http://127.0.0.1:8080/ にアクセス

welcome-to-nginx

あとは、利用用途に応じて色々と設定していきます。

[Nginx] www 付きの URL を www 無しにリダイレクトさせる設定方法

Nginx で、www 付きの URL を www 無しにリダイレクトさせる設定方法を調べたのでメモ。

下記の設定は、www.codenote.net にアクセスがきたら、codenote.net へリダイレクトさせます。

server {
    listen 80;
    server_name www.codenote.net;
    rewrite ^ http://codenote.net$request_uri? permanent;
}

www付きURLは今後もずっと、www無しURLにリダイレクトさせるので、最後のリダイレクトフラグを permanent にしています。

リダイレクトフラグについては色々と種類があるので、状況に応じて設定を変更してみて下さい。

最後のリダイレクトフラグに何を指定するかで、HTTPのステータス番号も変わってきます。

・last
rewriteは完了で、以降のマッチするURI や locationの処理は継続します。

・break
rewriteは完了です。

・redirect
一時的なリダイレクトの意味で使います。このとき、HTTP ステータス番号 302 を返して、リダイレクトを実行します。

・permanent
恒久的なリダイレクトの意味で使います。このとき、HTTP ステータス番号 301 を返して、リダイレクトを実行します。

[引用元]:apache のかわりにnginxを使ってみる(4) nginx でリダイレクト ( rewrite ) するには | レンタルサーバー・自宅サーバー設定・構築のヒント

以上です。


参考情報

rewrite ルールのコンバート

Nginx(エンジンエックス)のインストール手順・方法

Nginxをインストールしたので、手順や方法をメモ。

nginx news

nginx(「エンジンエックス」と発音) は、軽量高性能なWebサーバ/リバースプロキシであり、同時に電子メール(IMAP/POP3)プロキシである。

・引用元:nginx – Wikipedia はてなブックマーク - nginx - Wikipedia

インストール手順

■ GCC、PCRE、zlib、OpenSSLをインストール

まず、Nginxのコンパイルに必要なものをインストールします。

# yum -y install gcc
# yum -y install pcre pcre-devel
# yum -y install zlib zlib-devel
# yum -y install openssl openssl-devel

■ Nginxのインストール

yum でインストールできる最も新しいバージョンは nginx 0.8.54 みたいです。

ちなみに、安定版は nginx-1.0.4 が2011-06-01にリリースされたもので最新のものになります。

# yum info nginx
Available Packages
Name       : nginx
Arch       : x86_64
Version    : 0.8.54
Release    : 1.el5
Size       : 389 k
Repo       : epel
Summary    : Robust, small and high performance HTTP and reverse proxy server
URL        : http://nginx.net/
License    : BSD
Description: Nginx [engine x] is an HTTP(S) server, HTTP(S) reverse proxy and
           : IMAP/POP3 proxy server written by Igor Sysoev.

早速、インストールします。

# yum -y install nginx

ちゃんとインストールされているか確認します。

# nginx -v
nginx version: nginx/0.8.54

オプションは nginx -h で確認できます。

# nginx -h
nginx version: nginx/0.8.54
Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]
 
Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /usr/share/nginx/)
  -c filename   : set configuration file (default: /etc/nginx/nginx.conf)
  -g directives : set global directives out of configuration file

例えば、どういう configure でインストールされたかは、 nginx -V で確認できます。

(読みやすくするため、configureオプションは改行して表示しています。)

# nginx -V
nginx version: nginx/0.8.54
built by gcc 4.1.2 20080704 (Red Hat 4.1.2-50)
TLS SNI support disabled
configure arguments:
--user=nginx
--group=nginx
--prefix=/usr/share/nginx
--sbin-path=/usr/sbin/nginx
--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=/var/run/nginx.pid
--lock-path=/var/lock/subsys/nginx
--with-http_ssl_module --with-http_realip_module
--with-http_addition_module
--with-http_xslt_module
--with-http_image_filter_module
--with-http_geoip_module
--with-http_sub_module
--with-http_dav_module
--with-http_flv_module
--with-http_gzip_static_module
--with-http_random_index_module
--with-http_secure_link_module
--with-http_degradation_module
--with-http_stub_status_module
--with-http_perl_module --with-mail
--with-file-aio --with-mail_ssl_module
--with-ipv6
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'

■ Serviceに登録、自動起動設定

# chmod +x /etc/rc.d/init.d/nginx
# chkconfig --add nginx
# chkconfig nginx on
# chkconfig --list nginx
nginx          	0:off	1:off	2:on	3:on	4:on	5:on	6:off

インストール手順は以上です。