Centos7でNginxをインストールして、Let’sEncryptによる無料証明書を発行して適用するところまで書きます。
Nginxのデフォルトのドキュメントルートは usr/share/nginx/html/
ですが、今回は /var/www/html
に変更します。
特に深い理由は無いですが、デフォルトのドキュメントルートが階層が深くてめんどくさいというのが、大きな理由です。あとApacheのドキュメントルートに慣れているので。
また今回はCentos7を使っていますが、Ubuntuであればyum
をapt
に変えれば大抵のことは大丈夫だと思います。
Oracle Cloudを使用している人は、ファイヤーウォールの設定などをする必要があります。
必要に応じてぐぐってください
当然ながら独自ドメインも必要です。
動作環境
- MacOS 10.15.6
- Centos7
- Nginx 1.16.1
ホストOSはWindowsでも大丈夫です。VMなのであまり関係ないです。
Nginx
インストール
Nginxをインストールします
$ sudo yum -y install nginx
-y
オプションは途中で聞かれる、インストールしても良いですか?ってやつを自動で入力してくれるやつです。
インストールが終わったら起動と、自動起動の設定を行います
自動起動の設定をしていないと、OSをシャットダウンや再起動した時にまた手動で起動しなければならないので、めんどくさいです。
$ sudo systemctl start nginx //起動
$ sudo systemctl enable nginx //自動起動
この時点でブラウザで自分のIPアドレスにアクセスすると、Nginxが動いているのが確認できます。
ドキュメントルート変更
Nginxの設定ファイルを変更してドキュメントルートを変更します。
まずは今回設定したいディレクトリが/var/www/html
なのでそのディレクトリを作ります。
$ sudo mkdir -p /var/www/html
次に設定ファイルをいじります。
場所は環境によるかもしれませんが、私の場合は /etc/nginx/nginx.conf
です
設定ファイルを変更する前には必ずバックアップを取る癖をつけましょう
$ sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_org
変更していきます。
私の環境では38行目くらいからhttpの設定項目だったので、そこのroot
のディレクトリを変更します。
念の為コメントアウトして書き足します。
$ sudo vim /etc/nginx/nginx.conf
38 server {
39 listen 80 default_server;
40 listen [::]:80 default_server;
41 server_name _;
42 #root /usr/share/nginx/html;
43 root /var/www/html;
設定ファイルを変更したら再読み込みします。
この再読み込みが失敗するときはなにかしら間違っているときです。
$ sudo systemctl reload nginx
この段階でブラウザで確認しても、何もひょうじされないか、404になると思います。
それもそのはず、/var/www/html
にはなにもないからです。
もともとあったデフォルトのぺージをコピーしましょう
$ sudo cp /usr/share/nginx/html/index.html /var/www/html/index.html
これでOKなはずですが、アクセスするとなぜかエラーが出ます。
SELINUX
SELINUXというセキュリティ機能が邪魔をしてきます。
正しく設定すればいいヤツなのでしょうが、これのせいで意図した挙動にならないことが多々あるので、思い切ってOFFにします\
$ sudo cp /etc/selinux/config /etc/selinux/config_org //バックアップ
$ sudo vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
### Disalbe SELINUX begin
##SELINUX=enforcing
SELINUX=disabled
### Disalbe SELINUX end
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
SELINUX=disabled
を追記します
書き直したら、再起動しましょう
$ sudo reboot
これでブラウザにアクセスすると閲覧できるようになります。
ドメインの設定
これはお名前ドットコムなど購入した先のサービスでいろいろあると思います。
AWSであれば、Route53などですね。さまざまなので割愛します
Let’sEncrypt
現状はこのように保護されていません
と表示されると思います。
このままだといろいろ問題があるので、http://~~
からhttps://~~
にします
Let’sEncrypt
インストール
certbotをインストールします
$ sudo yum -y install certbot
証明書を発行します
-w
の後ろはドキュメントルート、 -d
の後ろはドメイン名、--email
はメールアドレスを入力します
sudo certbot certonly --webroot -w /var/www/html -d hoge.example.com --email hoge@example.com
その後は利用規約に同意するか聞かれるので、y
Issueなどのお知らせメールを送ってもいいかきかれるので、よければy
、嫌ならn
を入れます
Congratulations!
と表示されたら成功です。
設定ファイルの変更
以下を追記します。
3箇所変更する項目があるので、注意してください
server {
listen 443 ssl;
server_name hoge.example.com;
ssl_certificate /etc/letsencrypt/live/hoge.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hoge.example.com/privkey.pem;
root /var/www/html;
}
これでNginxを再起動すれば完了です。
$ sudo systemctl restart nginx
301リダイレクト
現状だとhttp://~~
とhttps://~~
でどちらもアクセスできてしまいます。
http://~~
の方にアクセスさせる必要はないので、http
でアクセスしてきた時にリダイレクトする処理を書いてあげます
301リダイレクトとは、恒久的なリダイレクトを意味します
設定ファイルに追記します
$ sudo vim /etc/nginx/nginx.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
#root /usr/share/nginx/html;
root /var/www/html;
return 301 https://hoge.example.com/$request_uri; //追記
}
このようにすればリダイレクトされます!
証明書の自動更新
Let’sEncryptは無料が故に、90日で期限が切れます。
なので、自動更新できるように、cron
で設定します。
$ sudo crontab -e
00 04 01 * * certbot renew --force-renew --webroot-path /var/www/html/ --post-hook "systemctl reload nginx"
これで一通り完了です
参考
CentOS7 SELinuxの無効化手順
CentOS7 の Nginx で Let's Encrypt を使う
cronの設定方法