跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 工具系统 > 运营工具 > Nginx实战 | 高性能HTTP和反向代理神器Nginx前世今生,以及它的“繁花之境”

Nginx实战 | 高性能HTTP和反向代理神器Nginx前世今生,以及它的“繁花之境”

时间:2024-05-01 19:10:46 来源:网络cs 作者:欧阳逸 栏目:运营工具 阅读:

标签: 性能  实战  代理  前世 
3.1 安装 Nginx

在 Linux 系统中,您可以使用包管理器来安装 Nginx。例如,在 Ubuntu 或 Debian 上,您可以使用以下命令:

sudo apt updatesudo apt install nginx

在 CentOS 或 RHEL 上,您可以使用以下命令:

sudo yum install epel-releasesudo yum install nginx

如果您需要从源代码编译 Nginx,可以执行以下命令:

wget http://nginx.org/download/nginx-1.21.3.tar.gztar zxvf nginx-1.21.3.tar.gzcd nginx-1.21.3./configuremakesudo make install

3.2 配置文件结构

Nginx 的配置文件通常位于 /etc/nginx//usr/local/nginx/conf/。主要配置文件是 nginx.conf,它包含了全局配置。此外,还有 sites-availablesites-enabledconf.d 目录,这些目录包含了虚拟主机的配置文件。

3.3 配置虚拟主机

要配置一个虚拟主机,您需要在 sites-available 目录下创建一个配置文件,然后将其符号链接到 sites-enabled 目录。在配置文件中,您可以设置服务器监听的主机名、端口、文档根目录等。例如:

server {    listen 80;    server_name example.com www.example.com;    root /var/www/example;    index index.html index.htm;}

3.4 配置代理

Nginx 可以配置为反向代理服务器,将请求转发到后端服务器。在配置文件中,您需要设置代理服务器的主机名和端口,以及如何处理请求。例如:

