CentOS7 Nginxの導入とHTTPS化

CentOS7 Nginx

概要

CentOS7でDjangoを動かすシリーズの一つです。CentOS7にNginxを導入し、Webサーバー機能を持たせます。また、Let’s EncryptでHTTPS化の例も紹介します。narito.ninja というドメインを取得している前提で紹介していきますが、ドメインを取得していない場合はHTTPS化はできませんので、その場合はNginxのインストールと設定だけ参考にしてください。

Nginxのインストールと設定

まずは、WebサーバーのNginxをインストールします。

sudo yum install -y nginx

Nginxの起動と、自動起動の設定。

sudo systemctl start nginx
sudo systemctl enable nginx

http(80番ポート)をちゃんと開けておきます。

sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload

Webブラウザで、http://narito.ninja/ にアクセスするとこんな画面です。初期ページですね。ドメインがない方は、narito.ninjaの代わりにIPアドレスを入れてください。
Nginxの初期画面

HTTPS化

ドメインがあれば、Let’s Encryptを使ったHTTPS化もやっておいて損はないでしょう。まずはyumでインストール。

sudo yum install epel-release
sudo yum install certbot

以下のコマンドで、簡単にHTTPS対応できます。メールアドレスとか聞かれると思うので、正直に答えます。

sudo systemctl stop nginx
sudo certbot certonly --standalone -d narito.ninja
sudo systemctl start nginx

無事におわれば、Nginxの設定ファイルを編集します。

sudo vim /etc/nginx/conf.d/narito.ninja.conf

前半はhttpのアクセスをhttpsへリダイレクトする設定です。httpでページを公開する気がない場合でも、リダイレクト設定をしておくとベターです。後半がSSLの設定部分です。

server {
        listen 80;
        listen [::]:80;
        server_name narito.ninja;
        return 301 https://$host$request_uri;
}

server {
        listen  443 ssl;
        server_name     narito.ninja;
        ssl on;
        ssl_certificate         /etc/letsencrypt/live/narito.ninja/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/narito.ninja/privkey.pem;
}

httpsポート(443)を開けておくようにしましょう。

sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

再起動したら、https://narito.ninja (自分のドメインを入れてね)でアクセスしてみましょう。

sudo systemctl reload nginx

3か月で証明書が切れるので、cronでの自動更新を行います。

sudo crontab -e

日曜日ちょっきしに更新するようにしています。

00 0 * * 0 certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"

リンク

非公式の解説サイトが丁寧です。
Let's Encrypt 総合ポータル

Relation Posts

CentOS7でDjangoを動かすシリーズ

CentOS7、Nginx、Gunicornの環境でDjangoを動作させる上での、個人的なまとめ記事です。

シリーズ・まとめ CentOS7

Comment

記事にコメントする

福井高志

お世話になります。いつも参考にさせて頂いております。
cronの自動更新も設定したつもりなのですが、Let's encryptの有効期限が切れてしまい、更新も出来なくなってしまいました。

更新のためのプログラムをweb調べて、terminalで

sudo certbot certonly --webroot -w /usr/share/nginx/html -d xxx.com

と打ち込むと、以下のエラーが返って来ます(xxx.comが独自ドメイン)。

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

Domain: xxx.com
Type: unauthorized
Detail: Invalid response from
http://xxx.com/.well-known/acme-challenge/brXU9alyU3nsqrEvMIUWhj_KibdQFVsqaeU-_TVR9iQ
[153.126.205.90]: "<html>\r\n<head><title>404 Not
Found</title></head>\r\n<body>\r\n<center><h1>404 Not
Found</h1></center>\r\n<hr><center>nginx/1.16.1</ce"

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.

とりあえず有効期限を更新してHPを見られるようにしたく、アドバイス頂けますと幸いです。
よろしくお願い致します。

返信する

なりと

修正しました。次のようにしてください。
```python
00 0 * * 0 certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"
```

手動で更新したい場合は、`sudo certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx`としてください。

名無し

有難うございます。が、更新しようとするとやはりエラーになってしまいました。
出てくるメッセージで前回と変わったところは以下の2点で、

Cleaning up challenges
Attempting to renew cert (xxx.com) from /etc/letsencrypt/renewal/xxx.com.conf produced an unexpected error: Some challenges have failed.. Skipping.
All renewal attempts failed. The following certs could not be renewed:
/etc/letsencrypt/live/xxx.com/fullchain.pem (failure)

と言うメッセージが出てくるようになったのと、
先ほどお送りしたエラーメッセージ部分が

Domain: xxx.com
Type: connection
Detail: Fetching
http://xxx.com/.well-known/acme-challenge/zTSmsH_g1jfh69WO_8RzDXeraUs_QUFOYkG0jaBpKaE:
Connection refused

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. Additionally, please check that
your computer has a publicly routable IP address and that no
firewalls are preventing the server from communicating with the
client. If you're using the webroot plugin, you should also verify
that you are serving files from the webroot path you provided.

に変わりました(Typeがunauthorizedからconnectionになり、Connection refusedと出て来る&最後のアドバイス的な部分にも追記)。

なりと

Nginx+Djangoのような設定だと、webrootよりもstandaloneプラグインのほうが確実な気がしてきました。次のように試してください。
```
sudo systemctl stop nginx
sudo certbot certonly --standalone -d ドメイン名
sudo systemctl start nginx
```

その後の自動更新は、次のようなcronで問題ないと思います。
```
00 0 * * 0 certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"
```

名無し

出来ました!ありがとうございます!!