ngnix一覧

nginx 1.13.8 Release

1.13.8リリース。1ヶ月くらい様子を見てからあげる予定。

Changes with nginx 1.13.8                                        26 Dec 2017

    *) Feature: now nginx automatically preserves the CAP_NET_RAW capability
       in worker processes when using the "transparent" parameter of the
       "proxy_bind", "fastcgi_bind", "memcached_bind", "scgi_bind", and
       "uwsgi_bind" directives.

    *) Feature: improved CPU cache line size detection.
       Thanks to Debayan Ghosh.

    *) Feature: new directives in vim syntax highlighting scripts.
       Thanks to Gena Makhomed.

    *) Bugfix: binary upgrade refused to work if nginx was re-parented to a
       process with PID different from 1 after its parent process has
       finished.

    *) Bugfix: the ngx_http_autoindex_module incorrectly handled requests
       with bodies.

    *) Bugfix: in the "proxy_limit_rate" directive when used with the
       "keepalive" directive.

    *) Bugfix: some parts of a response might be buffered when using
       "proxy_buffering off" if the client connection used SSL.
       Thanks to Patryk Lesiewicz.

    *) Bugfix: in the "proxy_cache_background_update" directive.

    *) Bugfix: it was not possible to start a parameter with a variable in
       the "${name}" form with the name in curly brackets without enclosing
       the parameter into single or double quotes.

HTTP/2対応した筈なのにHTTP1.1になってしまう件

自宅の端末で、せっかく設定したHTTP/2が有効にならない。いろいろ検索すると、下記の情報にたどりついた。

対応しているはずなのに、なぜかHTTP/2で通信できない原因

ESETのファミリーセキュリティ等、いわゆるウィルス対策ソフトが原因の模様。

ウチでも使っているよ、ソレー!

Twitter等の大手サイトだと問題なくHTTP2になっているので、端末側原因というよりサーバ側の設定と思っていたが…。

