【nginx】nginxを使ってみよう【導入から実装まで】

アザラシです。今年の秋頃からwebサーバーをnginxに変更しました。
なにかあった時のために自分用に導入から実装までをまとめて置こうと思います。
nginxだとデフォルトだとベーシック認証を用意していないので、
ベーシック認証の仕方についても触れていきたいと思います。

内容としては濃いのでゆったり見てください。

0.参考リンク

nginx LinuxPackages
CentOS7 に nginx導入
yumで明示的に使用するレポジトリを指定する方法
CentOS 7 firewalld よく使うコマンド
【丁寧解説】Linuxのファイアウォール firewalld の使い方
Nginx設定のまとめ
Nginx で Basic 認証

1.環境 & やっていくこと

OS : CentOS7.x (CentOS8触ったほうがいいのかなぁ・・・)
やること : 複数webサイト運用 , ベーシック認証
自身の環境は CentOS7なので、CentOS6とか8とかUbuntuの説明は一切無しだから(でりさくら)

やっていくこと

nginxのインストール

・nginxをインストールする為にyumリポジトリにnginx.repo追加
・nginxのインストール
・nginxの自動起動

nginxの設定

・firewalldでhttp、もしくはhttps用ポートを開放する
・ルーターがあるならルーターにも開ける
・nginxの設定ファイルを作成、及び変更
・ベーシック認証のやり方

2.nginxをインストールしよう

nginxをインストールするには yum のデフォルトリポジトリから引っ張ってくるのではなく、
nginx用のリポジトリから引っ張る必要があるので、
リポジトリを追加します。

リポジトリを追加する前に、nginx公式を見ると、
yum-utils を インストールしておいてくださいとのことなので、
現状入っていないのであればインストールしておきます。

sudo yum install yum-utils

yum-utilsをインストールし終わったらリポジトリを追加します。
リポジトリを追加する方法は

/etc/yum.repos.d/

上記のパスに nginx.repo のファイルを作成し、中にリポジトリの設定を記入することで
yum install をしたときに参照してくれるようになります。
なので今回は、/etc/yum.repos.d/ に nginx.repo のファイルを作成しましょう。

/etc/yum.repos.d/に移動。
移動先で vim or vi でファイルを作成します。
rootユーザー以外の場合は sudo を使用する必要があります。

上記のコマンドのようにvim or vi で作成します。

記載する内容は上記の内容です。
一応コピペできるように下記にテキストを用意しておきますが、
これはCentOS7用なので、CentOS6等他のOSの場合は記述が変わります。

[nginx]
 name=nginx repo
 baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
 gpgcheck=0
 enabled=1

他のOSの場合のリポジトリの記載方法は、
参考リンクにnginxの公式リンクを張っておきました。
一応ここにも貼っておきます。 https://nginx.org/en/linux_packages.html

上記のリポジトリの書き方は、Qiitaを参考にしましたが、
セキュリティ的には 署名の検証をする為に、gpgcheckを1にして、gpgkeyを追加したほうが
良いですね。

gpgcheck=1
gpgkey=https://nginx.org/keys/nginx_signing.key

gpgcheck と gpgkeyの値はこちらです。
あと enable = 1 の値は、今回インストールが終わったら 0 に戻せば
不要な時に参照しなくなります。再度必要になれば 1 にするか、
必要なときだけ –enablerepo=nginx をコマンドに付けるのがベターかと。

yum install --enablerepo=nginx nginx

のような感じです。
ではリポジトリを追加したら、インストールしてみましょう。

sudo yum install nginx でインストール。
リポジトリの enableを切ってる場合は先程のコマンドでインストールできるはずです。

3.インストールできたかの確認

インストールは無事終わりましたか?
インストールが無事終わっているかの確認の為に、
コマンドで確認してみましょう。

nginx -v とコマンドを打つ事でバージョンの確認ができます。
このコマンドが通ればインストールは無事できているかと思います。
問題なければ、サーバーが起動された時に自動起動されるように
systemctlで設定しましょう。

こちらもsudo を付与してコマンドを実行します。
systemctl 等、セキュリティ的に簡単にいじれてしまうと問題のあるものは
基本 sudo をつけます。

