HTTPSアプリケーションをNginxに無停止で導入しましょう.


原情


AWS ACMとELBを使用してHTTPSを適用します.ただし、問題は8084ポートのみです.なぜなら、ターゲットグループには8084ポートしかないからです.
ただし、Nginx+SSL+ELBの関連例は、ターゲットポートが80であることを示している.下図のように.

構造が80->443に再起動され、HTTPSが先に適用される可能性があります.
Nginxはこれを受け取り、希望のポートに戻ったようです.

ELBとターゲットグループを修正した後


上の図のように80ポートに設定します.また、Route 53のAレコードにも交換のelbが採用されている.
Webサイトに再ログインすると、次のエラーが発生しました.

まず推測すると、ec 2に接続してnginxが受け取ったが、エラーが爆発したようだ.

Nginx適用後

 server {
        listen       80;
        server_name  ~.;
        # redirect https setting
        if ($http_x_forwarded_proto != 'https') {
                return 301 https://$host$request_uri;
        }
        include /etc/nginx/conf.d/service-url.inc;

        location / {
                proxy_pass $service_url;
                proxy_redirect off;

                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header HOST $http_host;
                proxy_set_header X-NginX-Proxy true;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}
443であればHTTPSであるため、/etc/nginx/conf.d/service-url.incのURLで渡される.
HTTPSリクエストでない場合は、HTTPSリダイレクト(301)を使用する.そして/etc/nginx/conf.d/service-url.incに書かれたURLに移動します.
うん...でもNginxに移動しましたがidleportが見つからないようです.
理由は以下の通り.
[ec2-user@dasd412-diabetes-diary-api zip]$ sudo curl -s http://localhost/properties
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.20.0</center>
</body>
</html>
find idle profile()内のcurlに従ってテストを行った.結果はnginxの301がhtml処理文字列を処理することを示す.
        if ($http_x_forwarded_proto != 'https') {
                return 301 https://$host$request_uri;
        }
削除しました.Linux Shellでcurlを試しましたが、今回は文字列が正常になりました.
もちろん、上の列が必要ですから、入れるべきです.しかしuriがpropertiesであればcurl httpを行うことができるはずである.

Nginxマルチifを迂回

    server {
        listen       80;
        server_name  ~.;
        # redirect https setting

        include /etc/nginx/conf.d/service-url.inc;
        set $need_redir 0;

        if ($http_x_forwarded_proto != 'https') {
                set $need_redir 1;
        }

        if ($request_uri = /properties){
                set $need_redir 0;
        }

        if ($need_redir = 1){
                return 301 https://$host$request_uri;
        }

        location / {
                proxy_pass $service_url;

                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header HOST $http_host;
                proxy_set_header X-NginX-Proxy true;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
構文では、Nginxおよびorはサポートされていません.したがって,C言語flagを変更するように使用すれば,マルチifのように使用できる.
意味は以下の通り.
httpでない場合、/properties API呼び出しでない場合は、HTTPSが直接使用されます.そうでなければ、HTTPを直接呼び出します.
適用後、Linux Shellからcurlから/propertiesを呼び出すと、正しい文字列は301.htmlではなく、real1であることが分かった.

解決と整理!!



2つのポートのアプリケーションは正常に動作しています.
原因はidle portが見つからないからです.
すなわち、httpsが適用された場合、以下のコードにより
        if ($http_x_forwarded_proto != 'https') {
                return 301 https://$host$request_uri;
        }
CURRENT_PROFILE=$(curl -s http://localhost/properties)のりんごの値は以下の通りです.
[ec2-user@dasd412-diabetes-diary-api zip]$ sudo curl -s http://localhost/properties
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.20.0</center>
</body>
</html>
従って、curl -s http://localhost/propertiesを行う場合、httpsリダイレクトを避けることができる!

グラフ#グラフ#





リファレンス


配置の基礎は李棟旭の『SpringBoot』の本だ.
(elbとターゲットグループ)
https://ondolroom.tistory.com/873
(ACM + ELB + Nginx)
https://medium.com/@vdongbin/aws-elb%EC%99%80-nginx%EB%A1%9C-https-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-736b8c5ee76
(Nginx)
https://developer88.tistory.com/299
(nginxマルチif)
https://gist.github.com/jrom/1760790
https://akageun.github.io/2018/01/12/nginx-multiple-if-statements.html