魔法使いの卵

WEBエンジニアの卵の成長記録

さくらVPSにいれたNginxでベーシック認証をやってみた

パッケージのインストール

sudo yum install -y httpd-tools

.htpasswdファイルの作成

  • 作成したいユーザの名前を入れてる
sudo htpasswd -c /etc/nginx/.htpasswd username
  • 作成したユーザのパスワードを入れる
New password: password
Re-type new password: password
Adding password for user username

Nginxの設定ファイルを変更する

  • 対象のconfファイルを開く
vim /etc/nginx/conf.d/対象のファイル.conf
  • locationの中にベーシック認証の設定を入れる
    location / {
        auth_basic "認証時に表示されるメッセージ";
        # .htpasswdファイルのパス
        auth_basic_user_file /etc/nginx/.htpasswd;
    }

サーバの再起動を行う

sudo systemctl restart nginx

最後に

  • 簡単にベーシック認証できるのでオススメ

参考元

Nginx で Basic 認証

僕の理想とするNginxの導入方法ができた

はじめに

  • ソースビルドもやったしパッケージもやった
  • でも、本当にこれでいいのかなぁ・・・ってもやもやがあった
  • 今回は考えたもやもやと出した結論と解決した方法をまとめておく
  • いい方法があればぜひ知りたい・・・

ソースビルとパッケージのメリット・デメリット

ソースビルドのメリット(すぐおもいついたもの)

  • 拡張性と柔軟性がある

ソースビルドのデメリット(すぐおもいついたもの)

  • 必要な設定はすべて自分で行う必要があるのでめんどくさい
  • RPM等のパッケージマネージャで管理できない

パッケージのメリット(すぐおもいついたもの)

  • インストールした瞬間から設定済みなので即時利用可能
  • RPM等のパッケージマネージャで管理できている

パッケージのデメリット(すぐおもいついたもの)

  • 拡張性と柔軟性にかける

思ったこと

  • 拡張性を常に意識した作りにしたい
  • パッケージマネージャーで管理したい
  • めんどくさい設定はやりたくない

結論

いいとこどりしたやつ作ればええやんってなりました

僕が目指す理想形

  • めんどくさい設定は全部終わっててほしい
  • 設定系はデファクトスタンダートがいい
  • 拡張性はソースビルド並にほしい
  • パッケージマネージャーで管理したい
  • インストールもアンインストールもコマンド1発がいい

ないならつくるしかないので作ります

RPMのコンパイルオプションを指定して拡張性の高いNginxを導入する

  • 利用するパッケージをインストールしておく
sudo yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel wget ncurses-devel perl-devel perl-ExtUtils-Embed GeoIP-devel libxslt-devel gd-devel rpm-build yum-utils
  • rpmbuild 実行用の「builder」ユーザを作成
sudo useradd builder
  • sudo権限を付与する
sudo usermod -G wheel builder
  • builderのパスワードを設定する
sudo passwd builder
  • builderユーザに切り替える
sudo su builder
  • NginxのSRPMSを取得する
curl -O http://nginx.org/packages/centos/6/SRPMS/nginx-1.10.0-1.el6.ngx.src.rpm
  • RPMパッケージのインストールの進行状況と詳細を出しながらインストールする
rpm -ivh nginx-1.10.0-1.el6.ngx.src.rpm
  • ./configureオプションが記述されているファイルを開く
vim ~/rpmbuild/SPECS/nginx.spec
  • ./configureオプションは以下になります
    • デフォルトでいれたいものが全て入ってました
     82 %define COMMON_CONFIGURE_ARGS $(echo "\
     83         --prefix=%{_sysconfdir}/nginx \
     84         --sbin-path=%{_sbindir}/nginx \
     85         --modules-path=%{_libdir}/nginx/modules \
     86         --conf-path=%{_sysconfdir}/nginx/nginx.conf \
     87         --error-log-path=%{_localstatedir}/log/nginx/error.log \
     88         --http-log-path=%{_localstatedir}/log/nginx/access.log \
     89         --pid-path=%{_localstatedir}/run/nginx.pid \
     90         --lock-path=%{_localstatedir}/run/nginx.lock \
     91         --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp \
     92         --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp \
     93         --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp \
     94         --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp \
     95         --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp \
     96         --user=%{nginx_user} \
     97         --group=%{nginx_group} \
     98         --with-http_ssl_module \
     99         --with-http_realip_module \
    100         --with-http_addition_module \
    101         --with-http_sub_module \
    102         --with-http_dav_module \
    103         --with-http_flv_module \
    104         --with-http_mp4_module \
    105         --with-http_gunzip_module \
    106         --with-http_gzip_static_module \
    107         --with-http_random_index_module \
    108         --with-http_secure_link_module \
    109         --with-http_stub_status_module \
    110         --with-http_auth_request_module \
    111         --with-http_xslt_module=dynamic \
    112         --with-http_image_filter_module=dynamic \
    113         --with-http_geoip_module=dynamic \
    114         --with-http_perl_module=dynamic \
    115         --add-dynamic-module=njs-%{module_njs_shaid}/nginx \
    116         --with-threads \
    117         --with-stream \
    118         --with-stream_ssl_module \
    119         --with-http_slice_module \
    120         --with-mail \
    121         --with-mail_ssl_module \
    122         --with-file-aio \
    123         --with-ipv6 \
    124         %{?with_http2:--with-http_v2_module}")
  • RPMを再構築