特にエラーが吐かなければ実行されていますが、心配なので一応確認しましょう。

 systemctl staus nginx

上記のコマンドで nginx の現在の状態を確認できます。
早速確認してみましょう。

上記スクショの赤枠部分が enabled になっていれば問題有りません。
現状このスクショですと、すでにnginxが稼働している事になっていると思いますが、
この手順どおりに進めているとまだnginxは稼働してない状態になっているはずです。

なので、nginxを起動しましょう。
nginxを起動するには

 sudo systemctl start nginx 

上記のコマンドでnginxを実行できます。上記実行後、
sudo systemctl status nginx のコマンドで状態を確認すると、
Active の部分が Activeになり、緑色の丸がステータス上に出るかと思います。
(非稼働状態だと、灰色の丸だったかと)

これでnginxの起動までの手順を終了です。ここからは、
実際にwebサーバー上でwebサイトを表示する方法です。

4.webサイトを表示するための設定

nginxのインストール等が終わったら次はウェブサイトを表示するための準備です。
firewalldでport開放がまだでしたらポートを開放する必要があります。
まずはfirewalldの設定から説明していきます。

firewalldの設定

一旦firewalld の設定をみて、http,httpsが開放されているかどうかの確認をします。
sudo コマンドではできない部分も含まれていたかと思うので、
rootユーザーに切り替えた上で打ってください。
コマンドは

# firewall-cmd --list-all

上記のコマンドで、現状開放されている物の確認ができます。

コマンドを打つと上記のような画面になります。(セキュリティの関係上モザイク多めです)
http もしくは https がすでに開放されていれば services に http https と書かれているはずです。
その場合はすでに開放されている事になりますが、セキュリティの為に
ポートを変更する場合は任意のポート番号で開放してください。

今回は一旦デフォルトポートでの開放方法の説明をします。
ポートを変更してやりたい場合については後ほど補足します。
まずは、httpのサービスの追加をする方法ですが

# firewall-cmd -add-service=http --zone=public --permanent

これで、恒久的にhttp用ポート(80番)を開放できます。
恒久的に開放したくない場合は、 –permanent の記述を入れないでください。
–zone=publicの記述はfirewalldにはゾーンという概念があり、
やりたいことに応じて分けています。特に気にしたことなかったです。

今回ゾーンについて調べましたが、iptableの時にあった要求に対して
drop したり、blockする処理に関しても zoneで用意されているようです。
なので、受け付けない場合は drop or blockのゾーンにすれば拒否できます。

ポート番号を変更したい場合ですが、firewalldでポートを開放するコマンドがあります。
下記のコマンドになります。

firewall-cmd --add-port=8080/tcp --zone=public --permanent

このコマンドでtcp:8080は開放できます。udpにしたい場合はtcpの部分をudpにしてください。
番号を変更する場合は8080の部分を使用できる任意の番号にしてください。
ポート等の開放をしたら、firewalldの設定を読み直さないと反映されません。
firewalld の設定を変えたら下記のコマンドを打つことを憶えておいてください。

# firewall-cmd --reload

このコマンドを実行すると、問題なければ success と出ます。
firewalldのポート開放などについては以上です。
ちなみに設定したものを削除したい場合は add-portだったり、
add-serviceの部分を remove-port もしくは remove-service
とすることで削除できます。

ちなみに自宅サーバーの場合で、ルーターを使用している場合、
ブラウザでルーターにアクセスし、firewalldで指定したポート番号を
開放してあげる必要があるので忘れないようにしてください(n回敗北。 nは自然数とする)

nginxの設定

firewalldの設定で大分長くなりましたが、nginxの設定です。
現状サーバーのアドレスを直打ちすればnginxのウェルカムページが表示されるかと思います。
(特に設定を変えてなければ)

nginxの設定ファイルなどがある場所は、
/etc/nginx/
になります。とりあえずここに移動しましょう。

一々sudo打つのダルいのでルートユーザーのまま進めています。
ここでlsコマンドを打つと設定ファイルっぽいものがゴロゴロあります。
lsコマンドを打った時に nginx.conf というものがあるかと思います。
まずはこれの設定をいじるので、vim で編集します。

