当前位置:首页 > 技术文章 > 正文内容

traefik与nginx哪个更强?

arlanguage4个月前 (01-17)技术文章37

代理已成为重要的网络组件,并经常与许多流行的互联网服务一起使用。代理服务器促进最终用户和 Web 服务器之间的请求和响应,提供增强路由控制、隐私和安全性的有用功能。NGINX 和 Traefik 是当前提供代理功能的最流行的工具。这两种解决方案都可以支持传统的基于服务器的部署和容器化应用程序环境,例如 Kubernetes。本文将深入研究这两种工具,并介绍它们的优缺点和显着特征。

NGINX 与 Traefik

我们在下面提供了一个功能比较表以供快速参考,本文将随着我们的进展提供更多详细信息。

功能性

NGINX 入口控制器

特拉菲克

负载均衡

服务器监控

缓存


路由自动发现

什么是 NGINX?

NGINX项目始于 2004 年,旨在提供高性能 Web 服务器。从那时起,它的受欢迎程度直线上升,成为行业市场的领导者,超过33.5% 的已知网站使用 NGINX。NGINX 在速度方面始终击败 Apache 等竞争解决方案。NGINX 已经发展到不仅仅是一个快速 Web 服务器,还提供负载平衡和缓存等附加功能,并且可以充当反向代理。

因此,NGINX 已成为最终用户、服务器和应用程序之间流行的中介。NGINX 还可以卸载 SSL 和压缩等网络工作负载,从而提高性能和整体用户体验。这些功能使 NGINX 成为为超过3.5 亿个网站提供支持的首选解决方案,其中包括 Dropbox 和 Netflix 等高流量 Web 服务。

什么是 Traefik?

Traefik是一种现代的云原生 HTTP 反向代理和负载均衡器。它为微服务提供了强大的支持,并与 Docker、Kubernetes、Rancher 和 Consul 集成。Traefik 需要最少的配置,并使用自动服务发现将路由注入后端服务。它通过监控底层编排或注册服务的 API 来实现这一点,而无需手动配置。

Traefik 于 2016 年作为云原生应用程序代理诞生。从那时起,它已发展成为全面的路由和负载平衡解决方案,受到 Mozilla、Expedia 和 Bose 等组织的信任,下载量超过 20 亿次,贡献者超过 500 名。除了核心代理服务之外,Traefik Labs 还提供Traefik mesh(容器服务网格)和Traefik Pilot(用于 Traefik 部署的集中管理实用程序)。

为什么将 Traefik 与 NGINX 进行比较?

将网络服务器与专用代理解决方案进行竞争似乎是一场不公平的战斗。尽管如此,NGINX 已经成熟到可以轻松地以代理角色运行的程度。通过提供入口服务,NGINX还支持基于云的环境,例如Kubernetes。因此,NGINX 和 Traefik 成为了功能重叠的竞争产品。

Traefik 与 NGINX

总体而言,Traefik 以其直观的 Web 界面和自动发现功能提供了更加用户友好的体验。NGINX 在这方面有所欠缺,但提供了更细粒度的控制。不过,这样做是以方便为代价的,因为用户必须手动设置和配置路由。

让我们快速了解一下每种工具的优点和缺点。下面您将找到两个参考表,您可以在需要时返回到它们。

NGINX

优点

缺点

  • 行业标准,拥有庞大的用户群
  • 更广泛的知识库和资源
  • 良好的速度和可靠性记录
  • 支持 HTTP、UDP 和 TCP 流量
  • Kubernetes 管理和维护入口控制器
  • 支持许多不同的环境,包括裸机和云服务,例如 EKS、AKS 和 GKE
  • 高度可定制且灵活
  • NGINX Plus通过添加企业级功能(例如高可用性、DNS 系统发现等)来扩展基本功能。
  • 不是云原生解决方案
  • 没有原生 Web UI
  • 配置可能相对复杂
  • 不自动发现服务

特拉菲克

优点

