[英]docker + nginx + node.js + php-fpm
每个人。
我在启动 Docker 容器时遇到了一些问题。 最后的任务是:
因此,主要问题在于 nginx.conf:
upstream app {
server app:3000;
}
server {
listen 80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
location / {
try_files $uri @app;
}
location /api {
try_files $uri /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass api:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location @app {
proxy_pass http://app;
}
}
当我尝试访问 localhost 时 - 没关系,node.js 工作正常; 但是,当我尝试访问 localhost/api 时 - 它给了我一个找不到文件的错误。
docker-compose 看起来像:
version: '3'
services:
api:
container_name: api
build:
context: ./api
dockerfile: Dockerfile
restart: unless-stopped
volumes:
- ./api:/var/www
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
ports:
- '9000:9000'
networks:
- app-network
app:
container_name: app
build:
context: ./app
dockerfile: Dockerfile
restart: always
ports:
- '3000'
volumes:
- ./app:/app
networks:
- app-network
nginx:
container_name: nginx
image: nginx:alpine
restart: unless-stopped
volumes:
- ./api:/var/www
- ./nginx/:/etc/nginx/conf.d
ports:
- '80:80'
depends_on:
- app
- api
networks:
- app-network
networks:
app-network:
driver: bridge
我已经多次使用 apache 和 nginx 设置反向代理,但我总是发现这项活动很耗时(不容易测试和调试)。
自从我开始使用 docker 和 docker-compose 后,我找到了一种更简单的方法来设置反向代理服务,现在可以将时间花在应用程序上。 这种简单的方法是在docker compose 文件中使用Traefik服务:
version: "3"
services:
reverseproxy: # see https://docs.traefik.io/#the-traefik-quickstart-using-docker
image: traefik:v2.2
command: --providers.docker
ports:
- "8082:80"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
backend:
image: tutum/hello-world
expose:
- 80
labels:
traefik.http.routers.back.rule: Path(`/api`)
traefik.http.routers.back.middlewares: back-stripprefix
traefik.http.middlewares.back-stripprefix.stripprefix.prefixes: /api
frontend:
image: nginx
volumes:
- ./www:/usr/share/nginx/html/:ro
expose:
- 80
labels:
traefik.http.routers.front.rule: Path(`/`)
如您所见,所有反向代理规则都指定为目标容器上的标签。 Traefik 很好地完成了反向代理工作,正确处理了 HTTP/2、websockets、转发标头……这非常节省时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.