自身の設定ファイルです。デフォルトの物に多少手を加えています。
一部見せたくない部分もあるのでモザイクを掛けています。

user nginx
これは、nginxを起動するユーザーの指定です。基本はnginxにしておくと良いです。

worker_process 数字
マルチコアのCPUの場合で、複数コアを使用して処理したい場合数字を入れます。
auto を指定することで自動的にコア数を設定してくれます。

keepalive_timeout 75
HTTPの持続接続時間です。長すぎるとスレッドが増えるので負荷がかかります。
デフォルトは75

gzip on
サーバー間の転送量を抑えることができます。
詳しい設定はここの参考リンクからどうぞ

デフォルトですとwebサイト毎の設定を以下のパスに入れておくと読み込めるようになりますが、
アザラシは使ってないので、この記述は消しても良いのですが、とりあえず残してあります。

include /etc/nginx/conf.d/*.conf

上記の物の代わりにアザラシはVirtualHostで複数のwebサイトを運用しているので、
最後の方の行に

include /etc/nginx/sites-enabled/*

の記述を追加しています。
sites-enabled ディレクトリに必要なデータのシンボリックリンクを入れて
webサイトを有効化する方法です。(いろんな人を参考にしました)

シンボリックリンクを使う方法ですが、
/etc/nginx/ ディレクトリに
sites-availablesites-enabled という名前のディレクトリを作成しています。
sites-availableには運用予定のwebサイトの設定を入れておき、
実際に運用をするというタイミングで、sites-enabled にシンボリックリンクを作成する。
という運用方法です。サイトを表示させたく無い時にはシンボリックリンクを消すだけなので
だいぶ楽な運用方法です。

運用予定の設定ファイル

実際に運用しているものはこのようにシンボリックリンクとして sites-enabled に置いておく。
元ファイルにはドメインごとの設定を記載しています。
そちらの設定をこれから説明します。

自身が運用しているサイトの設定ファイルです。
server{} の中にドメインの記述や、ファイルまでのパス、indexファイルを指定しています。
他にも、Let’sEncryptを使用しているのでcertbotの設定が記載されています。

server_name
ドメイン部分です。ここに記述します。

location / {}
この中にファイルまでのパスを指定していきます。
root
表示させたいwebサイトのデータがあるパスを指定します。
index
index.html や index.php のように、デフォルトで読み込ませたいファイルの名前や種類を記載します。

listen
firewalldで開放したポート番号を入れます。

他にも設定はありますが、詳細な設定は各自で調べて頂ければと思います。
設定が終わったら、 ln -s コマンドで、 sites-enabled にシンボリックリンクを
作成後、 systemctl reload nginx でnginxを再読み込みしてください。

5.ベーシック認証のやり方

デフォルトでは、.htpasswdを使用できないので、
httpd-tools をyumでインストールします。

sudo yum install httpd-tools 

インストールが終わったら、 .htpasswd を作成します。
作成の方法は

 $ sudo htpasswd -c 保存したいディレクトリ/.htpasswd 認証時に使うユーザーネーム 
 $ sudo htpasswd -c /etc/nginx/.htpasswd azarashi

上記を実行すると、ベーシック認証で使いたいパスワードを求めらます。
設定したいパスワードを入力し、作成終了です。
作成したらファイルのパスを nginx の設定ファイルに使います。

nginxの設定ファイルに location / {} の項目に、ベーシック認証関連の設定を記載します。
記載方法を下記に記します。

終わったら、systemctl でnginxをreloadしてください。

6.終わりに

基本的な流れは以上です。細かいところをフォローし続けると
この記事が延々と長くなってしまい、自分のモチベーションが下がるので
ある程度の内容で一旦とどめておきます。何か不足している部分があれば
随時加筆していきます。

思ったこと1 :
リポジトリの事をレポジトリって言ってみたりする人もいるけど、
普通に発音としても読み方としてもリポジトリなんだけど、
なんでレポジトリなんだろう・・・

思ったこと2 :
nginxのモスクワオフィスに強制捜査が入りましたけど、これ大丈夫ですかねぇ・・・
https://www.itmedia.co.jp/news/articles/1912/16/news067.html