缺点

  • 针对微服务部署的云原生解决方案
  • 内置 Let's Encrypt 集成
  • 轻的
  • 配置相对简单
  • 自动发现允许以不干涉的方式进行路由配置
  • 支持 HTTP、UDP 和 TCP 流量
  • Traefik Pilot 允许集中管理多个环境
  • Traefik Mesh 提供 Kubernetes 网格服务
  • 与 DataDog、Prometheus、Grafana 等可观测平台直接集成。
  • Traefik Enterprise 提供企业级功能,包括高可用性、可扩展性、oAuth、LDAP 身份验证等。
  • 与 NGINX 相比相对较新
  • 代理功能仅限于代理和负载平衡
  • Traefik 的文档不如 NGINX
  • 缺乏 NGINX 提供的细粒度控制
  • Kubernetes 入口控制器作为第三方插件提供


  • 成本分配适用于基于云和自托管的 k8s
  • 见解效率、节约和健康
  • 永远免费对于单个集群

配置 Traefik 与 NGINX

在本节中,我们将演示如何配置 Trafik 和 NGINX 以在 Docker 和 Kubernetes 环境中工作。我们部署的基本目标是通过代理在两个 Web 服务器之间路由流量。所有示例均使用运行 Docker Desktop 4.8.1 和 Minikube v1.25.2 的 Windows 10。

Docker 中的简单 Traefik 配置

我们的第一步是启动 Traefik 容器,我们可以使用以下 docker-compose 文件来完成此操作。

docker-compose.yml

version: "3"

services:
  traefik-reverse-proxy:
    image: traefik:v2.7
    container_name: traefik-reverse-proxy
    # Enable the Web UI and set provider to docker
    command: --api.insecure=true --providers.docker
    ports:
      - "80:80"
      - "8080:8080" # Web UI Port
    volumes:
      # Listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - web

networks:
  web:
    name: web

使用命令docker-compose up -d创建容器。

现在,我们将创建一个撰写文件。该文件将包含一个标签,指示代理后面的容器的路由规则。该标签允许 Traefik 识别容器并创建必要的路由。

docker-compose.yml

version: "3"

services:
  nginx:
    image: nginx:latest
    container_name: nginx-webserver
    restart: unless-stopped
    # Label indicating the URL for autodiscovery
    labels:
      - "traefik.http.routers.nginx.rule=Host(`nginx.docker.localhost`)"
    ports:
      - 81:80
    networks:
      - web
  apache:
    image: httpd:latest
    container_name: apache-webserver
    restart: unless-stopped
    # Label indicating the URL for autodiscovery
    labels:
      - "traefik.http.routers.apache.rule=Host(`apache.docker.localhost`)"
    ports:
      - 82:80
    networks:
      - web

networks:
  web:
    name: web

注意- 确保 Traefik 可以访问容器运行的所有网络。否则,Traefik 将无法自动识别底层容器。

我们可以通过登录 Traefik 的 UI 并查看可用的服务来验证路由是否已成功创建。现在,两条路由应指向 Apache 和 NGINX,如下所示。


使用 Docker 进行简单的 NGINX 配置

当使用 NGINX 作为代理时,您必须在 NGINX 服务器本身内设置配置。在部署期间,您应该传递一个自定义的“ nginx.config ”文件,其中包含 NGINX 容器所需的路由。请看下面的例子。

默认配置

# Default Routing
server {
  listen 80 default_server;

  server_name _;
  root /var/www/html;

  charset UTF-8;

  location / {
    return 404;
  }

  access_log off;
  log_not_found off;
  error_log  /var/log/nginx/error.log error;
}

# Proxy Configuration for NGINX Server
server {
    listen 80;
    server_name nginx.docker.localhost;

    location / {
        proxy_pass http://nginx-webserver;
        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;
        proxy_buffering off;
        proxy_request_buffering off;
        proxy_http_version 1.1;
        proxy_intercept_errors on;
    }

    access_log off;
    error_log  /var/log/nginx/error.log error;
}

