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

发布时间:2024年01月10日

专栏集锦,大佬们可以收藏以备不时之需:

Spring Cloud 专栏:http://t.csdnimg.cn/WDmJ9

Python 专栏:http://t.csdnimg.cn/hMwPR

Redis 专栏:http://t.csdnimg.cn/Qq0Xc

TensorFlow 专栏:http://t.csdnimg.cn/SOien

Logback 专栏:http://t.csdnimg.cn/UejSC

量子计算:

量子计算 | 解密著名量子算法Shor算法和Grover算法

AI机器学习实战:

AI机器学习实战 | 使用 Python 和 scikit-learn 库进行情感分析

AI机器学习 | 基于librosa库和使用scikit-learn库中的分类器进行语音识别

Python实战:

Python实战 | 使用 Python 和 TensorFlow 构建卷积神经网络(CNN)进行人脸识别

Spring Cloud实战:

Spring Cloud实战 |分布式系统的流量控制、熔断降级组件Sentinel如何使用

Spring Cloud 实战 | 解密Feign底层原理,包含实战源码

Spring Cloud 实战 | 解密负载均衡Ribbon底层原理,包含实战源码

1024程序员节特辑文章:

1024程序员狂欢节特辑 | ELK+ 协同过滤算法构建个性化推荐引擎,智能实现“千人千面”

1024程序员节特辑 | 解密Spring Cloud Hystrix熔断提高系统的可用性和容错能力

1024程序员节特辑 | ELK+ 用户画像构建个性化推荐引擎,智能实现“千人千面”

1024程序员节特辑 | OKR VS KPI谁更合适?

1024程序员节特辑 | Spring Boot实战 之 MongoDB分片或复制集操作

Spring实战系列文章:

Spring实战 | Spring AOP核心秘笈之葵花宝典

Spring实战 | Spring IOC不能说的秘密?

国庆中秋特辑系列文章:

国庆中秋特辑(八)Spring Boot项目如何使用JPA

国庆中秋特辑(七)Java软件工程师常见20道编程面试题

国庆中秋特辑(六)大学生常见30道宝藏编程面试题

国庆中秋特辑(五)MySQL如何性能调优?下篇

国庆中秋特辑(四)MySQL如何性能调优?上篇

国庆中秋特辑(三)使用生成对抗网络(GAN)生成具有节日氛围的画作,深度学习框架 TensorFlow 和 Keras 来实现

国庆中秋特辑(二)浪漫祝福方式 使用生成对抗网络(GAN)生成具有节日氛围的画作

国庆中秋特辑(一)浪漫祝福方式 用循环神经网络(RNN)或长短时记忆网络(LSTM)生成祝福诗词

在这里插入图片描述

1 Nginx 发展历史

Nginx 的历史可以追溯到 1990 年代末期,当时互联网开始迅速发展,传统的 HTTP 服务器如 Apache 开始显得力不从心,无法满足日益增长的访问量和并发请求。为了解决这个问题,Igor Sysoev 开始编写 Nginx,首个版本在 2004 年发布。Nginx 的设计理念是追求极高的性能和稳定性,同时还具有较低的内存消耗和资源占用,这使得它能够处理大量并发请求,非常适合于需要处理高负载的服务器环境。

  • 早期开发:Nginx最初是在Unix-like系统中运行的,使用C语言开发,并在一个BSD-like许可证下发布。它的设计受到了当时的网络环境以及Igor Sysoev作为系统管理员的工作经验的影响。
  • 版本迭代:随着时间的发展,Nginx逐渐增加了更多的功能,如SSL/TLS支持、虚拟主机、HTTP/2等,并且不断地对性能进行优化。
  • 社区和公司:2009年,Sysoev与别人合伙成立了Nginx公司,以支持Nginx的发展。2019年,Nginx公司被F5 Networks收购,成为其商业产品的一部分。
  • 创始人离职:2020年,Igor Sysoev宣布退出F5 Networks,以更多地关注家庭和个人项目。他在离职时得到了社区的高度评价和感谢,因为他的工作对Nginx的成功和互联网的发展有着深远的影响。

2 如何使用 Nginx

使用 Nginx 主要包括以下几个步骤:

  1. 下载和安装:首先,用户需要从 Nginx 的官方网站下载适合自己操作系统的 Nginx 版本。Nginx 提供了 Linux、Windows 等平台的版本。下载完成后,根据操作系统的不同,执行相应的安装程序。
  2. 配置:Nginx 的配置相对简洁。它使用基于文件系统的配置,主要通过修改配置文件来设置代理、缓存、负载均衡等。配置文件通常位于安装目录下的 nginx.conf,此外还包括用于设置静态资源服务、虚拟主机等的额外配置文件。
  3. 启动和停止:通过执行安装目录下的 nginx 命令来启动 Nginx 服务,而停止服务通常可以通过 nginx -s stop 或使用操作系统服务管理工具来实现。
  4. 测试:启动服务后,可以通过访问 http://localhost 或服务器 IP 地址来测试 Nginx 是否正常运行。
  5. 监控和维护:Nginx 提供了监控工具,比如 nginx -s status 来检查服务状态。此外,定期检查和更新软件,以及监控服务器性能和访问日志,对于维护 Nginx 服务是必要的。

3 详细配置 Nginx

配置 Nginx 是一个相对复杂的过程,下面将详细介绍如何配置 Nginx。

3.1 安装 Nginx

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

sudo apt update
sudo apt install nginx

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

sudo yum install epel-release
sudo yum install nginx

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

wget http://nginx.org/download/nginx-1.21.3.tar.gz
tar zxvf nginx-1.21.3.tar.gz
cd nginx-1.21.3
./configure
make
sudo 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://blog.csdn.net/superdangbo/article/details/135497517
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。