我搭建服务器日志:使用Docker上的Nginx进行反向代理

書法上佳

我的服务器建设日志:从重新开始到家庭服务器的建设继续。

我打算以家庭内服务器的形式启动各种网络服务。希望能够完全启动…暂时确定的是GitLab会被启动。

如果要在Docker上运行多个Web服务器,设置反向代理并使用虚拟主机运营将是常见做法。如果只有我一个人在家中使用,也可以分配端口号,但既然有机会,为了学习的目的,我会尝试挑战反向代理。

尽管这并不是一件困难的事情,而且作为文章的素材也似乎有很多类似的建议。

达到的目标

    • Dockerコンテナでリバースプロキシを立てる

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

文献引用

家庭内部的域名系统(家庭内部的DNS)

私的サーバー構築日誌:LAN内DNSサーバー Unbound – Qiita … 我が家の家庭内DNSです。バーチャルホストを動かす為に、少し追記が必要になります。

nginx – 单个选项上进行原生中文的释义

Web(ブラウザ)と Nginx(プロキシ)間で HTTPS で通信する – docker-composeでNginx(リバースプロキシ)を立てて、ローカルでHTTPS通信をやってみた … docker compose でnginxサーバーを立てるのに、これを参考にしました。

Docker – 私的サーバー構築日誌:Docker on ZFS – Qiita … 手前味噌ながら、最小の手間でnginxのdockerコンテナを立てるには、これが一番かと。
nginxでデフォルトのバーチャルホストを設定する方法 – Linux入門

我在参考nginx的设置同时不断试错。

nginx服务器1

首先,我家服务器的IP地址是172.16.1.2。

HOST_IPADDR=172.16.1.2

我将建立第一个网络服务器。由于只涉及基本设置,所以我将一口气完成,无需解释。

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

这是第二台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/

代理 lǐ)

终于到了正牌的反向代理服务器。

cd
mkdir docker-proxy
cd docker-proxy
mkdir -p config/nginx
mkdir -p data/nginx
mkdir html

如果在这里把proxy_pass定向到”localhost”,会出现问题。

看起來由於IPv6的原因,localhost被分配了兩個IP地址,這就是問題所在。因此我們將只指定一個IP地址。

虽然可以写成 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.home和2nd.home。请注意,还添加了没有设置网页服务器的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

确认动作

动作确认一。

curl http://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>

第二次動作確認。

curl http://2nd.home/

我在与第一个home不同的服务器上搭建了一个Web服务器,然后访问了第二个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个动作确认。如果指定了没有设置代理的域名,则会根据代理的默认设置显示错误。

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证书将在以后的某个时间进行。

bannerAds