专栏集锦,大佬们可以收藏以备不时之需:
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 主要包括以下几个步骤:
- 下载和安装:首先,用户需要从 Nginx 的官方网站下载适合自己操作系统的 Nginx 版本。Nginx 提供了 Linux、Windows 等平台的版本。下载完成后,根据操作系统的不同,执行相应的安装程序。
-
配置:Nginx 的配置相对简洁。它使用基于文件系统的配置,主要通过修改配置文件来设置代理、缓存、负载均衡等。配置文件通常位于安装目录下的
nginx.conf
,此外还包括用于设置静态资源服务、虚拟主机等的额外配置文件。 -
启动和停止:通过执行安装目录下的
nginx
命令来启动 Nginx 服务,而停止服务通常可以通过nginx -s stop
或使用操作系统服务管理工具来实现。 -
测试:启动服务后,可以通过访问
http://localhost
或服务器 IP 地址来测试 Nginx 是否正常运行。 -
监控和维护: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-available
、sites-enabled
和 conf.d
目录,这些目录包含了虚拟主机的配置文件。
3.3 配置虚拟主机
要配置一个虚拟主机,您需要在 sites-available
目录下创建一个配置文件,然后将其符号链接到 sites-enabled
目录。在配置文件中,您可以设置服务器监听的主机名、端口、文档根目录等。例如:
server {
listen 80;
server_name example.com www.cssjc.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.cssjc.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_certificate
和ssl_certificate_key
:这些指令指定 SSL/TLS 证书和私钥的路径。确保这些文件是正确的,并且服务器用户有权限读取它们。 -
ssl_session_cache
和ssl_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_module
和 ngx_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_uses
和proxy_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.com
、srv2.example.com
和 srv3.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
模块中的 hash
、url_hash
、least_time
等指令,以及通过 map
模块进行更复杂的请求路由。
3.8 配置访问控制
在 Nginx 中,访问控制通常是通过 location
指令和 allow
、deny
指令来实现的。这些指令可以定义哪些客户端(基于 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.0
到192.168.1.255
的访问。 -
deny
指令用于指定拒绝访问的 IP 地址或地址范围。使用all
表示拒绝所有不匹配allow
指令的 IP 地址。 -
location
指令用于匹配特定的 URL 或路径。当请求的 URL 匹配到某个location
时,相应的allow
和deny
指令将被应用。
请注意,allow
和deny
指令在同一个location
中使用时,allow
指令的优先级高于deny
指令。这意味着如果请求的 IP 地址同时匹配到allow
和deny
,请求将被允许。
此外,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 的性能瓶颈,并采取相应的措施来提高其性能。请注意,优化应该是一个持续的过程,需要根据实际情况和需求进行调整。