rpmbuild -ba ~/rpmbuild/SPECS/nginx.spec
  • 再構築したRPMをインストール
sudo rpm -ivh ~/rpmbuild/RPMS/x86_64/nginx-1.10.0-1.el7.centos.ngx.x86_64.rpm

最後に

  • 一旦これで僕が求めてた理想形を手にすることはできた
  • ひとまず、これで使ってみて改善点があればまたいじってみようとおもう

さくらVPSにソースビルドでいれたNginxをアンインストールする

ソースビルドで入れたNginxをアンインストールする

  • 一旦Nginxを止める
sudo service nginx stop
  • nginxのソースファイル以外の場所を確認する
sudo find / -name "nginx".*
  • prefixがデフォルトの状態だと全て/usr/local/nginx/配下にいるため消す
sudo rm -rf /usr/local/nginx/

nginxユーザを削除する

sudo userdel nginx

ユーザが存在しないことを確認する

cat /etc/passwd | grep nginx

起動スクリプトを削除する

sudo rm /etc/init.d/nginx

最後に

  • ソースファイルを消して終わり

さくらVPSの初期設定後にまっさきにいれたツール

パッケージツールの更新

  • 更新コマンド
sudo yum update -y

利用するツールを入れる

  • 今回導入するツール
入れるもの 用途
git バージョン管理
tmux ターミナルの多重化ソフト
vim エディタ
  • インストールコマンド
sudo yum install -y git tmux vim

gitのバージョンを確認する

  • 確認コマンド
git --version
git version 1.8.3.1

githubに疎通確認する

raichel.hatenablog.com

  • 上記のようにさくらVPSにログインした場合はすでにMacで設定した鍵でgithubと疎通が取れます。
  • 疎通確認コマンド
ssh -T git@github.com
  • アカウント名が返ってきたら成功

gitで疎通テスト時に警告が出る時の対処

  • ssh -T git@github.comで疎通テストを行うと以下のエラーが出る
added the RSA host key for IP address 'IPアドレス' to the list of known hosts.
  • 以下のコマンドで警告を消す
ssh-keygen -R IPアドレス

tmuxのバージョンを確認する

  • 確認コマンド
tmux -V
tmux 1.8

tigを入れる

必要なもの 用途
wget HTTPやFTP経由のファイル取得を行えるツール
ncurses-devel インストール・コンパイルの為
  • インストールコマンド
sudo yum install -y wget ncurses-devel
wget http://jonas.nitro.dk/tig/releases/tig-2.1.tar.gz
tar -zxvf tig-2.1.tar.gz
cd tig-2.1
./configure
make
sudo make install

tigのバージョンを確認する

  • 確認コマンド
tig -v
tig version 2.1

さくらVPSでPHPのバージョンを管理する

phpenv + php-buildでphpのバージョンを管理する環境を作る

  • EPELリポジトリを追加
sudo yum install -y epel-release.noarch
  • phpenvとphp-buildを入れる
curl -L https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | bash
git clone git://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build
cd .phpenv/plugins/php-build/
sudo sh install.sh
  • 必要なパッケージを入れる
sudo yum install -y libxml2-devel bison bison-devel openssl-devel curl-devel libjpeg-devel libpng-devel libmcrypt-devel readline-devel libtidy-devel libxslt-devel
  • re2cを入れる
sudo wget -P /usr/share/ https://sourceforge.net/projects/re2c/files/0.16/re2c-0.16.tar.gz
cd /usr/share
sudo tar zxvf re2c-0.16.tar.gz -C /usr/share/
cd re2c-0.16
./configure
sudo make install

好きなPHPのバージョンをインストールする

  • PHP7を入れる
php-build --definitions
php-build 7.0.7 ~/.phpenv/versions/7.0.7
  • パスを通す
echo 'export PATH="$HOME/.phpenv/bin:$HOME/.phpenv/versions/7.0.7/sbin:$PATH"' >> ~/.bashrc
echo 'eval "$(phpenv init -)"' >> ~/.bashrc
exec $SHELL -l
  • インストールしたことがあるphpのバージョンを確認する
phpenv versions
 7.0.7
  • phpenvで入れたphpを適用するディレクトリを作成する
mkdir -p workspace/php/7.0.7 && cd workspace/php/7.0.7
  • 適用させるディレクトリに設定を反映させる
phpenv local 7.0.7
phpenv rehash
  • phpのバージョンを確認する
php -v
PHP 7.0.7 (cli) (built: Jun  2 2016 23:25:42) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
    with Xdebug v2.4.0, Copyright (c) 2002-2016, by Derick Rethans

最後に

  • ※ globalのphpのバージョンの設定方法とかありますが、今回省略しました

  • globalにphpのバージョンを設定したい場合は以下でいけます

