follow us in feedly

nginx

Let’s EncryptをNginxに設定して常時SSL化する

本ブログの常時SSL化対応が完了しました。
約3年ぶりにブログ再開したことと、Let’s Encryptを試す機会になるということで
ずっと温めていたタスクの実行に踏み切ることができました。
Nginxの設定にはほぼ触れず、Let’s Encryptに関わる内容のみですが紹介していきます。

環境

  • CentOS 6.9
  • Nginx 1.12.2
  • Certbot 0.19.0

Certbotのダウンロード & 実行

クライアントソフトウェアのCertbotをダウンロードして実行し、証明書を取得します。

$ cd /usr/local/bin
$ sudo wget https://dl.eff.org/certbot-auto
$ sudo chmod a+x certbot-auto
$ sudo ./certbot-auto certonly --webroot -w /var/www/blog.77dogs.net/ -d blog.77dogs.net

エラーが発生

下記のエラーが発生しました。

certbot-auto: line 864: virtualenv: コマンドが見つかりません

対策

Python 2.7が必要なのでインストールして、その環境下でCertbotを実行します。

$ sudo yum install centos-release-scl
$ sudo yum install python27 python27-python-tools
$ sudo scl enable python27 bash
$ ./certbot-auto certonly --webroot -w /var/www/blog.77dogs.net/ -d blog.77dogs.net

別のエラーが発生

新たに下記のエラーが発生しました。

...
IMPORTANT NOTES:
 - The following errors were reported by the server:

Domain: blog.77dogs.net
   Type:   unauthorized
   Detail: Invalid response from
   http://54.92.40.15/.well-known/acme-challenge/fCmuZYV6nsMPOb_nAvTkH45be_DFHLxvvLuyXUCPrSg:
   "<html>
   <head><title>403 Forbidden</title></head>
   <body bgcolor="
white">
   <center>

<h1>403 Forbidden</h1>

</center>

<hr>

<center>"


To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address.
...

対策

/.well-known以下にアクセスできないので、本ブログのNginx設定ファイルに追記します。

<br />
location ^~ /.well-known/ {
  log_not_found off;
  access_log    off;
  autoindex     off;
  try_files     $uri $uri/ =404;
}

Nginxを再起動して、Certbotを再実行します。
これで証明書の取得は完了です。

$ sudo service nginx restart
$ sudo scl enable python27 bash
$ ./certbot-auto certonly --webroot -w /var/www/blog.77dogs.net/ -d blog.77dogs.net

Nginxの設定

証明書が取得できたので、NginxにSSL設定をします。
Qualys SSL Labsの評価をA+にする設定をしてみました。
詳しい設定方法は書かないので参考サイトを参照してください。

自動更新設定

最後に、自動更新するようにcronの設定をします。
毎週日曜の23時に起動するように設定しました。
更新がなければ特に何もおこなわれません。

0 23 * * 0 /usr/bin/scl enable python27 "/usr/local/bin/certbot-auto renew -q --post-hook '/sbin/service nginx reload'"

まとめ

Let’s Encryptの証明書による常時SSL化の手順をご紹介しました。
証明書関連はほとんどCertbotがやってくれるので割りと簡単にできたように思います。
Nginxの設定については他サイトに任せていますが、参考になれば幸いです。

参考

nginxでサブドメインを使えるように設定する

nginx でサブドメインを使えるように設定します。
設定方法はいくつかあるようですが、ディレクトリでわけて管理する方法をとります。
nginx.conf に server { … } の設定をサブドメインの数だけ追記していけばできるが、
これだとドメインが増えるにつれてファイルサイズが大きくなるし管理もめんどう。
ということで、ディレクトリで管理します。

/var/www 以下にディレクトリを作成する

/var/www 以下にサブドメインに対応するディレクトリを作成します。
たとえば、以下のように切り分けます。

/var/www/blog.77dogs.net ← blog.77dogs.net のディレクトリ
/var/www/www.77dogs.net  ← www.77dogs.net のディレクトリ

nginx.conf を修正する

/etc/nginx/nginx.conf を修正します。
$host でホスト名が取得できるので、ホスト名でディレクトリを切り分けておくことで判別されるようになります。

server {
    listen 80;
    server_name ~^(.*.)?77dogs.net;
    …
}