# Proxy Configuration for Apache Server
server {
    listen 80;
    server_name apache.docker.localhost;

    location / {
        proxy_pass http://apache-webserver;
        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;
        proxy_buffering off;
        proxy_request_buffering off;
        proxy_http_version 1.1;
        proxy_intercept_errors on;
    }

    access_log off;
    error_log  /var/log/nginx/error.log error;
}

通过将此default.conf文件指向容器内的default.conf文件来覆盖容器默认配置。

docker-compose.yml

version : "3"
services :
  nginx-proxy:
    image: nginx:latest
    container_name: nginx-proxy
    restart: unless-stopped
    ports:
      - 80:80
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
    networks:
      - nginx-network
      - apache-network

networks:
  nginx-network:
    name: nginx-network
  apache-network:
    name: apache-network

现在,我们需要创建底层容器。在这种情况下,我们不需要提供任何路由指示符或标签,因为我们之前指定了路由配置。请参阅下面的示例。

version : "3"
services :
  nginx:
    image: nginx:latest
    container_name: nginx-webserver
    restart: unless-stopped
    expose:
      - 80
    networks:
      - nginx-network

  apache:
    image: httpd:latest
    container_name: apache-webserver
    restart: unless-stopped
    expose:
      - 80
    networks:
      - apache-network

networks:
  nginx-network:
    name: nginx-network
  apache-network:
    name: apache-network

要测试代理配置,只需在浏览器中输入指定的 URL。路线将被触发并引导您到达正确的目的地。


使用 NGINX 和 Traefik 管理 Kubernetes Ingress

在配置入口服务之前,我们需要后端服务来提供服务器内的连接。我们将使用以下部署来创建两个运行 NGINX 和 Apache 的 Pod,以及两个为 Pod 提供连接的服务。

后端.yml

# NGINX Pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-webserver
spec:
  selector:
    matchLabels:
      run: nginx-webserver
  replicas: 1
  template:
    metadata:
      labels:
        run: nginx-webserver
    spec:
      containers:
      - name: nginx-webserver
        image: nginx
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
---
# Apache Pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache-webserver
spec:
  selector:
    matchLabels:
      run: apache-webserver
  replicas: 1
  template:
    metadata:
      labels:
        run: apache-webserver
    spec:
      containers:
      - name: apache-webserver
        image: httpd
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
---
# NGINX Service
apiVersion: v1
kind: Service
metadata:
  name: nginx-webserver
  labels:
    run: nginx-webserver
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: nginx-webserver
---
# Apache Service
apiVersion: v1
kind: Service
metadata:
  name: apache-webserver
  labels:
    run: apache-webserver
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: apache-webserver

使用“ kubectl apply ”命令应用配置。

通过运行“ kubectl get all ”命令验证资源是否已创建。

NGINX 入口配置

Minikube 入口插件会自动在本地 Kubernetes 集群中配置 NGINX 入口控制器。首先,使用以下命令启用插件。

minikube addons enable ingress.

我们现在将创建一个基于名称的虚拟主机入口,指向我们之前创建的服务,如下所示。

nginx-ingress.yml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    # Point to NGINX Service
    - host: nginx.k8s.localhost.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-webserver
                port:
                  number: 80
    # Point to Apache Service
    - host: apache.k8s.localhost.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: apache-webserver
                port:
                  number: 80

最后,使用以下命令应用上面的入口配置。

kubectl apply -f .\nginx-ingress.yml
kubectl get ingress

当您按照配置的 URL 操作时,您将被定向到相关的 Pod。


Traefik 入口配置

在 Kubernetes 中安装 Traefik 的最简单方法是通过 Helm Chart。只需运行以下命令。

helm repo add traefik https://helm.traefik.io/traefik
helm repo update
helm install traefik traefik/traefik.fffff

接下来,验证 Helm 图表是否按预期创建所需的 Pod 和服务。

