使用 nginx 和 docker 测试本地子域
Posted
技术标签:
【中文标题】使用 nginx 和 docker 测试本地子域【英文标题】:testing local subdomain with nginx and docker 【发布时间】:2019-01-26 12:03:20 【问题描述】:我正在尝试在我的 Mac 上本地设置一个简单的 Web 堆栈。
nginx 作为反向代理 react web 应用 #1 将在 localhost 上提供服务 react web 应用程序 #2 将在 demo.localhost 上提供我正在使用 docker-compose 一次旋转所有服务,这是文件:
version: "3"
services:
nginx:
container_name: nginx
build: ./nginx/
ports:
- "80:80"
networks:
- backbone
landingpage:
container_name: landingpage
build: ./landingpage/
networks:
- backbone
expose:
- 3000
frontend:
container_name: frontend
build: ./frontend/
networks:
- backbone
expose:
- 3001
networks:
backbone:
driver: bridge
这里是 nginx 配置文件(使用 Dockerfile 中的 COPY 命令复制到容器中):
worker_processes 1;
events
worker_connections 1024;
http
include /etc/nginx/mime.types;
gzip on;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain text/css
application/x-javascript text/xml
application/xml application/xml+rss
text/javascript;
upstream landingpage
server landingpage:3000;
upstream frontend
server frontend:3001;
server
listen 80;
server_name localhost;
location /
proxy_pass http://landingpage;
server
listen 80;
server_name demo.localhost;
location /
proxy_pass http://frontend;
我可以成功运行docker-compose up
,但只能打开web应用,而demo.localhost没有。
我还更改了我的 Mac 上的主机文件内容,所以我有
127.0.0.1 localhost
127.0.0.1 demo.localhost
无济于事。
恐怕我错过了什么,因为我既不是 Web 开发专家,也不是 docker 或 nginx!
【问题讨论】:
你找到答案了吗?我正在尝试这样做 我们最终能够使它在生产中工作,我将在下面发布解决方案 【参考方案1】:这对我有用。不同之处可能是我使用的是假域名,但我不能肯定。我也在使用 ssl,因为我无法让 Firefox 通过 http 访问假域名。我正在将子域路由到 Couchdb。 webclient 服务是parcel-bundler
开发服务器。
/etc/hosts
127.0.0.1 example.local
127.0.0.1 www.example.local
127.0.0.1 db.example.local
develop/docker-compose.yaml
version: '3.5'
services:
nginx:
build:
context: ../
dockerfile: develop/nginx/Dockerfile
ports:
- 443:443
couchdb:
image: couchdb:3
volumes:
- ./couchdb/etc:/opt/couchdb/etc/local.d
environment:
- COUCHDB_USER=admin
- COUCHDB_PASSWORD=password
webclient:
build:
context: ../
dockerfile: develop/web-client/Dockerfile
volumes:
- ../clients/web/src:/app/src
environment:
- CLIENT=web
- COUCHDB_URL=https://db.example.local
开发/nginx/Dockerfile
FROM nginx
COPY develop/nginx/conf.d/* /etc/nginx/conf.d/
COPY develop/nginx/ssl/certs/* /etc/ssl/example.local/
develop/nginx/conf.d/default.conf
server
listen 443 ssl;
ssl_certificate /etc/ssl/example.local/server.crt;
ssl_certificate_key /etc/ssl/example.local/server.key.pem;
server_name example.local www.example.local;
location /
proxy_pass http://webclient:1234;
server
listen 443 ssl;
ssl_certificate /etc/ssl/example.local/server.crt;
ssl_certificate_key /etc/ssl/example.local/server.key.pem;
server_name db.example.local;
location /
proxy_pass http://couchdb:5984/;
develop/web-client/Dockerfile
FROM node:12-alpine
WORKDIR /app
COPY clients/web/*.config.js ./
COPY clients/web/package*.json ./
RUN npm install
CMD ["npm", "start"]
Here is the blog 显示如何生成自签名证书。
【讨论】:
【参考方案2】:供参考:我们能够使用 AWS ligthsail 远程运行此程序,使用以下设置
worker_processes 1;
events
worker_connections 1024;
http
include /etc/nginx/mime.types;
gzip on;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain text/css
application/x-javascript text/xml
application/xml application/xml+rss
text/javascript;
upstream landingpage
server landingpage:5000;
upstream frontend
server frontend:5000;
server
listen 80;
if ($http_x_forwarded_proto != 'https')
return 301 https://$host$request_uri;
server_name domain.com www.domain.com;
location /
proxy_pass http://landingpage;
server
listen 80;
if ($http_x_forwarded_proto != 'https')
return 301 https://$host$request_uri;
server_name demo.domain.com www.demo.domain.com;
location /
add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex";
proxy_pass http://frontend;
为两个反应应用程序使用以下 dockerfile(基本上为两个服务公开端口 5000)
FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install --verbose
COPY . /usr/src/app
RUN npm run build --production
RUN npm install -g serve
EXPOSE 5000
CMD serve -s build
很遗憾,我无法提供有关在本地计算机上执行此操作的更多详细信息
【讨论】:
以上是关于使用 nginx 和 docker 测试本地子域的主要内容,如果未能解决你的问题,请参考以下文章
单个服务器上的多个子域。码头工人 + NGINX @ EC2