server {
    listen 8080;
    server_name ~^(.*.)?77dogs.net;

    location / {
        root /var/www/$host;
        …
    }

    …
    location ~ .php$ {
        …
        fastcgi_param  SCRIPT_FILENAME  /var/www/$host$fastcgi_script_name;
        …
    }

参考にしたサイト

VirtualHostExampleJa#ワイルドカードでサブドメインへのアクセスをまとめて受け付ける設定

さくらVPSにnginx + WordPressの環境を構築する(5) – WordPressのインストール

さくらVPSにWordPressをインストールします。
WordPressをインストールすれば自分のブログ環境のできあがりです。

下記サイトを参考にさせていただきました。
さくらVPSとnginxリバースプロクシで最速WordPressブログを作る方法(ベンチマーク付き)| さくらたんどっとびーず

MySQLにWordPress用のデータベースを作成する

MySQLサーバに接続して、データベースを作成します。

mysql> CREATE DATABASE wordpress DEFAULT charset utf8;

データベースのユーザを作成します。
wpuserとpasswordは各自のもので作成してください。

mysql> GRANT ALL ON wordpress.* TO wpuser@localhost IDENTIFIED BY 'password'

WordPressをインストールする

最新版のWordPressをダウンロードして、展開します。
展開先は/var/www/html にしました。

# wget http://ja.wordpress.org/latest-ja.zip
# unzip latest-ja.zip

オーナーをnginxユーザにします。

# chmod -R nginx:nginx wordpress

wp-config.phpを作成して、WordPressの設定をします。

# cp wp-config-sample.php wp-config.php
# vi wp-config.php

下記の部分を修正します。FS_METHODは追加します。

define('DB_NAME', 'wordpress');
define('DB_USER', 'wpuser');
define('DB_PASSWORD', 'password');
define('FS_METHOD', 'direct');

/wordpress/wp-adminと/wordpress/wp-login.phpへのアクセスをキャッシュしないようにnginx.confのリバースプロキシの設定を修正します。

server {
  listen       80;    
  server_name  example.com;

  location /wordpress/wp-admin/ {
    proxy_pass ://backend;          
  }                                            

  location /wordpress/wp-login.php {
    proxy_pass ://backend;                  
  }                                                    

  location / {
    …

修正したら、nginxを再起動します。

# /etc/init.d/nginx restart

ブラウザからhttp://example.com/wordpress/wp-admin/にアクセスすると、
WordPressのインストーラが立ち上がるので各設定をしてインストールします。

パーマリンクを設定します。
/etc/nginx/nginx.confの下記の箇所にtry_filesを追記します。

location / {
  root      /var/www/html;
  index     index.php index.html index.htm;
  try_files $uri $uri/ /index.php?q=$uri&$args;
}

ダッシュボードの [設定] – [パーマリンク設定] で下記のように設定します。
「数字ベース」を選択すると「カスタム構造」に文字列が出るので、index.phpの部分を消せば簡単にできます。

/archives/%post_id%

Nginx Proxy Cache Purgeプラグインをインストールします。
ダッシュボードの [プラグイン] – [新規追加] から検索してインストールすれば終了です。

これで、さくらVPSにnginxとWordPressを使ったブログ環境の構築ができました。
あとは、WordPressを自由にカスタマイズしてサイトを作成してください。

さくらVPSにnginx + WordPressの環境を構築する(4) – nginxのインストール

さくらVPSにnginx (エンジンエックス)をインストールします。
リバースプロキシサーバとWebサーバは、ともにnginxを使って構築します。
nginxはPHPを実行する機能がないので、FastCGIサーバとしてPHPを実行できるようにします。

下記サイトを参考にさせていただきました。nginx の詳細についても参考になります。
さくらVPSとnginxリバースプロクシで最速WordPressブログを作る方法(ベンチマーク付き)| さくらたんどっとびーず

nginxをインストールする

nginxの最新版のCentOS用RPMをダウンロードして、リポジトリをインストールします。

# wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# rpm -Uvh nginx-release-centos-6-0.el6.ngx.noarch.rpm

nginxをインストールします。

# yum install nginx

PHP FasfCGIサーバの起動用スクリプトを作成する

FastCGIサーバとしてPHPを実行できるようにするスクリプトを作成します。

#!/bin/sh
#
# php-fastcgi   Use PHP as a FastCGI process via nginx.
#
# chkconfig:    - 80 20
# description:  Use PHP as a FastCGI process via nginx.
# processname:  php-fastcgi
# pidfile:      /var/run/php-fastcgi.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

PHPFCGI="/usr/bin/php-cgi"
FCGIPORT="9000"
FCGIADDR="127.0.0.1"
USER=nginx
GROUP=nginx
PIDFILE=/var/run/php-fastcgi.pid
PHP_FCGI_CHILDREN=5

start() {
  echo -n $"Starting ${PHPFCGI}: "
  daemon /usr/bin/spawn-fcgi -a ${FCGIADDR} -p ${FCGIPORT} -u ${USER} -g ${GROUP} -f ${PHPFCGI} -P ${PIDFILE} -C ${PHP_FCGI_CHILDREN} || exit 1
  echo
}

stop() {
  echo -n $"Stopping ${PHPFCGI}: "
  killproc -p ${PIDFILE} -d 60 ${PHPFCGI} || exit 1
  echo
}

restart() {
  stop
  start
}
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart|reload)
    restart
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart}"
    exit 2
esac

作成した起動用スクリプトを/etc/init.dに置きます。

# mv php-fastcgi /etc/init.d
# chmod 755 /etc/init.d/php-fastcgi

PIDファイル用のディレクトリを作成して、PHP FastCGIサーバの実行ユーザ(nginx)が書き込めるようにします。

# mkdir /var/run/nginx
# chown nginx:nginx /var/run/nginx

php-fastcgiスクリプトを起動します。

# /etc/init.d/php-fastcgi start

nginx.confを修正する

/etc/nginx/nginx.confにリバースプロキシ、バックエンドサーバ、PHP FastCGIサーバの設定を追加します。
下記設定がされている箇所は、各サーバ環境に応じて設定を変更してください。

  • サーバ IP アドレス: 192.0.2.1
  • ホスト名: example.com
  • HTML ドキュメントルート: /var/www/html
  • リバースプロキシのポート: 80
  • バックエンドサーバのポート: 8080
  • PHP FastCGI サーバのポート: 9000

user              nginx;
worker_processes  2;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
  worker_connections  1024;
}

 {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;
  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  access_log  /var/log/nginx/access.log  main;
  sendfile        off;
  tcp_nopush      off;
  keepalive_timeout   1;

  gzip            on;
  gzip_vary       off;
  gzip_types
    text/plain
    text/xml
    text/css
    application/xml
    application/xhtml+xml
    application/rss+xml
    application/atom+xml
    application/javascript
    application/x-javascript
    application/x-d-php;
  gzip_disable    "MSIE [1-6].";
  gzip_disable    "Mozilla/4";

  proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=czone:4m max_size=50m inactive=120m;
  proxy_temp_path   /var/tmp/nginx;
  proxy_cache_key   "$scheme://$host$request_uri";
  proxy_set_header  Host               $host;
  proxy_set_header  X-Real-IP          $remote_addr;
  proxy_set_header  X-Forwarded-Host   $host;
  proxy_set_header  X-Forwarded-Server $host;
  proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for;

  upstream backend {
    ip_hash;
    server 127.0.0.1:8080;
  }

  server {
    listen      80;
    server_name example.com;

    location / {
      set $do_not_cache 0;
      proxy_no_cache      $do_not_cache;
      proxy_cache_bypass  $do_not_cache;
      proxy_cache czone;
      proxy_cache_key     "scheme://$host$request_uri$is_args$args$mobile";
      proxy_cache_valid   200 301 302 10m;
      proxy_cache_valid   404 5m;
      proxy_cache_use_stale   error timeout invalid_header updating http_500 http_502 http_503 http_504;
      proxy_pass          http://backend;
      proxy_redirect      http://example.com:8080/ /;
    }

    location ~ /purge(/.*) {
      allow   127.0.0.1;
      allow   192.0.2.1;
      deny    all;
      proxy_cache_purge czone "$scheme://$host$1$is_args$args$mobile";
    }
  }

  server {
    listen      8080;
    server_name example.com;

    location / {
      root    /var/www/html;
      index   index.php index.html index.htm;
    }

    error_page  404  /404.html;
    location = /404.html {
      root   /usr/share/nginx/html;
    }

    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
      root   /usr/share/nginx/html;
    }

    location ~ .php$ {
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
      include        fastcgi_params;
    }

    location ~ /.ht {
      deny  all;
    }
  }
  include /etc/nginx/conf.d/*.conf;
}

ドキュメントルートのオーナーをnginxにします。

# chmod nginx:nginx /var/www/html

nginxを起動します。

# /etc/init.c/nginx start

ドキュメントルートに空のファイルを置いて、ブラウザでアクセスします。
空のファイルなので真っ白のページが表示されると思います。

# cp /dev/null /var/www/html/index.html

phpinfoを表示するファイルを作成して、ブラウザでアクセスします。
phpinfoのページが表示されればOKです。問題なければindex.phpとphpinfo.phpは削除します。

# echo '<?php phpinfo(); ?>' > /var/www/html/phpinfo.php

サーバ再起動時にnginxとPHP FastCGIが起動されるように設定します。

# /sbin/chkconfig --level 345 nginx on
# /sbin/chkconfig --level 345 php-fastcgi on

nginxとPHP FastCGIのインストールは完了です。
最後にWordPress をインストールすればサイト環境ができあがります。