traefik与nginx哪个更强?
代理已成为重要的网络组件,并经常与许多流行的互联网服务一起使用。代理服务器促进最终用户和 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
优点 | 缺点 |
|
|
特拉菲克
优点 | 缺点 |
|
|
- 成本分配适用于基于云和自托管的 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/