location / {    proxy_pass http://backend-server:8080;    proxy_set_header Host $host;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}

3.5 配置 SSL/TLS

配置 Nginx 以使用 SSL/TLS 是保护网站安全性和用户隐私的重要步骤。以下是一个基本的指南,用于在 Nginx 中配置 SSL/TLS。

3.5.1 准备 SSL/TLS 证书和私钥

在配置 Nginx 之前,您需要有一个有效的 SSL/TLS 证书和相应的私钥。您可以从证书颁发机构(CA)获得证书,或者使用 Let’s Encrypt 提供的免费证书。如果您选择 Let’s Encrypt,可以使用 certbot 工具自动获取和配置证书。

3.5.2 配置 Nginx 服务器块

在 Nginx 配置文件中,通常在 server 块内添加 SSL/TLS 配置。以下是一个示例配置:

server {    listen 443 ssl;    server_name example.com www.example.com;    ssl_certificate /path/to/your/fullchain.pem;    ssl_certificate_key /path/to/your/privatekey.pem;    ssl_session_cache shared:SSL:1m;    ssl_session_timeout  10m;    ssl_ciphers HIGH:!aNULL:!MD5;    ssl_prefer_server_ciphers on;    root /var/www/example;    index index.html index.htm;}

3.5.3 配置要点解释

listen 443 ssl;:这指定服务器在端口 443 上监听 SSL/TLS 连接。ssl_certificatessl_certificate_key:这些指令指定 SSL/TLS 证书和私钥的路径。确保这些文件是正确的,并且服务器用户有权限读取它们。ssl_session_cachessl_session_timeout:这些指令配置 SSL 会话缓存和超时设置。ssl_ciphers:这个指令指定用于加密的 SSL 演算法。您应该选择强加密算法,并避免使用已弃用的算法。ssl_prefer_server_ciphers on;:这告诉客户端优先使用服务器提供的加密套件。

3.5.4 重启 Nginx 服务

在更新配置文件后,您需要重启 Nginx 服务以使更改生效:

sudo systemctl restart nginx

或者,如果您不是使用系统服务管理器,可以使用以下命令:

sudo nginx -s restart

3.5.5 测试 SSL/TLS 配置

在重启服务后,您应该测试 SSL/TLS 配置是否正确。您可以使用 curl 命令来测试:

curl -I https://example.com

您应该看到返回的响应中包含 HTTP/2 200 状态码,以及 SSL/TLS 相关的头部信息,表明 SSL/TLS 已正确配置。
请注意,SSL/TLS 配置可能会因您的具体需求和服务器配置而有所不同。确保遵循最佳实践,并定期更新您的证书和私钥。

3.6 配置缓存

Nginx 可以通过 proxy_cache 模块来缓存后端服务器的响应。这需要确保您的 Nginx 编译时包含了 ngx_http_proxy_modulengx_http_cache_module。大多数标准 Nginx 安装都包含这些模块。
以下是一个基本的 Nginx 缓存配置示例:

http {    proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=cache_zone:10m;    upstream backend {        server backend1.example.com;        server backend2.example.com;    }    server {        listen 80;        location / {            proxy_pass http://backend;            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_cache cache_zone;            proxy_cache_valid any;            proxy_cache_min_uses 1;            proxy_cache_max_uses 10;            proxy_cache_disk_mode async;            proxy_cache_exclude "*/charset/*.html";        }    }}

在这个例子中:

proxy_cache_path 指令用于设置缓存的存储路径和大小。levels=1:2 表示缓存的存储层次,keys_zone=cache_zone:10m 表示缓存的键值存储在内存中的大小为 10MB。upstream 定义了后端服务器组。proxy_pass 指令将请求转发到后端服务器。proxy_set_header 指令确保转发请求时携带必要的头部信息。proxy_cache 指令启用缓存,并指定缓存的键值存储在哪个 keys_zone 中。proxy_cache_valid 指令设置缓存的响应状态码,any 表示所有状态码的响应都可以缓存。proxy_cache_min_usesproxy_cache_max_uses 指令设置缓存的最低和最高使用次数。proxy_cache_disk_mode 指令设置磁盘 I/O 模式,async 表示异步模式,可以提高性能。proxy_cache_exclude 指令用于排除某些文件或目录的缓存。
请注意,这只是一个基本的缓存配置示例。在实际应用中,您可能需要根据具体情况调整缓存路径、大小、过期时间等。此外,Nginx 还支持更高级的缓存配置,如缓存动态内容、使用不同的缓存策略等。

3.7 配置负载均衡

Nginx 的负载均衡功能是通过其内置的 upstream 模块实现的。以下是一个基本的 Nginx 负载均衡配置示例:

http {    upstream myapp1 {        server srv1.example.com;        server srv2.example.com;        server srv3.example.com;        # 可以设置权重,如 server srv1.example.com weight=3;        # 其他负载均衡方法还包括 least_conn, ip_hash 等。    }    server {        listen 80;        location / {            proxy_pass http://myapp1;            # 在这里可以设置更多的代理设置,如 proxy_set_header, proxy_connect_timeout 等。        }    }}

在这个例子中,myapp1 是一个上游服务器组,它包含三个服务器:srv1.example.comsrv2.example.comsrv3.example.com。Nginx 将根据配置的负载均衡算法(默认是轮询)将请求分发到这些服务器上。

server 指令用于定义一个上游服务器,可以指定服务器的主机名或 IP 地址。weight 指令用于设置服务器的权重,权重越高的服务器将接收更多的请求。least_conn 指令用于启用最少连接数负载均衡算法,请求将被发送到当前连接数最少的服务器。ip_hash 指令用于启用基于源 IP 的哈希负载均衡算法,来自同一 IP 的请求总是被代理到同一台服务器,这有助于保持用户的会话。

3.7.1 健康检查

Nginx 还提供了健康检查功能,以确保上游服务器组的健康状态。以下是一个包含健康检查的配置示例:

http {    upstream myapp1 {        server srv1.example.com;        server srv2.example.com;        server srv3.example.com;        # 健康检查        health_check {            enable on;            interval 3000; # 每隔 3 秒检查一次            timeout 1000; # 超时时间            unhealthy_threshold 3; # 不健康连续检查次数            healthy_threshold 3; # 健康连续检查次数            http_get http://example.com/health; # 检查的 URL        }    }    server {        listen 80;        location / {            proxy_pass http://myapp1;            # 其他代理设置        }    }}

在这个例子中,health_check 指令用于配置健康检查。如果服务器在连续三次检查中都未能通过健康检查,它将被标记为不健康,并将不再接收新的请求。当服务器恢复健康时,它将重新加入上游服务器组。
请注意,这些示例仅用于说明 Nginx 负载均衡的基本配置。在实际应用中,您可能需要根据具体情况调整服务器地址、负载均衡算法、健康检查配置等。此外,Nginx 还支持更高级的配置,如使用 upstream 模块中的 hashurl_hashleast_time 等指令,以及通过 map 模块进行更复杂的请求路由。

3.8 配置访问控制

在 Nginx 中,访问控制通常是通过 location 指令和 allowdeny 指令来实现的。这些指令可以定义哪些客户端(基于 IP 地址)被允许访问特定的位置(URL 或路径)。以下是一个简单的访问控制配置示例:

http {    server {        listen 80;        location / {            # 允许来自特定IP地址的访问            allow 192.168.1.0/24;            # 拒绝来自特定IP地址的访问            deny all;        }        location /private/ {            # 只允许来自特定IP地址的访问            allow 192.168.1.10;            # 拒绝其他所有IP地址的访问            deny all;        }    }}

在这个例子中:

allow 指令用于指定允许访问的 IP 地址或地址范围。例如,192.168.1.0/24 表示允许来自 IP 地址 192.168.1.0192.168.1.255 的访问。deny 指令用于指定拒绝访问的 IP 地址或地址范围。使用 all 表示拒绝所有不匹配 allow 指令的 IP 地址。location 指令用于匹配特定的 URL 或路径。当请求的 URL 匹配到某个 location 时,相应的 allowdeny 指令将被应用。
请注意,allowdeny 指令在同一个 location 中使用时,allow 指令的优先级高于 deny 指令。这意味着如果请求的 IP 地址同时匹配到 allowdeny,请求将被允许。
此外,Nginx 还支持使用 geo 模块进行基于地理位置的访问控制,以及使用 map 模块进行更复杂的访问控制策略。这些功能可能需要额外的配置和模块支持。

3.9 配置日志

Nginx 的日志配置通常包括访问日志和错误日志。访问日志记录了客户端的请求信息,而错误日志记录了 Nginx 的错误信息。以下是如何配置这两种日志的示例:

3.9.1 访问日志

访问日志的配置通常在 http 块中进行,使用 log_format 指令定义日志的格式,然后使用 access_log 指令指定日志文件的路径和名称。

http {    log_format combined_with_time '$remote_addr - $remote_user [$time_local] '                                 '"$request" $status $body_bytes_sent '                                 '"$http_referer" "$http_user_agent" "$http_x_forwarded_for"';    server {        listen 80;        location / {            # 其他配置...        }        access_log /var/log/nginx/access.log combined_with_time;    }}

在这个例子中:

log_format 指令定义了一个名为 combined_with_time 的日志格式,它包括了客户端的 IP 地址、用户、请求时间、请求方法、状态码、传输的字节数、引用来源、用户代理和 X-Forwarded-For 头部。access_log 指令指定了日志文件的路径和名称,以及使用的日志格式。

3.9.2 错误日志

错误日志的配置通常在 http 块中进行,使用 error_log 指令指定日志文件的路径和名称。

http {    # 其他配置...    server {        listen 80;        location / {            # 其他配置...        }        error_log /var/log/nginx/error.log;    }}

在这个例子中:

error_log 指令指定了错误日志文件的路径和名称。

3.9.3 日志滚动

Nginx 也支持日志滚动,这意味着当日志文件达到一定大小时,它会自动切换到下一个文件。这可以通过 logrotate 指令配置。

http {    # 其他配置...    server {        listen 80;        location / {            # 其他配置...        }        access_log /var/log/nginx/access.log combined_with_time;        error_log /var/log/nginx/error.log;        logrotate {            daily;            rotate 7;            postrotate                /usr/sbin/nginx -s reopen;            endscript;        }    }}

在这个例子中:

logrotate 指令配置了日志的滚动策略,daily 表示每天滚动一次,rotate 7 表示保留最近的 7 个日志文件。postrotate 指令用于在日志滚动后执行命令,这里是通过 nginx -s reopen 命令重新打开日志文件。
请注意,这些示例仅用于说明 Nginx 日志配置的基本方法。在实际应用中,您可能需要根据具体情况调整日志格式、路径、滚动策略等。此外,Nginx 还支持更高级的日志配置,如使用 log_format 指令自定义日志格式,以及通过 map 模块进行更复杂的日志处理。

3.10 测试和优化

Nginx 的测试和优化可以通过多种方式进行,包括负载测试、性能测试、配置优化和代码级优化。以下是一些基本的步骤和方法:

3.10.1 负载测试

负载测试可以帮助你了解 Nginx 在高负载情况下的性能。可以使用工具如 Apache Bench(ab)或wrk来进行测试。
例如,使用 Apache Bench 进行测试的命令如下:

ab -n 1000 -c 100 http://your-nginx-server.com/

这个命令会向指定的 Nginx 服务器发送 1000 个请求,每次发送 100 个请求。

3.10.2 性能测试

性能测试可以帮助你了解 Nginx 的处理能力和响应时间。可以使用工具如 Siege 进行测试。
例如,使用 Siege 进行测试的命令如下:

siege -c 100 -r 1000 http://your-nginx-server.com/

这个命令会使用 100 个并发用户对服务器进行性能测试。

3.10.3 配置优化

优化 Nginx 的配置文件可以显著提高性能。以下是一些常见的优化建议:

减少 HTTP 头部的传输大小。开启 GZIP 压缩。使用 expires 指令设置缓存过期时间。使用 limit_req 模块限制请求速率。使用 limit_conn 模块限制并发连接数。
例如,以下配置可以减少 HTTP 头部的大小并开启 GZIP 压缩:
http {    server {        listen 80;        location / {            # 开启 GZIP 压缩            gzip on;            # 设置最小压缩文件大小            gzip_min_length 1k;            # 压缩缓冲区大小            gzip_buffers 16 8k;            # 设置压缩级别,1 压缩速度最快,9 压缩率最高,通常设置为4            gzip_comp_level 4;            # 对指定的 MIME 类型生效            gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;        }    }}

3.10.4 代码级优化

如果需要更深入的优化,可以修改 Nginx 的源代码。这通常涉及到内核级别的优化,需要具备相应的编程技能和知识。
例如,可以修改 Nginx 的 ngx_http_core_module 模块来优化 HTTP 请求的处理。

3.10.5 日志分析

分析 Nginx 的日志文件可以帮助你了解服务器的性能和问题所在。可以使用工具如 awk、grep 或 logstash 进行日志分析。
例如,使用 grep 查找所有 500 内部服务器错误的日志:

grep '500 Internal Server Error' /var/log/nginx/error.log

3.10.6 使用性能监控工具

使用性能监控工具如 Prometheus 和 Grafana 可以帮助你实时监控 Nginx 的性能指标,并进行相应的优化。
通过这些测试和优化方法,你可以了解 Nginx 的性能瓶颈,并采取相应的措施来提高其性能。请注意,优化应该是一个持续的过程,需要根据实际情况和需求进行调整。

本文链接:https://www.kjpai.cn/news/2024-05-01/164131.html,文章来源:网络cs,作者:欧阳逸,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论