0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Centos7】【Let’sEncrypt】Nginxを入れてSSLを有効にするまで

Last updated at Posted at 2020-09-04

Centos7でNginxをインストールして、Let’sEncryptによる無料証明書を発行して適用するところまで書きます。

Nginxのデフォルトのドキュメントルートは usr/share/nginx/html/ですが、今回は /var/www/htmlに変更します。
特に深い理由は無いですが、デフォルトのドキュメントルートが階層が深くてめんどくさいというのが、大きな理由です。あとApacheのドキュメントルートに慣れているので。

また今回はCentos7を使っていますが、Ubuntuであればyumaptに変えれば大抵のことは大丈夫だと思います。

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

現状はこのように保護されていませんと表示されると思います。

スクリーンショット 2020-09-04 20.24.29.png

このままだといろいろ問題があるので、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の設定方法

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?