本篇概要

最近在学习 docker 以及遇到一个需要 HTTP 内网穿透的事情,大致是本地的电脑 docker 构筑一个 laravel 环境,使用 frp 反向代理,服务器用私人 aws 。 服务器和客户端都使用了 docker-compose 。 frp 配置相关参考 frp 官方文档

服务器配置

  • 目录结构如下: nginx + frp 。
├── docker-compose.yml
├── frp
│   ├── config
│   │   └── frps.ini
│   └── logs
│       └── frps.log
└── nginx
    ├── config
    │   ├── conf.d
    │   │   └── default.conf
    │   ├── config.d
    │   └── nginx.conf
    └── logs
        ├── access.log
        └── error.log
  • docker-compose.yml 文件内容:
version: "3"
services:
  nginx:
    image: nginx
    container_name: nginx
    restart: always
    volumes:
      - ./nginx/config/conf.d:/etc/nginx/conf.d
      - ./nginx/logs:/var/log/nginx
    ports:
      - "80:80"
    environment:
      - NGINX_PORT=80
    links:
      - frp
  
  frp:
    image: snowdreamtech/frps
    container_name: frp
    restart: always
    ports:
      - "7000:7000" # bind_port
      - "7500:7500" # for frp dashboard
    volumes:
      - ./frp/config/frps.ini:/etc/frp/frps.ini
      - ./frp/logs:/var/log
  • nginx 配置文件 default.conf
server {
    listen       80;
    location / {
        proxy_pass http://frp:8888; # frp HTTP 代理转发port。这里因为使用了已命名为 frp 的 docker 容器,所以可以在nginx配置中直接使用。
        proxy_set_header    Host $host; # 不要忘记这句 Host $host
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-Forwarded-Proto https;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
  • frp 配置文件 frps.ini
[common]
bind_port = 7000
bind_addr = 0.0.0.0
vhost_http_port = 8888

dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = adminpwd

log_file = /var/log/frps.log

客户端配置

  • 目录结构如下
Dockerfile
docker-compose.yml
docker
├── app
│   └── conf
│       └── php
│           ├── docker.conf
│           └── php.ini
├── db
├── frp
│   ├── config
│   │   ├── frpc.ini
│   │   └── frps.ini
│   └── logs
└── nginx
    ├── Dockerfile
    └── conf
        └── default.conf

docker 目录位于项目内。 Dockerfile 以及客户端的 nginx 具体配置与此次主题无关,所以忽略。

  • docker-compose.yml 文件内容如下:
version: '3'
services:
  nginx:
    container_name: nginx
    build: ./docker/nginx
    ports:
      - 8090:80
      - 8443:443
    volumes:
      - ./:/app
    depends_on:
      - app
    links:
      - frp

  frp:
    image: snowdreamtech/frpc
    container_name: frp
    restart: always
    ports:
      - "5000:5000"
    volumes:
      - ./docker/frp/config/frpc.ini:/etc/frp/frpc.ini
      - ./docker/frp/logs:/var/log/frpc.log
  • 客户端 frp 配置 frpc.ini 如下:
[common]
server_addr = xxx.xxx.xxx.xxx # 远程服务器地址
server_port = 7000 # bind port  与上文服务器端设定一致
http_proxy =    # 此处设定留空

[web]
type = http
local_port = 80  # 使用 nginx 容器的 port
local_ip = nginx  # 使用 nginx 容器的 ip
custom_domains = your.domain.com