我读过一些建议nginx在 Node.js 应用程序之前使用反向代理的文章(例如 )(例如:Advantages of a reverse proxy in front of Node.JS)。这比运行 Node.js 本身并公开它更好(至少在安全性方面)。
但是,在 Docker 容器内运行 Node.JS 应用程序应该可以防止安全问题(因为应用程序在容器内运行并且与主机系统隔离)。
所以,我的问题是:在 Docker 容器中运行 Node.js 应用程序时使用反向代理有好处吗?如果是这样,它如何改进我的申请?
我正在尝试建立一个具有以下服务的群:
这会生成类似于以下内容的 docker-compose 文件:
version: '3'
services:
proxy:
image: nginx:1.13.5-alpine
ports:
- "80:80"
deploy:
placement:
constraints: [node.role == manager]
depends_on:
- api
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
networks:
- webnet
api:
image: user/webapp:latest
deploy:
replicas: 4
ports:
- "8000:8000"
depends_on:
- postgres
- redis
networks:
- webnet
postgres:
image: postgres:9.6.5-alpine
ports:
- "5432:5432"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
redis:
image: redis:4.0.2-alpine
ports:
- "6379:6379"
deploy:
placement:
constraints: [node.role …Run Code Online (Sandbox Code Playgroud) 有没有办法只对成功的请求(即 HTTP 状态代码 200)启用速率限制?
例如,在我的配置的以下片段中......
http {
limit_req_zone $binary_remote_addr zone=test:10m rate=2r/m;
server {
location / {
limit_req zone=test;
proxy_pass http://localhost:3000/;
...
}
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
...请求成功速率受到限制(每分钟最多两个请求)。
但是,由于这是用于向我发送电子邮件的联系表单,因此如果返回错误,我不关心速率限制,http://localhost:3000/因为不会发送任何电子邮件。
我已经使用 Nginx 启动了一个简单的 Docker 容器,我想使用这个 Docker Nginx 作为我的主机上的应用程序(HTTP Tomcat)的反向代理。但我的proxy_pass仅适用于意外的 IP 值。
预期行为:当我docker inspect在容器上使用时,我的网关是172.29.0.1,我的proxy_pass应该使用172.29.0.1。
当前:我必须使用172.18.0.1myproxy_pass才能使其工作,并且我不明白为什么这个随机值有效。如果我不使用172.18.0.1,则会出现 502 HTTP 错误,并且我的 docker 日志显示“上游连接被拒绝”。
我的Dockerfile(仅包含 1 行):
FROM nginx
我的docker-compose(我使用它docker-compse up --build来启动我的容器):
version: '3'
services:
nginx-web:
image: nginx-web
container_name: nginx-web-container
build: .
ports:
- "80:80"
volumes:
- ./volume-sources/nginx-conf-files:/etc/nginx/conf.d/
Run Code Online (Sandbox Code Playgroud)
我的nginx 文件(我的nginx-web值是网关 …
reverse-proxy nginx docker docker-compose nginx-reverse-proxy
我需要代理http://www.example.com/foo到http://<backend>/bar,使用 nginx 我有这样的配置:
server {
listen 80;
client_max_body_size 2048M;
server_name www.example.com;
location /foo {
proxy_pass http://container_name/bar/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
Run Code Online (Sandbox Code Playgroud)
我会将其转换为 traefik。这是我的撰写文件:
version: '3'
services:
traefik:
image: traefik:1.7.3-alpine
command: --api --docker
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
labels:
- traefik.enable=false
webapp:
...
...
labels:
- traefik.backend=bar
- traefik.frontend.rule=Host:www.example.com;Path:/foo/
- traefik.port=80
Run Code Online (Sandbox Code Playgroud)
有办法解决吗?
谢谢
我有一个包含 NginX、ElasticSearch 和 Kibana 的 Docker Compose 设置,如下所示:
web:
build:
context: .
dockerfile: ./system/docker/development/web.Dockerfile
depends_on:
- app
volumes:
- './system/ssl:/etc/ssl/certs'
networks:
- mynet
ports:
- 80:80
- 443:443
elasticsearch_1:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.0
container_name: "${COMPOSE_PROJECT_NAME:-service}_elasticsearch_1"
environment:
- node.name=elasticsearch_1
- cluster.name=es-docker-cluster
- discovery.seed_hosts=elasticsearch_2,elasticsearch_3
- cluster.initial_master_nodes=elasticsearch_1,elasticsearch_2,elasticsearch_3
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es_volume_1:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- mynet
elasticsearch_2:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.0
container_name: "${COMPOSE_PROJECT_NAME:-service}_elasticsearch_2"
environment:
- node.name=elasticsearch_2
- cluster.name=es-docker-cluster
- discovery.seed_hosts=elasticsearch_1,elasticsearch_3
- cluster.initial_master_nodes=elasticsearch_1,elasticsearch_2,elasticsearch_3
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m …Run Code Online (Sandbox Code Playgroud) 我正在使用 interfax.api dll 向用户发送传真。如何添加代理服务器配置以将传真发送给用户。实际上我想在.net core 中启用代理服务器设置。最好的方法是什么?
我尝试重定向到代理服务器 nginx。
location /phpmyadmin {
proxy_http_version 1.1;
proxy_pass https://${PMA}:5000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Run Code Online (Sandbox Code Playgroud)
但我收到错误:
nginx: [emerg] invalid number of arguments in "proxy_set_header" directive in /etc/nginx/nginx.conf:26
Run Code Online (Sandbox Code Playgroud)
此清单中检查错误的完整代码,因为我真的找不到某些错误(${env} = 脚本中的正确更改
user root;
worker_processes auto;
pcre_jit on;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
keepalive_timeout 3000;
sendfile on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/ssl/nginx.crt;
ssl_certificate_key /etc/ssl/nginx.key;
root /home;
index default.html /default.html;
location /phpmyadmin {
proxy_http_version 1.1;
proxy_pass https://${PMA}:5000/; …Run Code Online (Sandbox Code Playgroud) reverse-proxy nginx docker docker-compose nginx-reverse-proxy
我不确定出了什么问题。我刚刚开始学习docker,我正在尝试使用反向代理做一个项目。我在家里的 RPI 4 上运行 docker 和 docker-compose。但是,在使用以下信息创建并运行 docker-compose.yml 后,我遇到了问题:
version: '2.1'
services:
duckdns:
image: linuxserver/duckdns
container_name: duckdns
environment:
- PUID=1000 #optional
- PGID=1000 #optional
- TZ=America/New_York
- SUBDOMAINS=My_SubDomain,
- TOKEN=myToken
- LOG_FILE=false #optional
volumes:
- /home/pi/compose/data/duckdns/config:/config #optional
restart: unless-stopped
swag:
image: linuxserver/swag
container_name: swag
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1000
- TZ=America/New_York
- URL=My_SUBDOMAIN.duckdns.org
- SUBDOMAINS=www,
- VALIDATION=duckdns
- DNSPLUGIN=cloudflare #optional
- PROPAGATION= #optional
- DUCKDNSTOKEN=MY_TOKEN
- EMAIL= #optional
- ONLY_SUBDOMAINS=false #optional
- EXTRA_DOMAINS= #optional
- STAGING=false #optional …Run Code Online (Sandbox Code Playgroud) 背景:
\n几个月前我拿起一台旧服务器并启动了一个 Linux 项目。我学到了很多东西并且获得了很多乐趣。我正在使用服务器托管多个网站(这些网站仍在开发中,因为我也在学习网站开发)。在网上搜索了解了SSL/TLS证书、nginx、docker等。
根据我所学到的知识,我设置了 SWAG来使用 docker-compose 处理证书和反向代理。我将其他站点添加到同一个 docker-compose.yaml 文件中。经过一番努力,我终于能够让一切按照我想要的方式进行。我的每个站点都有 docker 容器,并且每个站点都有存根站点。我可以从任何浏览器访问它们。
\n我第一次停电并且服务器恢复时,docker 容器并未全部正确启动。我在 SWAG 容器上收到“地址已在使用中”错误。我用谷歌搜索解决方案并找到了这个答案建议找到并终止绑定到相关端口(对我来说是 80 和 443)的现有进程,以便 docker 容器(在我的例子中是 SWAG 容器)可以绑定到它们。我发现使用端口 80 和 443 的进程都是“docker-pr”。我杀死了它们,并且能够成功地重新启动 SWAG docker 容器,没有任何错误。但是,每次重新启动或重新引导服务器时,我都必须执行相同的步骤。
\n最近(过去几周)我还看到了另一个问题。我按照上述步骤操作,一切都按预期进行。然后,在 1-2 小时或 1-2 天后,我检查 docker 容器的状态,结果显示:
\nCannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?\nRun Code Online (Sandbox Code Playgroud)\n我查了一下,没有/var/run/docker.sock文件。我使用命令检查了 docker 守护进程的状态sudo service docker status,结果显示:
\xe2\x97\x8f docker.service - Docker Application Container Engine\n Loaded: loaded (/lib/systemd/system/docker.service; …Run Code Online (Sandbox Code Playgroud) reverse-proxy ×10
docker ×7
nginx ×7
asp.net-core ×1
interfax ×1
kibana ×1
kibana-7 ×1
node.js ×1
proxy ×1
raspberry-pi ×1
security ×1
traefik ×1
ubuntu-20.04 ×1