У меня есть приложение, которое содержит два компонента:
- интерфейс в React, работающий на Nginx
- фон в Spring
Оба были докеризованы и расположены в одной и той же сети Docker.
Приложение Spring предоставляет API, который используется во внешнем интерфейсе.
Внешний интерфейс доступен на http://mypublicaddress.com порту 80, который я хотел бы настроитьвнешние и внутренние Docker-контейнеры для отображения данных с точки зрения «внешнего» пользователя.Это означает, что интерфейс должен иметь возможность извлекать данные JSON из серверной части и отображать их пользователю.
Я начал с базового сценария, где во фронте был URL-адрес приложения Spring: http://backendcontainer:8080/people?name=john
Конечно, с точки зрения веб-браузера невозможно получить список людей по такому адресу.Backendcontainer контейнера доступен только из сети Docker.
Следующим шагом было расширение конфигурации Nginx путем добавления обратного прокси-сервера:
location /people {
root /usr/share/nginx/html;
proxy_pass http://backendcontainer:8080;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
}
Также полный адрес внутреннего URL-адреса в интерфейсе был заменен на относительный "/people "
Шаг вперед, теперь после звонка
http://mypublicaddress.com/people?name=john я получаю 502 Bad Gateway.Что я делаю не так?
Полный nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /people {
root /usr/share/nginx/html;
proxy_pass http://backendcontainer:8080;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
Dockerfile:
### STAGE 1: Build ###
FROM node:11-alpine as build
RUN mkdir /app
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
ENV NPM_CONFIG_LOGLEVEL warn
COPY package.json /app/package.json
RUN npm config set unsafe-perm true
RUN npm install --silent
RUN npm install react-scripts -g --silent
COPY . /app
RUN npm run build
### STAGE 2: Production Environment ###
FROM nginx:1.14-alpine
COPY --from=build /app/build /usr/share/nginx/html
COPY nginx.conf /data/conf/nginx.conf
EXPOSE 80
CMD ["nginx", "-c", "/data/conf/nginx.conf", "-g", "daemon off;"]
РЕДАКТИРОВАТЬ:
Наконец-то я получил его,Я заменил
location /people {
root /usr/share/nginx/html;
proxy_pass http://backendcontainer:8080;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
}
на:
location /people/ {
proxy_pass http://backendcontainer:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
, и он начинает работать.Однако не уверен, какая часть фрагмента кода была источником проблемы.