下一步是为 Traefik 创建入口配置。“ router.entrypoint ”注释确保 Ingress 只监听 Helm Chart 创建的 Traefik 服务。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: traefik-ingress
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
    # Point to NGINX Service
    - host: nginx.k8s.localhost.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-webserver
                port:
                  number: 80
    # Point to Apache Service
    - host: apache.k8s.localhost.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: apache-webserver
                port:
                  number: 80

以下命令公开 Traefik Web UI。

kubectl port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name) 9588:9000

通过查看仪表板中的 HTTP 服务,您可以看到有两个入口路由。这些路由是为 Kubernetes 中的两个服务配置的,表明 Ingress 配置现已完成。



NGINX 和 Traefik 限制

在本文中,我们已经说明了 NGINX 和 Traefik 都提供了类似的功能。然而,这两种工具都不是完美的,我们希望提请您注意以下一些限制:

  • NGINX需要用户手动配置路由规则
  • Traefik入口控制器部署相对复杂
  • NGINX 比 Traefik 消耗更多资源
  • NGINX 没有本机 Web UI(尽管 NGINX 代理管理器等项目旨在弥补这一差距)

结论

在本文中,我们了解了 NGINX 和 Traefik 的起源和功能。我们还通过一些实际示例介绍了它们如何充当代理服务器以及如何配置它们。NGINX 和 Traefik 都是市场领导者,在容器化环境的爆炸性增长中发挥着重要作用。Traefik 是一种云原生且用户友好的工具,可以轻松部署到现有基础设施中。相反,NGINX 提供高度可定制且灵活的代理服务。虽然这两种解决方案都提供功能强大的代理服务,但 NGINX 是更全面的选择,它能够满足其他应用程序需求,例如缓存、托管和负载平衡。



欢迎大家提出不一样的观点,我们一起讨论,

我是辣个男人,一个运维人。


参考链接:
https://www.kubecost.com/kubernetes-devops-tools/traefik-vs-nginx/

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/958.html

标签: nginx httpd
分享给朋友:

“traefik与nginx哪个更强?” 的相关文章

Nginx的安装及配置详解 nginx1.12安装

Nginx是一个强大的免费开源的HTTP服务器和反向代理服务器。在Web开发项目中,nginx常用作为静态文件服务器处理静态文件,并负责将动态请求转发至应用服务器(Django, Flask, etc)。熟悉Nginx的配置对Web开发和运维人员来说至关重要。本文整理了Nginx的配置大全,可以作为...

linux系统安全,多人共用服务器,防止别人干‘坏事’

我们知道,在开发一个应用的过程中,需要涉及代码、操作系统、网络和数据库等多个方面。所以,只是了解代码安全肯定是不够的,我们还需要了解常见的基础环境和工具中的安全机制,学会通过正确地配置这些安全机制,来提升安全保障。谈到 Linux,我相信你每天都在使用 Linux 进行各种开发和运维操作。但是,大多...

Linux进程管理工具 Supervisor详解

Supervisor安装与配置(linux/unix进程管理工具) Supervisor(http://supervisord.org)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、...

IT运维面试问题总结-运维(Ceph、Docker、Apache、Nginx等

木二 YP小站运维工具简述Ansible及其优势?Ansible是一款极其简单的开源的自动化运维工具,基于Python开发,集合了众多运维工具(puppet, cfengine, chef, func, fabric)的优点。实现了批量系统配置,批量程序部署,批量运行命令等功能。同时Ansible是...

Nginx实现IP黑白名单

Nginx做黑白名单机制,主要是通过allow、deny配置项来实现allow xxx.xxx.xxx.xxx; # 允许指定的IP访问,可以用于实现白名单。 deny xxx.xxx.xxx.xxx; # 禁止指定的IP访问,可以用于实现黑名单。# --------黑名单:BlocksIP.c...

Nginx 四种分配方式——session处理

https://blog.csdn.net/lyj1101066558/article/details/54346110 最近迷上了Nginx,真实麻雀虽小,五脏俱全..功能实在强大..nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态、...