Nginx のインストール

Nginx

Nginx のインストール

# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=0
# yum -y --enablerepo=nginx install nginx
# nginx -t
# systemctl start nginx
# systemctl enable nginx

[ CentOS 6 ]
service nginx start
chkconfig nginx on

標準の設定を追加する

各設定値は環境に応じて変更してください。

(1) http 用標準設定

# vi /etc/nginx/conf.d/http.conf
server_tokens off;
server_name_in_redirect off;
etag on;
client_max_body_size 100m;
client_body_buffer_size 256k;

gzip on;
gzip_http_version 1.0;
gzip_comp_level 1;
gzip_proxied any;
gzip_vary on;
gzip_buffers 4 8k;
gzip_min_length 1000;
gzip_types text/plain
           text/xml
           text/css
           text/javascript
           application/xml
           application/xhtml+xml
           application/rss+xml
           application/atom_xml
           application/javascript
           application/x-javascript
           application/x-httpd-php;
gzip_disable "MSIE [1-6]\.";
gzip_disable "Mozilla/4";

proxy_headers_hash_bucket_size 128;
proxy_headers_hash_max_size 1024;
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=my-key:8m max_size=50m inactive=120m;
proxy_temp_path /var/cache/nginx/proxy_temp;
proxy_buffers 8 64k;
proxy_buffer_size 64k;
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;
proxy_read_timeout 120;
proxy_send_timeout 10;
proxy_cache_use_stale timeout invalid_header http_500 http_502 http_503 http_504;
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;

(2) location 用ヘッダー設定

# vi /etc/nginx/conf.d/header.conf
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Remote-Addr $remote_addr;
# HTTPS しか使用しない場合
proxy_set_header X-Forwarded-Proto "https";
# HTTP も使用する場合
# proxy_set_header X-Forwarded-Proto $scheme;
# ELB やセキュリティファイアーウォールなどの後段に配備し、nginx が HTTPS を終端しない場合
# proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Accept-Encoding "";
proxy_set_header X-Sendfile-Type X-Accel-Redirect;
proxy_hide_header X-Pingback;
proxy_hide_header Link;
proxy_hide_header ETag;

(3) server 用キャッシュ設定

# mkdir /etc/nginx/conf.d/common/
# vi /etc/nginx/conf.d/common/drop.conf
location = /favicon.ico                      { expires 1h; access_log off; log_not_found off; }
location = /robots.txt                       { expires 1h; access_log off; log_not_found off; }
location = /apple-touch-icon.png             { expires 1h; access_log off; log_not_found off; }
location = /apple-touch-icon-precomposed.png { expires 1h; access_log off; log_not_found off; }

シラサギの設定を追加する

(1) ドメイン/ポートの設定

# vi /etc/nginx/conf.d/virtual.conf
server {
    include conf.d/server/shirasagi.conf;
    server_name example.jp;
}

example.jp はサイトのドメインに変更してください。
include ... の箇所は直接記述しても構いません。

(2) プロキシーの設定

# mkdir /etc/nginx/conf.d/server/
# vi /etc/nginx/conf.d/server/shirasagi.conf
include conf.d/common/drop.conf;
root /var/www/shirasagi/public/sites/w/w/w/_/;
error_page 404 /404.html;

location @app {
    include conf.d/header.conf;
    if ($request_filename ~ .*\.(ico|gif|jpe?g|png|css|js)$) { access_log off; }
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header X-Accel-Mapping /var/www/shirasagi/=/private_files/;
    proxy_intercept_errors on;
}
location / {
    try_files $uri $uri/index.html @app;
}
location /assets/ {
    root /var/www/shirasagi/public/;
    expires 1h;
    access_log off;
}
location /private_files/ {
    internal;
    alias /var/www/shirasagi/;
}
# download .svg files instead of showing inline in browser for protecting from xss
location ~* \.svg$ {
    expires 1h;
    access_log off;
    log_not_found off;
    add_header Content-Disposition "attachment";
    try_files $uri @app;
}
# download .htm/html files instead of showing inline in browser for protecting from xss.
# for only belonging to fs directories.
location ~* /fs/.*\.(htm|html)$ {
    add_header Content-Disposition "attachment";
    try_files $uri @app;
}

/var/www/shirasagi はインストールしたディレクトリに変更してください。

Nginx の再起動

# systemctl restart nginx

[ CentOS 6 ] service nginx restart

管理画面にBasic認証を設定する

パスワードファイルを作成する。

# yum -y install httpd-tools
# cd /etc/nginx
# htpasswd -cm .htpasswd username
> パスワードを入力する

設定を追加する。

# vi /etc/nginx/conf.d/virtual.conf
server {
    ...
    location /. {
        try_files $uri @app;
        auth_basic "Secret";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

セキュリティ関連の設定

SELlinux, Firewalld が有効な場合はそれぞれについて設定します。

管理用コマンドの導入
# yum -y install policycoreutils-python

selinux制限許可(SHIRASAI関連ファイル, unicorn)
# restorecon -RF /var/www/shirasagi/public
# restorecon -RF /var/www/shirasagi/private
# semanage port -a -t http_port_t -p tcp 3000
unicorn 3000番ポートを解放する
# firewall-cmd --add-port=3000/tcp --permanent
# firewall-cmd --reload

ロードバランサーなどの背後に配備する際の注意点

シラサギ CMS の掲示板など一部の機能には接続元の IP アドレスの拒否設定を持つものがあり、この機能を正しく動作させるには、シラサギが正しく接続元の IP アドレスを知る必要があります。

しかし、ロードバランサーやファイアーウォールの背後に nginx を配備した場合、接続元の IP アドレスが、X-Forwarded-For などのヘッダーにセットされ、シラサギからは正しい接続元 IP アドレスを取得できない場合があります。

シラサギでは接続元の IP アドレスを X_REAL_IP ヘッダーから取得していますので、接続元としてもっともらしい IP アドレスを X_REAL_IP ヘッダーへセットするように構成してください。

具体的には接続元の IP アドレスの拒否設定をご利用になる場合、次の手順で設定を確認してください。

  1. シラサギの管理画面へログインし、接続情報 (/.u/connection) へアクセスします。
  2. 「接続元IPアドレス」を確認し、正しい接続元 IP が表示されている場合は問題ありません。正しい接続元 IP アドレスが表示されていない場合は、次の手順へ進みます。
  3. 外部サイト remote_addrとかx-forwarded-forとかx-real-ipとか などを参考に、X-Forwarded-For に設定されている IP アドレスチェーンの中から、接続元としてもっともらしい IP アドレスを X_REAL_IP ヘッダーへセットするように設定を変更します。
  4. nginx を再起動し、手順 1 からやり直してください。