LoginSignup
0
0

私的サーバー構築日誌:nginx on docker でリバースプロキシ

Posted at

能書き

私的サーバー構築日誌:仕切り直しからの自宅サーバー構築の続きです。

今後、家庭内サーバーとして様々なWebサービスを立ち上げるつもりです。立ち上がるといいな… とりあえずGitLabが立ち上がる事は確定事項です。

複数のWebサーバーをDockerで立ち上げる場合には、リバースプロキシを設定しバーチャルホストの形で運用するのが定番でしょう。家庭内で私一人が使うならポート番号を振り分けても良いんですが、折角なので勉強を兼ねて、リバースプロキシに挑戦してみます。

と言っても難しい事は無いですし、記事のネタとしても同案多数のようですが。

目標

  • Dockerコンテナでリバースプロキシを立てる
    • リバースプロキシの動作確認の為に、DockerコンテナでWebサーバーを2つ立て、表示内容で区別できるようにする

参考文献

家庭内DNS

nginx

後はnginxの設定を見ながら試行錯誤してます。

nginxサーバー1

まず、我が家のサーバーのIPアドレスは172.16.1.2です。

ホスト側
HOST_IPADDR=172.16.1.2

1つ目のWebサーバーを立てます。基本的な設定ばかりなので、解説無しで一気に行きます。

ホスト側
cd
mkdir docker-nginx1
cd docker-nginx1
mkdir -p config/nginx
mkdir -p data/nginx
mkdir html
ホスト側
cat <<___ >docker-compose.yml
version: "3.9"
services:
  nginx1:
    image: nginx:latest
    container_name: nginx1
    ports:
      - 20080:80
    volumes:
      - ./config/nginx:/etc/nginx/conf.d
      - ./data/nginx:/var/log/nginx
      - ./html:/usr/share/nginx/html
___
cat <<___ >config/nginx/1st.conf
server {
    listen        80;
    server_name   _;
    server_tokens off;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
___
ホスト側
cat <<___ >html/index.html
<!DOCTYPE html>
<html lang="ja">
 <head>
 <meta charset="UTF-8" />
 <title>1st nginx</title>
</head>
<body>
 <h1>1st</h1>
 <p>hello,world</p>
</body>
</html>
___
ホスト側
docker compose up -d

動作確認。

ホスト側
curl http://$HOST_IPADDR:20080/

nginxサーバー2

2つ目のWebサーバーです。

ホスト側
cd
mkdir docker-nginx2
cd docker-nginx2
mkdir -p config/nginx
mkdir -p data/nginx
mkdir html
ホスト側
cat <<___ >docker-compose.yml
version: "3.9"
services:
  nginx1:
    image: nginx:latest
    container_name: nginx2
    ports:
      - 20081:80
    volumes:
      - ./config/nginx:/etc/nginx/conf.d
      - ./data/nginx:/var/log/nginx
      - ./html:/usr/share/nginx/html
___
cat <<___ >config/nginx/2nd.conf
server {
    listen        80;
    server_name   _;
    server_tokens off;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
___
ホスト側
cat <<___ >html/index.html
<!DOCTYPE html>
<html lang="ja">
 <head>
 <meta charset="UTF-8" />
 <title>2nd nginx</title>
</head>
<body>
 <h1>2nd</h1>
 <p>hello,world</p>
</body>
</html>
___
ホスト側
docker compose up -d

動作確認。

ホスト側
curl http://$HOST_IPADDR:20081/

proxy

いよいよ本命のリバースプロキシです。

ホスト側
cd
mkdir docker-proxy
cd docker-proxy
mkdir -p config/nginx
mkdir -p data/nginx
mkdir html

ここでproxy_passの転送先URLとして「localhost」と書くと問題が発生します。

どうやらlocalhostにはIPv6の関係で2つのIPアドレスが割り当てられており、それが原因との事。そこでIPアドレスを1つだけ指定するようにします。

127.0.0.1と書いても良いんですが。今回はホストマシンのIPアドレスを指定してみます。

ホスト側
cat <<___ >docker-compose.yml
version: "3.9"
services:
  proxy:
    image: nginx:latest
    container_name: proxy
    ports:
      - 80:80
    volumes:
      - ./config/nginx:/etc/nginx/conf.d
      - ./data/nginx:/var/log/nginx
      - ./html:/usr/share/nginx/html
___
cat <<___ >config/nginx/default.conf
server {
    listen        80 default_server;
    server_name   _;
    server_tokens off;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
___
cat <<___ >config/nginx/1st.conf
server {
    listen        80;
    server_name   1st.home;
    server_tokens off;

    location / {
        proxy_pass http://$HOST_IPADDR:20080;
    }
}
___
cat <<___ >config/nginx/2nd.conf
server {
    listen        80;
    server_name   2nd.home;
    server_tokens off;

    location / {
        proxy_pass http://$HOST_IPADDR:20081;
    }
}
___
ホスト側
docker compose up -d

家庭内DNS

家庭内DNSを設定します。

1st.home2nd.homeを追記します。Webサーバーを立てていない3rd.homeも追記している点に注意。後で動作確認する時に使います。

ホスト側
cd /etc/unbound/unbound.conf.d/
cat | sudo tee -a machines.list >/dev/null <<___
local-data: "1st.home. 3600000 IN A $HOST_IPADDR"
local-data: "2nd.home. 3600000 IN A $HOST_IPADDR"
local-data: "3rd.home. 3600000 IN A $HOST_IPADDR"
___

念の為に文法チェック。

ホスト側
unbound-checkconf

Unboundに設定を読み込ませます。

ホスト側
sudo systemctl restart unbound

動作確認

動作確認その1。

ホスト側
curl http://1st.home/

1st.homeに設定したindex.htmlが表示されます。

ホスト側
$ curl http://1st.home/
<!DOCTYPE html>
<html lang="ja">
 <head>
 <meta charset="UTF-8" />
 <title>1st nginx</title>
</head>
<body>
 <h1>1st</h1>
 <p>hello,world</p>
</body>
</html>

動作確認その2。

ホスト側
curl http://2nd.home/

1st.homeとは別に立てたWebサーバー2nd.homeにアクセスしています。

ホスト側
$ curl http://2nd.home/
<!DOCTYPE html>
<html lang="ja">
 <head>
 <meta charset="UTF-8" />
 <title>2nd nginx</title>
</head>
<body>
 <h1>2nd</h1>
 <p>hello,world</p>
</body>
</html>

動作確認その3。proxyを設定していないドメインを指定されたら、proxyのデフォルト設定に従ってエラーが表示されます。

ホスト側
curl http://3rd.home/
ホスト側
$ curl http://3rd.home/
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>

仕舞い

今回は実験だけです。動作確認が終わったら、各設定を削除しましょう。

ホスト側
cd
cd docker-proxy
docker compose down
cd ../docker-nginx2
docker compose down
cd ../docker-nginx1
docker compose down
cd ..
sudo rm -r docker-nginx1 docker-nginx2 docker-proxy
ホスト側
cd /etc/unbound/unbound.conf.d
sudo sed -i -e"/1st.home./d" -e"/2nd.home./d" -e"/3rd.home./d" machines.list
ホスト側
sudo systemctl restart unbound

nginxでリバースプロキシの基本的な設定を試みました。設定に関して碌に解説していませんが、基本的な設定なので問題は無いでしょう。
SSL化はまた後日になります。

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