前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx No, Traefik Yes

Nginx No, Traefik Yes

作者头像
newbe36524
发布2023-08-23 16:17:11
2390
发布2023-08-23 16:17:11
举报
文章被收录于专栏:newbe36524的技术专栏

As we all know, Nginx is a very popular reverse proxy server. It is very stable and has a lot of features. But I choose Traefik instead of Nginx as a reverse proxy in test environment since it is more suitable for my use case. In this post, I will explain why I choose Traefik instead of Nginx.

Background

I have a test environment which is running on a single server. It has a lot of services running on it. I want to expose these services to the internet. So I need a reverse proxy server to do this. I am used to using Swag as a reverse proxy for years, witch is based on Nginx. But it is a little bit hard to configure. So I want to find a better solution.

I want to find a reverse proxy server which meets the following requirements:

  1. It should be containerized. I don’t want to install it on the host machine.
  2. It should be easy to configure.
  3. It should support Let’s Encrypt to generate SSL certificates automatically.
  4. It should be easy to migrate to production environment if needed.

Swag

Swag^1 is a reverse proxy server based on Nginx, witch I used for years. It meets all the requirements above. Swag project provides a docker image to run it. And dozens of Nginx configuration template files for developers to use. If you are familiar with Nginx, you can easily configure it. But it is way too complex for beginners.

I choose Swag as my reverse proxy server instead of bare Nginx, because it supports Let’s Encrypt to generate SSL automatically by adding a few lines of configuration. It is very convenient.

Caddy

Caddy^2 is a web server written in Go. I tried this solution to solve my problem after doing some research.

For example, if you want to expose a service running on port 80, you just need to create a file named Caddyfile:

代码语言:javascript
复制
api.newbe.pro {
    reverse_proxy api:80
}

ws.newbe.pro {
    reverse_proxy ws:80
}

Then run Caddy with docker as following docker-compose file:

代码语言:javascript
复制
version: "3.4"

services:
    caddy:
        image: caddy
        container_name: caddy
        restart: unless-stopped
        ports:
            - 80:80
            - 443:443
        volumes:
            - ./Caddyfile:/etc/caddy/Caddyfile
            - ./data/caddy:/data
            - ./data/caddy/config:/config
    api:
        image: newbe36524/newbe.api
        container_name: api
        restart: unless-stopped
        environment:
            - ASPNETCORE_ENVIRONMENT=Development
        volumes:
            - ./data/api:/app/data
    ws:
        image: newbe36524/newbe.ws
        container_name: ws
        restart: unless-stopped
        environment:
            - ASPNETCORE_ENVIRONMENT=Development
        volumes:
            - ./data/ws:/app/data

Then configure my DNS to point api.newbe.pro and ws.newbe.pro to my server with A record. Then I can access my api service and ws service with https://api.newbe.pro and https://ws.newbe.pro respectively.

I finally gave up this solution because Caddy does not support many build-in plugins as Traefik does. Of course, you can compile Caddy with plugins you need. But I don’t want to do this.

Traefik

Traefik^3 is also a reverse proxy server written in Go. I can run it as following docker-compose file:

代码语言:javascript
复制
version: '3.4'

secrets:
    azure_client_id:
        file: "./secrets/azure_client_id.secret"
    azure_client_secret:
        file: "./secrets/azure_client_secret.secret"
    azure_tenant_id:
        file: "./secrets/azure_tenant_id.secret"
    azure_subscription_id:
        file: "./secrets/azure_subscription_id.secret"
    azure_resource_group:
        file: "./secrets/azure_resource_group.secret"

services:
    reverse-proxy:
        # The official v2 Traefik docker image
        image: traefik:v2.10
        container_name: "traefik"
        # Enables the web UI and tells Traefik to listen to docker
        command:
            - "--api.insecure=true"
            - "--providers.docker=true"
            - "--entrypoints.web.address=:80"
            - "--entrypoints.websecure.address=:443"
            - "--certificatesresolvers.myresolver.acme.dnschallenge=true"
            - "--certificatesresolvers.myresolver.acme.dnschallenge.provider=azuredns"
            - "--certificatesresolvers.myresolver.acme.email=contact@newbe.pro"
            - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
        environment:
            - "AZURE_CLIENT_ID_FILE=/run/secrets/azure_client_id"
            - "AZURE_CLIENT_SECRET_FILE=/run/secrets/azure_client_secret"
            - "AZURE_TENANT_ID=/run/secrets/azure_tenant_id"
            - "AZURE_SUBSCRIPTION_ID=/run/secrets/azure_subscription_id"
            - "AZURE_RESOURCE_GROUP=/run/secrets/azure_resource_group"
        secrets:
            - "azure_client_id"
            - "azure_client_secret"
            - "azure_tenant_id"
            - "azure_subscription_id"
            - "azure_resource_group"
        ports:
            # The HTTP port
            - "80:80"
            - "443:443"
            - "443:443/udp"
            # The Web UI (enabled by --api.insecure=true)
            - "8080:8080"
        volumes:
            # So that Traefik can listen to the Docker events
            - "/var/run/docker.sock:/var/run/docker.sock:ro"
            - "./letsencrypt:/letsencrypt"
    api:
        image: newbe36524/newbe.api
        container_name: api
        restart: unless-stopped
        environment:
            - ASPNETCORE_ENVIRONMENT=Development
        labels:
            - "traefik.enable=true"
            - "traefik.http.routers.api.rule=Host(`api.newbe.pro`)"
            - "traefik.http.routers.api.entrypoints=websecure"
            - "traefik.http.routers.api.tls.certresolver=myresolver"
    ws:
        image: newbe36524/newbe.ws
        container_name: ws
        restart: unless-stopped
        environment:
            - ASPNETCORE_ENVIRONMENT=Development
        labels:
            - "traefik.enable=true"
            - "traefik.http.routers.ws.rule=Host(`ws.newbe.pro`)"
            - "traefik.http.routers.ws.entrypoints=websecure"
            - "traefik.http.routers.ws.tls.certresolver=myresolver"

You can notice that all the configuration is in docker-compose file. I don’t need to create any other configuration file, it is very convenient. Traefik is not only support docker as a provider to automatically discover services, but also support Kubernetes if I want to migrate to Kubernetes in the future.

Conclusion

I choose Traefik instead of Nginx as a reverse proxy in test environment because it is more suitable for my use case. It is cloud native and easy to configure. I don’t need to create any other configuration file. I can configure everything in docker-compose file.

References

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Background
  • Swag
  • Caddy
  • Traefik
  • Conclusion
  • References
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档