phpenv global 7.0.7
phpenv rehash
  • 別にこれいれたからどうってわけじゃないんだけど色々試すためにはやっぱり必要だった

さくらVPSにMacからポートフォワーディングで接続する

もう鍵をサーバごと作りたくない理由

  • セキュリティ的に複数の鍵を管理するのが怖い
  • githubの鍵が増えすぎて気が狂いそう
  • 漏洩時どこから漏洩したのか分からなさそうで怖い

ポートフォワーディングをすることで何が嬉しいの?

  • 鍵を複数管理しなくていい
  • セキュリティ的によさそう
  • githubの鍵がシンプルになりそう

MacからさくらVPSにポートフォワーディングする

  • 鍵を登録しているか確認する
$ ssh-add -l
  • Macの鍵を登録しておく
$ ssh-add ~/.ssh/id_rsa
  • さくらVPSに接続してみる
ssh -A -p ポート番号 ユーザ名@IPアドレス

感想

さくらVPSにNginxをソースビルドで入れた

ソースビルドでnginxを入れる

  • 必要なライブラリ
必要なライブラリ 役割
pcre pcre-devel perl互換の正規表現用
zlib zlib-devel gzip圧縮用
openssl openssl-devel SSLツール
wget HTTPやFTP経由のファイル取得を行えるツール
ncurses-devel インストール・コンパイルの為
  • パッケージインストールコマンド
sudo yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel wget ncurses-devel
  • ※ 依存ライブラリの取り込み方は2種類有ります。
    • 今回はnginxのビルド時に依存ライブラリを静的に取り込みます
    • 動的にとりこむ場合は以下のオプションをconfigureを実行時に追加する
ライブラリ名 オプション名
PCRE --with-pcre=ディレクトリパス
zlib --with-zlib=ディレクトリパス
OpenSSL --with-openssl=ディレクトリパス
  • Nginx用ユーザとグループ作成
sudo groupadd nginx
sudo useradd -g nginx nginx
  • nginxユーザでのログインを禁止
sudo usermod -s /bin/false nginx
  • nginxの圧縮ファイルをダウンロード
wget http://nginx.org/download/nginx-1.11.0.tar.gz
  • nginxの圧縮ファイルを解凍
tar xvzf nginx-1.11.0.tar.gz
  • configureを実行(利用したいモジュールを追加)
./configure --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_v2_module
  • コンパイルしインストール
make
sudo make install
  • インストールできたか確認する
sudo /usr/local/nginx/sbin/nginx -V
  • Nginxのバージョン
nginx version: nginx/1.11.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_v2_module
  • userディレクティブを設定するために設定ファイルを開く
sudo vim /usr/local/nginx/conf/nginx.conf
  • 2行目のuserディレクティブを以下に変更
user  nginx nginx;
  • 起動スクリプトの作成

    • Nginxをソースからインストールした場合は起動スクリプトが作成されないため自作が必要
    • 今回はNginx入門から起動スクリプトを拝借した
  • 起動スクリプトを作成コマンド

sudo vim /etc/init.d/nginx
  • 起動スクリプトファイルの中身
#! /bin/sh
# chkconfig: 345 98 20
# Author: Ryan Norbauer http://norbauerinc.com
# Modified: Geoffrey Grosenbach http://topfunky.com
# Modified: Clement NEDELCU
set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
SCRIPTNAME=/etc/init.d/$NAME

# デーモンファイルが見つからなければ、スクリプトを終了する
test -x $DAEMON || exit 0

d_start() {
  $DAEMON || echo -n " already running"
}

d_stop() {
  $DAEMON -s quit || echo -n " not running"
}

d_reload() {
  $DAEMON -s reload || echo -n " could not reload"
}

case "$1" in
  start)
    echo -n "Starting $DESC: $NAME"
    d_start
    echo "."
  ;;
  stop)
    echo -n "Stopping $DESC: $NAME"
    d_stop
    echo "."
  ;;
  reload)
    echo -n "Reloading $DESC: configuration..."
    d_reload
    echo "reloaded."
  ;;
  restart)
    echo -n "Restarting $DESC: $NAME"
    d_stop
    # 再起動の前に2秒スリープする。Nginxデーモンが穏便に終了するための時間を与えるのである。
    sleep 2
    d_start
    echo "."
  ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2
    exit 3
  ;;
esac

exit 0
  • 起動スクリプト実行権限を付与する
sudo chmod +x /etc/init.d/nginx
  • Nginxのコマンド
コマンド できること
sudo service nginx start 起動
sudo service nginx restart 再起動
sudo service nginx stop 停止
sudo chkconfig nginx on 自動起動

個人的におもったこと

  • ソースビルドでnginxの自動起動がうまく行かなかった
    • 解決策は起動スクリプト内にchkconfigを記述してランレベルの指定いるとか初耳
  • あとはディレクトリ構造の意味とか復習するいい機会になった(ほとんどわすれてた
  • 仮想サーバと違ってちゃんとやらなきゃって気持ちになるのはやっぱいい
  • これからも愛情いっぱいにこのサーバ育てる