一部のSSLサイト(「https://」で始まるWebページ)が表示できない

フィルタリングモードを対話モードにする事で、ブロック対象となった場合は許可するか聞いてくるようで、必要に応じて許可してほしいとのアナウンス。

ブロックではなくHTTP/2が無効化されているだけだったので、特にポップアップ等もあがることなく、対話モードにすることでHTTP/2が有効になった。

心当たりはないが、ここのサイトと同じRapidSSLの証明書がブロックされていたので、これが怪しい。証明書の発行元でブロックされるのか、それとも別の原因でブロックされたので同じ証明書の発行元も同じくブロックされたのか。

 

 

 


nginxでsslの設定評価をA+にするメモ

間違った中間CA証明書をバンドルして運用していた事に気づいたので、その修正とともにNginxのHTTPS設定について見直した。HTTPS運用する上で事前に実施していたのは、下記くらいか。

  • RapidSSLで外部認証局の証明書を取得
  • RapidSSLの場合は、中間CA証明書もサーバ証明書にバンドルしておく
  • 取得した証明書はワイルドカード(マルチドメイン)対応でないため、バーチャルホストではなく証明書のドメインのサブディレクトリにコンテンツを変更する
  • SSL等の古いプロトコルは禁止しTLSのみにする

SSLv1-v3の設定はかなりハイリスクのため、これらを不許可にするだけでA-からスタートできるようだ。実質変更したのは、CipherListの変更、HSTSの設定、dhparamの設定くらい。

証明書+SSL設定の確認方法

SSL Server Test

上記サイトで確認したいホスト名をいれて確認が可能。

何度か実行し、赤く表示されているWeekポイントを修正する事で、最終的にはA+と判定された。暗号強度をあげれば、CipherStrengthあたりはもう少しあがるハズだが、落とし所としてはこのあたりだろう。

赤字は修正が好ましい指摘事項、緑は推奨設定事項のようなので基本的には赤字を潰していくように設定を変更していけばよい。まともな証明書を使う限り、大きく改善とみなされるのは、SSL不許可とStrict-Transport-Securityの設定のようだが、強制的にhttpsにリダイレクトされるためコンテンツ側の対応が必要だったり、ブラウザ側での例外設定ができなかったり等の弊害もあるので注意したい。

設定内容を変更後、サイドSSL Server Testを実施したい場合は結果画面より、clear cacheを選ぶとよい。

ちなみにテストでは、CAAレコードの追加がしていないと指摘されたため対応してみたが、特に減点対処とも加点対象ともならないようである。

DNSはホスティングを利用しているので、さくらのコンパネから追加してみた。

登録する値は、証明書の発行元によって変わるので注意。rapidSSLの場合はsymantec.comを下記のように登録すればいいようだ。

0 issue "symantec.com"

テスト結果およびNginxの関連ドキュメントを参照し設定した最終的な、SSLのバーチャルホスト部の設定はこんな感じ。

/etc/conf.d/ssl.conf
Server {

    listen       443 ssl http2 default_server;
    listen       [::]:443 ssl http2 default_server;
    server_name moooi.jp;
    root /www/html/;

    add_header Strict-Transport-Security 'max-age=31536000';

    ssl_certificate	 /etc/nginx/cert/server.crt;
    ssl_certificate_key  /etc/nginx/cert/server.key;
    ssl_dhparam /etc/nginx/dhparam.pem;

    ssl_session_cache shared:le_nginx_SSL:1m;
    ssl_session_timeout 1440m;

    ssl_protocols TLSv1.2;

    ssl_prefer_server_ciphers on;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:!MD5;

    client_max_body_size 25M;

}
参考にした記事

HTTPS on Nginx: From Zero to A+ (Part 1)[原文] [日本語翻訳版]

HTTPS on Nginx: From Zero to A+ (Part 2)[原文] [日本語翻訳版]


CentOS6.XでHTTP/2のためにnginxを設定

centOS6.xはALPN対応パッケージがないので、自力でコンパイル&インストールする。

事前にやること

現在のパッケージインストールしたnginxのオプションを控えておく。

$sudo nginx -V

nginx version: nginx/1.12.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments:
 --prefix=/etc/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
 --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-compat
 --with-file-aio
 --with-threads 
 --with-http_addition_module
 --with-http_auth_request_module 
 --with-http_dav_module
 --with-http_flv_module
 --with-http_gunzip_module 
 --with-http_gzip_static_module
 --with-http_mp4_module
 --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-mail
 --with-mail_ssl_module 
 --with-stream
 --with-stream_realip_module
 --with-stream_ssl_module 
 --with-stream_ssl_preread_module

OpenSSL1.0.1系のためALPNに対応した1.0.2系の最新版に変える。

パッケージアンインストールすると、現在の設定ファイル等も削除されてしまう場合があるので、/etc/nginx配下、/etc/inid.dの起動スクリプトをバックアップする。

$ mkdir ~/backup
$ cd ~/backup
$ sudo cp -r /etc/nginx .
$ sudo cp /etc/init.d init_nginx

コンパイル

作業ディレクトリでopensslの最新版とnginxの最新版をダウンロードし、展開する。

$ wget https://www.openssl.org/source/openssl-1.0.2m.tar.gz 
$ tar zxvf openssl-1.0.2m.tar.gz 
$ wget https://nginx.org/download/nginx-1.13.7.tar.gz
$ wget zxvf nginx-1.13.7.tar.gz

コンパイルオプションは、各種技術系サイトの情報をベースに、設定パスやユーザ名等は極力、パッケージ版のものを踏襲するようにして、設定ファイル等の変更が発生しないようにしている。

$ cd nginx-1.13.7
$ ./configure  \
   --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-http_auth_request_module \
   --with-threads \
   --with-stream \
   --with-stream_ssl_module \
   --with-http_slice_module \
   --with-mail \
   --with-mail_ssl_module \
   --with-file-aio \
   --with-http_v2_module \
   --with-ipv6 \
   --with-openssl=../openssl-1.0.2m/

–with-http_v2_module、–with-openssl=../openssl-1.0.2m/の指定必須。opensslは事前にコンパイル不要なので-with-opensslで指定するフォルダに展開しておけばよい。

足りないヘッダ等があれば、makeファイル作成時にエラーがでるのでxxx-devel等の該当パッケージをいれる。

$yum install pcre-devel
インストール、設定の戻し
$ make

ここまでエラーなく完了したら、nginxの既存パッケージをアンインストールして、コンパイルしたものをインストールする。

$ sudo yum remove nginx*
$ sudo make install

設定ファイルの書き戻し、ownerをnginx:nginxに戻しておく等。

$ cd ~/backup
$ sudo cp init_nginx /etc/inin.d/nginx
$ sudo cp -R nginx /etc/
$ sudo chown -R nginx:nginx /etc/nginx

ちゃんと反映されているか確認。

$ sudo nginx -V

nginx version: nginx/1.13.7
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 
built with OpenSSL 1.0.2m  2 Nov 2017
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-http_auth_request_module
 --with-threads
 --with-stream
 --with-stream_ssl_module
 --with-http_slice_module
 --with-mail
 --with-mail_ssl_module
 --with-file-aio
 --with-http_v2_module
 --with-openssl=../openssl-1.0.2m/

あとは、起動して今までのコンテンツが動作している事を確認して完了。

$ service nginx start

家計簿さな太郎のインストールメモ(nginx+サブディレクトリ)

Web家計簿を自宅サーバで運用するための作業メモ。サービスとしても利用できるが、OSSとして公開されているので自分のサーバにインストールし、運用することも可能。

基本的な手順等は下記を参考にさせていただいた。

Ruby on Rails で動く家計簿の導入メモ

適当なディレクトリで以下を実行。

$ git clone git://github.com/kaznum/sanataro.git
$ sudo chowon -R nginx:nginx sanataro
$ cd sanataro

事前にdatabaseを作成しておき、database名、ユーザ名、パスワードを設定しておく。
以下、mysql2を利用する場合の一例。

sanataro/config/database.yml
 production:
   adapter: mysql2
   database: sanataro
   username: sanataro
   password: xxxxxxxx
   encoding: utf8
   socket: /var/lib/mysql/mysql.sock

さきほど作ったdataベース名、ユーザ名、パスワードを指定。これは、あくまでもDB接続用のパスワードのため、利用時のログインパスワードとは別である。利用時のログインパスワードは、このDB上に保管される。socketのファイルパスは、mysqlの設定とあわせること。

msqlのソケットファイルのパス確認
$ sudo ps auxf | grep mysql
root 1274 0.0 0.0 11468 936 ? S 2017 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql 1493 0.2 11.8 2165900 243836 ? Sl 2017 153:54 \_ /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock

–socketの後のパスがmysqlが使っているsocketのパスとなる。

sanataro/config.ru
# This file is used by Rack-based servers to start the application.

RAILS_RELATIVE_URL_ROOT="/sanataro"

require ::File.expand_path('../config/environment',  __FILE__)
run Sanataro::Application

if RAILS_RELATIVE_URL_ROOT then
        map RAILS_RELATIVE_URL_ROOT do
                run Rails.application
        end
else
        run Rails.application
end

サブディレクトリで運用する為には、RAILS_RELATIVE_URL_ROOTが重要。

sanararo/Gemfile
group :production do
  gem 'unicorn'
end

productionにunicornを追加し、bundle install時に追加するよう変更。

sanataro/confing/unicorn.rb
# Rails_root_path
rails_root = "/www/html/sanataro"

worker_processes 2
working_directory rails_root

# Unicorn Socket
listen "#{rails_root}/tmp/unicorn.sock"

# Unicorn PID file location
pid "#{rails_root}/tmp/unicorn.pid"

# Path to logs
stderr_path "#{rails_root}/log/unicorn_error.log"
stdout_path "#{rails_root}/log/unicorn.log"

# Time-out
timeout 300

unicorn用設定ファイルを作成する。

$ gem install bundler
$ bundle install --path vendor/bundle --without test development

利用するだけであれば、productionだけのgemでよい。
特にtestのみで使うgemのインストールでいくつかハマりポイントがあるので、回避。

$ bundle exec rake db:migrate RAILS_ENV=production

必要なテーブルの作成等。

/etc/nginx/conf.d/ssl.conf
#Sanataro(Rails)

upstream unicorn {
  server unix:/www/html/sanataro/tmp/development_unicorn.sock fail_timeout=0;
}

location /sanataro {
    alias /www/html/sanataro;
    try_files $uri/index.html $uri.html $uri @unicorn;
  }

  location @unicorn {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn;
  }

nginxで動かす方の設定ファイル。nginxのserverディレクティブの中に書く。

$ sudo service nginx restasrt

nginxの再起動。

さな太郎(Rasils App)の起動
bundle exec unicorn_rails -c config/unicorn.rb -E production -D --path /sanataro

ここでも –path設定。

他にやること

・自分に不要な機能をテンプレート(/app)のファイル、または該当部分をテンプレートから削除する等して無効化(ユーザー追加等)しておく。

・別の家計簿アプリからデータのインポート(特にインポート機能はないので、適当にコンバートかけておく。集計は別テーブルがあるので、そこもコンバートしておく。)、詳細は割愛。


webminをnginx+SSLでサブディレクトリで動かす

  • webminはrpm等で導入済とする
  • デフォルトポートは変更する。
  • SSLはnginx経由とする
  • https://example.com/webmin_subdirectory/でアクセスできるようにする

/etc/webmin/config

webprefix=/webmin_subdirectory
webprefixnoredir=0

/etc/webmin/miniserv.conf

port=25252
front_url=https://example.com/webmin_subdirectory/

/etc/nginx/conf.d/ssl.conf

server {
 listen 443;
 root /www/html/;
 server_name example.com;
 client_max_body_size 25M;
 ssl on;
 ssl_certificate	 /etc/nginx/cert/server.crt;
 ssl_certificate_key  /etc/nginx/cert/server.key;
 
#Webmin Setting

 location /webmin_subdirectory/ {
 proxy_redirect http://example.com:25252/ https://example.com/webmin_subdirectory/;
 proxy_pass http://127.0.0.1:25252/;
 proxy_read_timeout 3600s;
 proxy_set_header    X-Real-IP	$remote_addr;
 proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header    Host            $host;
 proxy_set_header X-Forwarded-Proto $scheme;
 }
}

nginx、Webminの再起動でhttps://example.com/webmin_subdirectory/でアクセス可能となる。


//追加