目录
1.ngx_http_rewrite_module 模块指令
2.2.域名永久(permanent)与临时重定向(redirect)
引言
在数字化时代,企业网站的性能直接关联到用户体验和业务成果。高性能的Web服务器不仅能够应对日益增长的用户访问量,还能保证数据的快速处理和传输。本文将深入探讨如何通过优化Web服务器配置,实现企业级服务的高性能目标。
一、 Web服务器基础与发展历程
1.互联网与Web服务发展简史
自1993年中国接入Internet以来,互联网服务经历了飞速的发展。从最初的中国黄页、阿里巴巴的创建,到淘宝、支付宝的诞生,再到天猫的更名和阿里巴巴集团的上市,每一个里程碑都标志着互联网服务的一次重大进步。
Web服务器作为互联网信息服务的核心,也经历了不断的技术革新。从Apache的经典Web服务端到Nginx的高性能服务端,技术的演进使得Web服务器能够更好地应对高并发、高可用性的需求。
2. Apache与Nginx的性能对比
2.1 Apache服务器
Apache服务器以其稳定性和广泛的社区支持而闻名。它通过不同的模型(如prefork、worker、event)来处理Web请求,适应不同的应用场景。
Apache prefork 模型
- 预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024
- 每个子进程有一个独立的线程响应用户请求
- 相对比较占用内存,但是比较稳定,可以设置最大和最小进程数
- 是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
优点:稳定
缺点:每个用户请求需要对应开启一个进程,占用资源较多,并发性差,不适用于高并发场景
Apache worker 模型
- 一种多进程和多线程混合的模型
- 有一个控制进程,启动多个子进程
- 每个子进程里面包含固定的线程
- 使用线程程来处理请求
- 当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求
- 由于其使用了线程处理请求,因此可以承受更高的并发
优点:相比prefork 占用的内存较少,可以同时处理更多的请求
缺点:使用keepalive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超 时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用(该问题在 prefork模式下,同样会发生)
Apache event模型
- Apache 中最新的模式, 2012 年发布的 apache 2.4.X 系列正式支持 event 模型 , 属于事件驱动模型 (epoll) 每个进程响应多个请求,在现在版本里的已经是稳定可用的模式
- 它和 worker 模式很像,最大的区别在于,它解决了 keepalive 场景下长期被占用的线程的资源浪费问题(某些线程因为被keepalive ,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)
- event MPM 中,会有一个专门的线程来管理这些 keepalive 类型的线程
- 当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理
keepalive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许
它释放
缺点:没有线程安全控制
2.2 Nginx服务器
Nginx以其轻量级、高并发处理能力而受到青睐。它的事件驱动模型和高效的内存管理机制,使其在处理静态内容和代理服务时表现卓越。
3. 用户访问体验的重要性
3.1 用户速度体验原则
用户对网页加载速度的容忍度非常有限。根据1-3-10原则:
- 1秒内完成加载的网页提供最佳用户体验。
- 1-3秒内加载完成的网页用户体验较好。
- 3-10秒内加载完成的网页用户体验较差。
- 超过10秒未能加载完成的网页,用户将难以接受,可能导致大量用户流失。
3.2 影响用户体验的因素
客户端因素
- 硬件配置:客户端设备的处理能力影响页面渲染速度。
- 网络速率:用户的网络连接速度直接关系到数据加载时间。
- 地理距离:客户端与服务端的物理距离影响数据传输延迟。
服务器因素
- 网络速率:服务端的网络带宽和稳定性对响应速度至关重要。
- 硬件配置:服务器的CPU、内存和存储性能直接影响处理能力。
- 架构设计:服务端的软件架构和代码优化对性能有显著影响。
- 应用程序工作模式:如Apache和Nginx的不同工作模式对并发处理能力有差别。
- 并发数量:服务端能够同时处理的请求数量。
- I/O性能:磁盘和网络I/O性能影响数据处理和传输效率。
4. 服务端I/O流程与性能
服务端的I/O(输入/输出)性能是决定Web服务器响应速度的关键因素之一。了解服务端I/O流程对于优化Web服务器性能至关重要。
4.1 I/O基本概念
I/O是计算机中处理数据输入和输出的过程。在Web服务器中,I/O通常涉及磁盘I/O和网络I/O,它们共同决定了数据处理和传输的效率。
4.2 磁盘I/O
磁盘I/O涉及从磁盘读取或写入数据的过程。它包括以下几个关键步骤:
- 寻道时间:磁头移动到正确的磁道上所需的时间。
- 旋转延迟:磁盘旋转到数据所在扇区所需的时间。
- 数据传输时间:从磁盘读取数据到内存或相反过程所需的时间。
4.2.1 磁盘性能指标
- IOPS(每秒输入/输出操作数):衡量磁盘性能的主要指标,表示单位时间内系统能处理的I/O请求数量。
4.2.2 磁盘I/O计算方法
对于不同转速的磁盘,可以通过以下公式计算其最大IOPS:
- 7200转磁盘:IOPS=1000寻道时间+平均旋转延迟时间IOPS=寻道时间+平均旋转延迟时间1000
- 10000转磁盘:调整上述公式中的转速参数即可。
4.3 网络I/O
网络I/O涉及通过网络传输数据的过程。它包括以下步骤:
- 获取请求数据:客户端与服务器建立连接并发出请求。
- 构建响应:服务器接收请求,并在用户空间处理客户端的请求。
- 返回数据:服务器将构建好的响应通过内核空间的网络I/O发送回客户端。
4.3.1 网络I/O性能影响因素
- 带宽:网络连接的最大数据传输速率。
- 延迟:数据从客户端发送到服务器,再从服务器返回客户端所需的时间。
- 丢包率:网络中数据包丢失的比例,影响数据传输的可靠性。
5. I/O模型详解
在现代Web服务器和应用程序的设计中,I/O模型对于性能和可伸缩性起着至关重要的作用。理解不同的I/O模型可以帮助我们更好地编写高效、可扩展的代码。
5.1 I/O模型相关概念
5.1.1 同步与异步
- 同步(Synchronous):调用者在等待操作完成期间,不会接收到任何完成状态的通知,需要主动查询操作是否完成。
- 异步(Asynchronous):被调用者在操作完成时,通过状态、通知或回调机制主动通知调用者。
5.1.2 阻塞与非阻塞
- 阻塞(Blocking):在I/O操作完成之前,调用者无法执行其他任务。
- 非阻塞(Non-blocking):调用者在发起I/O请求后可以立即返回,无需等待操作完成。
5.2 网络I/O模型
5.2.1 阻塞型I/O模型
- 用户线程发起I/O请求后,必须等待操作完成才能继续执行其他任务。
- 优点:实现简单,CPU资源占用低。
- 缺点:在高并发场景下效率低,因为每个连接都需要独立的线程或进程。
5.2.2 非阻塞型I/O模型
- 用户线程发起I/O请求后立即返回,通过轮询机制不断检查I/O操作是否完成。
- 优点:可以在单个线程内处理多个I/O请求。
- 缺点:频繁的轮询可能导致CPU资源浪费。
5.2.3 多路复用I/O模型
- 通过系统调用(如select、poll、epoll)同时监控多个I/O请求。
- 优点:可以在单个线程内高效地处理大量并发连接。
- 缺点:在连接数较少时,效率可能不如多线程模型。
5.2.4 信号驱动式I/O模型
- 通过信号通知机制,在数据就绪时通知应用程序进行I/O操作。
- 优点:减少了无数据时的轮询,提高了效率。
- 缺点:在大量I/O操作时,信号队列可能溢出。
5.2.5 异步I/O模型
- 内核在I/O操作完成时主动通知应用程序。
- 优点:应用程序可以在等待I/O时执行其他任务,充分利用了系统资源。
- 缺点:实现复杂,需要操作系统的底层支持。
5.3 I/O模型的比较
5.3.1 性能对比
- 阻塞型I/O模型在低并发场景下简单易用,但在高并发场景下效率较低。
- 非阻塞型和多路复用I/O模型在高并发场景下表现更好,但实现复杂度较高。
- 异步I/O模型提供了最高的效率和可伸缩性,但需要更多的系统资源和复杂的编程模型。
5.3.2 实际应用选择
- 对于低并发需求,可以选择阻塞型I/O模型。
- 对于需要处理大量并发连接的服务器,多路复用或异步I/O模型更为合适。
6. 零拷贝
6.1零拷贝的概念
在传统的Linux系统中,标准I/O操作(如read和write)通常涉及数据在用户空间和内核空间之间的多次拷贝。这种数据拷贝过程不仅消耗CPU资源,而且随着数据量的增加,性能瓶颈也变得更加明显。
零拷贝是一种减少或消除数据在用户空间和内核空间之间拷贝的技术。它并不是完全没有拷贝,而是尽可能减少不必要的数据复制操作,从而提高效率。
6.2零拷贝相关技术
6.2.1 MMAP (Memory Mapping)
内存映射(MMAP)是一种允许进程通过内存地址空间直接访问文件内容的技术。使用mmap系统调用,文件内容被映射到进程的地址空间,避免了read和write调用中的额外数据拷贝。
6.2.2 SENDFILE
SENDFILE是一种高效的数据传输系统调用,它允许内核直接将文件数据发送到网络套接字,无需将数据先复制到用户空间的缓冲区。这种方式显著减少了数据拷贝的开销。
6.2.3 DMA辅助的SENDFILE
某些系统支持使用直接内存访问(DMA)来辅助SENDFILE操作,进一步提高数据传输的效率。
二、 Nginx架构与安装
1.Nginx 架构概述
1.1 Nginx 简介
Nginx(发音为“engine X”)最初由俄罗斯程序员Igor Sysoev开发,并于2004年首次公开发布。它以高稳定性、丰富的功能集和低资源消耗而闻名。
1.2 核心特性
- 模块化设计:易于扩展和定制。
- 高可靠性:支持平滑重载配置文件和升级程序,无需中断服务。
- 低内存消耗:优化的内存管理机制。
- 事件驱动:高效的事件处理机制,支持大量并发连接。
1.3 进程模型
Nginx采用多进程模型,主要由Master进程和Worker进程组成:
- Master进程:负责管理Worker进程,读取和验证配置文件,处理信号等。
- Worker进程:实际处理网络请求,执行具体业务逻辑。
2.Nginx 安装
2.1 安装前的准备
#下载并解压所需的安装包
[root@nginx ~]# ls
公共 下载 echo-nginx-module-0.63 nginx-1.26.1
模板 音乐 echo-nginx-module-0.63.tar.gz nginx-1.26.1.tar.gz
视频 桌面 eth160.nmconnection test.sh
图片 anaconda-ks.cfg nginx-1.24.0
文档 clear_mnt nginx-1.24.0.tar.gz
#解决依赖
[root@nginx ~]#dnf install gcc pcre-devel zlib-devel openssl-devel -y
[root@nginx ~]# cd nginx-1.24.0/
2.2 编译安装Nginx
#对nginx编译
[root@nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/echo-nginx-module-0.63 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module
#找到makefile文件进行安装
[root@nginx nginx-1.24.0]# ls
auto CHANGES.ru configure html Makefile objs src
CHANGES conf contrib LICENSE man README
[root@nginx nginx-1.24.0]# make && make install
2.3.nginx启动文件编写
[root@nginx nginx-1.24.0]# vim /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss.lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
3平滑升级和回滚
有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时 Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级
3.1平滑升级流程
- 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
- 向master进程发送USR2信号
- master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
- master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进程的PID存放至新生成的pid文件nginx.pid
- 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
- 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
- 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT
3.2.平滑升级
3.2.1 解压新版本NGINX编译
[root@nginx ~]# tar -xzf nginx-1.26.1.tar.gz
[root@nginx ~]# cd nginx-1.26.1/
[root@nginx nginx-1.26.1]# ls
auto CHANGES.ru configure html Makefile objs src
CHANGES conf contrib LICENSE man README
[root@nginx nginx-1.26.1]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/echo-nginx-module-0.63 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module
[root@nginx nginx-1.26.1]# make
3.2.2 拷贝编译好的新脚本
[root@nginx nginx-1.26.1]# cp objs/nginx /usr/local/nginx/sbin/nginx.new
[root@nginx nginx-1.26.1]# nginx
[root@nginx nginx-1.26.1]# mv nginx nginx.old
[root@nginx nginx-1.26.1]# mv nginx nginx.new
3.2.3.挂起旧进程开启新进程
[root@nginx nginx-1.26.1]# ps aux | grep nginx
avahi 889 0.0 0.1 15524 6300 ? Ss 16:23 0:00 avahi-daemon: running [nginx.local]
root 2113 0.0 0.0 9868 988 ? Ss 17:22 0:00 nginx: master process nginx
nobody 2114 0.0 1.2 54740 45804 ? S 17:22 0:00 nginx: worker process
nobody 2115 0.3 1.2 54740 45804 ? S 17:22 0:00 nginx: worker process
root 2117 0.0 0.0 221812 2316 pts/1 S+ 17:22 0:00 grep --color=auto nginx
[root@nginx nginx-1.26.1]# kill -USR2 2113
[root@nginx nginx-1.26.1]# kill -WINCH 2113
[root@nginx nginx-1.26.1]# curl -I 172.25.254.100
HTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Tue, 20 Aug 2024 09:33:43 GMT
Content-Type: text/html
Content-Length: 18
Last-Modified: Thu, 15 Aug 2024 14:59:01 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "66be17b5-12"
Accept-Ranges: bytes
3.2.4.回滚
[root@nginx nginx-1.26.1]# ps aux | grep nginx
avahi 889 0.0 0.1 15524 6300 ? Ss 16:23 0:00 avahi-daemon: running [nginx.local]
root 2113 0.0 0.0 9868 988 ? Ss 17:22 0:00 nginx: master process nginx
nobody 2114 0.0 1.2 54740 45804 ? S 17:22 0:00 nginx: worker process
nobody 2115 0.3 1.2 54740 45804 ? S 17:22 0:00 nginx: worker process
root 2117 0.0 0.0 221812 2316 pts/1 S+ 17:22 0:00 grep --color=auto nginx
[root@nginx nginx-1.26.1]# kill -HUP 2113
[root@nginx nginx-1.26.1]# kill -WINCH 2117
[root@nginx nginx-1.26.1]# curl -I 172.25.254.100
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 20 Aug 2024 09:35:43 GMT
Content-Type: text/html
Content-Length: 18
Last-Modified: Thu, 15 Aug 2024 14:59:01 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "66be17b5-12"
Accept-Ranges: bytes
三、Nginx核心配置与优化
1. 配置文件结构
Nginx的配置文件通常分为以下几个部分:
- 全局块:设置影响整个Nginx服务器的配置,如用户、工作进程数等。
- events块:配置事件相关的设置,如使用哪种事件模型。
- http块:定义与HTTP协议相关的配置,如日志格式、MIME类型、静态资源缓存等。
- server块:定义虚拟主机的配置,可以包含多个location定义。
2. 全局配置
Main 全局配置段常见的配置指令分类
- 正常运行必备的配置
- 优化性能相关的配置
- 用于调试及定位问题相关的配置
- 事件驱动相关的配置
#用户和组配置
user nginx; #user:定义Nginx进程运行的用户,出于安全考虑,建议使用非root用户
worker_processes auto; #worker_processes:定义工作进程的数量。设置为auto可以让Nginx根据CPU核心数自动设置。
#事件驱动模型
events {
use epoll; # Linux下推荐使用epoll
worker_connections 100000; # 每个工作进程的最大连接数
}
#use:指定使用的事件驱动方法,epoll是Linux下高性能的选择。
#worker_connections:定义单个工作进程可以处理的最大连接数。
#错误日志和PID文件
error_log /var/log/nginx/error.log warn; #error_log:定义错误日志文件的路径和日志级别,warn表示只记录警告及以上级别的日志。
pid /var/run/nginx.pid; #pid:定义Nginx主进程的PID文件存放位置。
实现 nginx 的高并发配置
[root@nginx ~]# vim /etc/security/limits.conf
# End of file
nginx - nofile 100000
开放最大并发数为100000
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
events {
use epoll;
worker_connections 100000;
}
[root@nginx ~]# nginx -s reload
http 配置块
#在响应报文中将指定的文件扩展名映射至MIME对应的类型
include /etc/nginx/mime.types;
default_type application/octet-stream; #除mime.types中的类型外
#指定其它文件的默认MIME类型,浏览
器一般会提示下载
types {
text/html html;
image/gif gif;
image/jpeg jpg;}
3.核心配置
基于不同的IP、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块 ngx_http_core_module实现。
3.1.新建一个 PC web 站点
#定义子配置文件路径
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65 60;
keepalive_requests 500;
#gzip on;
include "/usr/local/nginx/conf.d/*.conf"; #在配置文件的最后面添加此行,否则会导致前面的命令无法生效
#创建虚拟主机网站配置
[root@nginx ~]# mkdir -p /usr/local/nginx/conf.d
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
root /data/web/html;
index index.html;
}
测试
3.2.root和alias
root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location
alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于 location上下文,此指令使用较少
root #给定的路径对应于location中的/uri左侧的/
alias #给定的路径对应于location中的/uri的完整路径
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
root /data/web/html;
index index.html;
location /web {
alias /data/web/html;
}
}
[root@nginx ~]# nginx -s reload
[root@nginx ~]# echo this is alias > /data/web/html/index.html
#测试
[root@nginx ~]# curl 172.25.254.100/web/
this is alias
3.3.location 的详细使用
- 在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;
- ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,
- 而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri
- uri是用户请求的字符串,即域名后面的web文件路径
- 然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
Location 基本语法
=
:精确匹配,要求请求的URI和模式完全一致。~
:区分大小写的正则表达式匹配。~*
:不区分大小写的正则表达式匹配。^~
:如果请求的URI以该模式开始,优先使用此规则,并且匹配是区分大小写的。
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
root /data/web/html;
index index.html;
location /test {
root /data/web1;
}
location = /test {
root /data/web2;
}
location ^~ /t {
root /data/web3;
}
location ~\.html$ {
root /data/web4;
}
location ~* .HTML$ {
root /data/web5;
}
}
[root@nginx ~]# nginx -s reload
[root@nginx ~]# echo web1 > /data/web1/test/index.html
[root@nginx ~]# echo web2 > /data/web2/test/index.html
[root@nginx ~]# echo web3 > /data/web3/test/index.html
[root@nginx ~]# echo web4 > /data/web4/test/index.html
[root@nginx ~]# echo web5 > /data/web5/test/index.html
测试访问目录时其优先值:
将4和5的位置调换
由此可知4和5的优先级相同,谁在前面先访问谁。所以先注释掉4,5
变成了1,所以在1,2,3中1的优先级最高。注释掉1
此时又变成了3
最终我们可知:精确匹配 > (~,~*) > 不带符号 > ^~
3.4Nginx 账户认证功能
先创建用户认证文件
[root@nginx ~]# htpasswd -cm /usr/local/nginx/.htpasswd admin
New password:
Re-type new password:
Adding password for user admin
[root@nginx ~]# cat /usr/local/nginx/.htpasswd
admin:$apr1$2kxH6wDv$TLLJg4BDm/yBpHrhh7R7G.
[root@nginx ~]# htpasswd -m /usr/local/nginx/.htpasswd lee
New password:
Re-type new password:
Adding password for user lee
[root@nginx ~]# cat /usr/local/nginx/.htpasswd
admin:$apr1$2kxH6wDv$TLLJg4BDm/yBpHrhh7R7G.
lee:$apr1$L7hH2RAv$pppr0yfcb9oVSzdONCBar0
然后编辑子配置文件添加用户认证的参数
server {
listen 80;
server_name www.timinglee.org;
root /data/web/html;
index index.html;
location /lee {
root /data/web;
auth_basic "login password !!";
auth_basic_user_file "/usr/local/nginx/.htpasswd";
}
}
测试
3.5自定义错误页面
创建文件
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
root /data/web/html;
index index.html;
error_page 404 /40x.html;
location /lee {
root /data/web;
auth_basic "login password !!";
auth_basic_user_file "/usr/local/nginx/.htpasswd";
}
location = /40x.html {
root /data/web/errorpage;
}
}
[root@nginx ~]# mkdir -p /data/web/errorpage
[root@nginx ~]# echo error page > /data/web/errorpage/40x.html
测试
访问不存在的页面
3.4.自定义错误日志
编辑子配置文件添加自定义错误日志的参数和访问成功日志的参数,定义错误和访问日志路径
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
root /data/web/html;
index index.html;
error_page 404 /40x.html;
error_log /var/log/timinglee.org/error.log;
}
[root@nginx ~]# nginx -s reload
[root@nginx ~]# mkdir -p /var/log/timinglee.org
测试
3.5.检测文件是否存在
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
root /data/web/html;
index index.html;
error_page 404 /40x.html;
error_log /var/log/timinglee.org/error.log;
access_log /var/log/timinglee.org/access.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
}
[root@nginx ~]# nginx -s reload
[root@nginx ~]# echo error default > /data/web/html/error/default.html
测试:
该文件不存在
3.6.长连接配置
http {
.........
#keepalive_timeout 0;
keepalive_timeout 65; #这个链接在未请求的时候保持65s后断开
keepalive_requests 2; #该链接允许请求访问两次
.........
}
[root@nginx ~]# yum install telnet -y
[root@nginx ~]# telnet www.timinglee.org 80
Trying 172.25.254.100...
Connected to www.timinglee.org.
Escape character is '^]'.
GET / HTTP/1.1
Host: www.timinglee.org
测试
回车两次,一次构建报文建立连接,二次发送
只允许访问两次
3.7.作为下载服务器配置
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
root /data/web/html;
index index.html;
location /download {
root /dta/web;
autoindex on; #自动索引功能
autoindex_localtime on; #on表示显示本机时间而非GMT(格林威治)时间 #默认为off显 示GMT时间
autoindex_exact_size off; #计算文件确切大小(单位bytes) #此为默认值,off只显示 大概大小(单位kb、mb、gb)
limit_rate 1024k; #限速,默认不限速(为0)
}
}
[root@nginx ~]# nginx -s reload
[root@nginx ~]# mkdir /data/web/download/
测试
四、Nginx 高级配置
1.Nginx 状态页
[root@nginx ~]# vim /usr/local/nginx/conf.d/status.conf
server {
listen 80;
server_name status.timinglee.org;
root /data/web/html;
index index.html;
location /status {
stub_status;
allow 172.25.254.1;
deny all;
}
}
[root@nginx ~]# nginx -s reload
测试
2.Nginx 压缩功能
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {
..............
gzip on; #启用或禁用gzip压缩,默认关闭
gzip_comp_level 5; #压缩比由低到高从1到9,默认为1,值越高压缩后文件越小,但是消耗cpu比较高。
gzip_min_length 1k; #gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_http_version 1.1; #启用压缩功能时,协议的最小版本,默认HTTP/1.1
gzip_vary on; #如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开
gzip_types text/plain application/javascript application/x-javascript text/cssapplication/xml text/javascript application/x-httpd-php image/gif image/png; #指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错
..............
}
[root@nginx ~]# nginx -s reload
[root@nginx ~]# echo hello timinglee > /data/web/html/small.html
[root@nginx ~]# du -sh /usr/local/nginx/logs/access.log
12K /usr/local/nginx/logs/access.log
[root@nginx ~]# cat /usr/local/nginx/logs/access.log > /data/web/html/big.html
测试
3.Nginx 变量使用
- nginx的变量可以在配置文件中引用,作为功能判断或者日志等场景使用
- 变量可以分为内置变量和自定义变量
- 内置变量是由nginx模块自带,通过变量可以获取到众多的与客户端访问相关的值。
3.1、内置变量
server {
listen 80;
server_name var.timinglee.org;
root /data/web/html;
index index.html;
location /var {
default_type text/html;
echo $remote_addr; #存放了客户端的地址,注意是客户端的公网IP
echo $args; #变量中存放了URL中的所有参数
echo $is_args; #如果有参数为? 否则为空
echo $document_root; #保存了针对当前资源的请求的系统根目录
echo $document_uri; #保存了当前请求中不包含参数的URI,注意是不包含请求的指令
echo $host; #存放了请求的host名称
echo $remote_port; #客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口
echo $remote_user; #客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口
echo $request_method; 请求资源的方式,GET/PUT/DELETE等
echo $request_filename; #当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径
echo $request_uri; #包含请求参数的原始URI,不包含主机名
echo $scheme; #请求的协议
echo $server_protocol; #保存了客户端请求资源使用的协议的版本
echo $server_addr; #保存了服务器的IP地址
echo $server_name; #虚拟主机的主机名
echo $server_port; #虚拟主机的端口号
echo $http_user_agent; #客户端浏览器的详细信息
echo $http_cookie; #客户端的所有cookie信息
echo $cookie_key2; #name为任意请求报文首部字部cookie的key名
set $timinglee lee; #自定义参数
echo $timinglee; #打印自定义参数
}
}
测试
五、Nginx Rewrite 相关功能
- Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求
- 此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库
- rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能
- 比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问
- 另外还可以在一定程度上提高网站的安全性。
1.ngx_http_rewrite_module 模块指令
1.1.if指令
- Nginx的if语法仅能使用if做单次判断
- 可以使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false
server {
listen 80;
server_name var.timinglee.org;
root /data/web/html;
index index.html;
location /test2 {
if ( !-e $request_filename){
echo "$request_filename is exist";
}
}
[root@nginx ~]# nginx -s reload
测试
1.2.set 指令
- 指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key
- 另外set定义格式为set $key value,value可以是text, variables和两者的组合
1.3.break指令
- 用于中断当前相同作用域(location)中的其他Nginx配置
- 与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效
- 位于后面的 ngx_http_rewrite_module 模块中指令就不再执行
- Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置
- 该指令可以在server块和locationif块中使用
[root@nginx ~]# vim /usr/local/nginx/conf.d/vars.conf
location /break {
default_type text/html;
set $name zpy;
echo $name;
if ( $http_user_agent = "curl/7.76.1" ){
break;
}
set $id 666;
echo $id;
}
[root@nginx ~]# nginx -s reload
测试
1.4.return 指令
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重 定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配 置都将不被执行,return可以在server、if 和 location块进行配置
[root@nginx ~]# vim /usr/local/nginx/conf.d/vars.conf
location /return {
default_type text/html;
if ( !-e $request_filename){
return 301 http://www.baidu.com;
}
echo "$request_filename is exist";
}
[root@nginx ~]# nginx -s reload
测试
2.rewrite 指令
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配, rewrite主要是针对用户请求的URL或者是URI做具体处理
2.1. rewrite flag 使用介绍
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrite有四种不同的flag,分别是redirect(临时 重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型
- 跳转型指由客户端浏览器重新对新地址进行请求
- 代理型是在WEB服务器内部实现跳转
2.2.域名永久(permanent)与临时重定向(redirect)
[root@nginx ~]# vim /usr/local/nginx/conf.d/vars.conf
location / {
root /data/web/var;
index index.html;
rewrite / http://www.timinglee.com permanent;
#rewrite / http://www.timinglee.com redirect;
}
[root@nginx ~]# nginx -s reload
测试
[root@nginx ~]# vim /usr/local/nginx/conf.d/vars.conf
location / {
root /data/web/var;
index index.html;
#rewrite / http://www.timinglee.com permanent;
rewrite / http://www.timinglee.com redirect;
}
[root@nginx ~]# nginx -s reload
测试
六、Nginx 反向代理功能
1.实现 http 反向代理
反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的 一种方式,这是用的比较多的一种方式。
Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预 定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范
1.1.http 协议反向代理
将用户对域 www.timinglee.org 的请求转发给后端服务器处理
新建两台主机172.25.254.10和20,做后端服务器
[root@web1 ~]# yum install httpd -y
[root@web1 ~]# echo test 172.25.254.10 > /var/www/html/index.html
[root@web2 ~]# yum install httpd -y
[root@web2 ~]# vim /etc/httpd/conf/httpd.conf
# Change this to Listen on a specific IP address, but note that if
# httpd.service is enabled to run at boot time, the address may not be
# available when the service starts. See the httpd.service(8) man
# page for more information.
#
#Listen 12.34.56.78:80
Listen 8080
[root@web2 ~]# systemctl restart httpd
[root@web2 ~]# echo test 172.25.254.20 > /var/www/html/index.html
1.2.指定 location 实现反向代理
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
location / {
proxy_pass http://172.25.254.10:80;
}
location /static {
proxy_pass http://172.25.254.20:8080;
}
}
[root@nginx ~]# nginx -s reload
测试
2.反向代理实现动静分离
[root@web1 ~]# yum install php -y
[root@web1 ~]# vim /var/www/html/index.php
<?php
phpinfo();
?>
[root@web1 ~]# systemctl restart httpd
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
location ~\.php$ {
proxy_pass http://172.25.254.10:80;
}
location /static {
proxy_pass http://172.25.254.20:8080;
}
}
[root@nginx ~]# nginx -s reload
测试
3.实现 Nginx 四层负载均衡
Nginx在1.9.0版本开始支持tcp模式的负载均衡,在1.9.13版本开始支持udp协议的负载,udp主要用于 DNS的域名解析,其配置方式和指令和http 代理类似,其基于ngx_stream_proxy_module模块实现tcp 负载,另外基于模块ngx_stream_upstream_module实现后端服务器分组转发、权重分配、状态监测、 调度算法等高级功能。
2.1. tcp负载均衡配置参数
stream { #定义stream相关的服务;
Context:main
upstream backend { #定义后端服务器
hash $remote_addr consistent; #定义调度算法
server backend1.example.com:12345 weight=5; #定义具体server
server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
upstream dns {
server 10.0.0.1:53; #定义后端服务器
server dns.example.com:53; #定义具体server
}
server { #定义server
listen 12345; #监听IP:PORT
proxy_connect_timeout 1s; #连接超时时间
proxy_timeout 3s; #转发超时时间
proxy_pass backend; #转发到具体服务器组
}
server {
listen 127.0.0.1:53 udp reuseport;
proxy_timeout 20s;
proxy_pass dns;
}
server {
listen [::1]:12345;
proxy_pass unix:/tmp/stream.socket;
}
2.2.udp 负载均衡实例: DNS
后端服务器安装 DNS
[root@web1 ~]# dnf install bind -y
[root@web1 ~]# vim /etc/named.conf
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
allow-query { any; };
recursion yes;
dnssec-validation no;
[root@web1 ~]# vim /etc/named.rfc1912.zones
[root@web1 ~]# cd /var/named/
[root@web1 named]# cp named.localhost timinglee.org.zone -p
[root@web1 named]# vim timinglee.org.zone
zone "timinglee.org" IN {
type master;
file "timinglee.org.zone";
allow-update { none; };
};
$TTL 1D
@ IN SOA ns.timinglee.org. root.timinglee.org. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.timinglee.org.
ns A 172.25.254.10
www A 172.25.254.10
~
[root@web1 named]# systemctl restart named
测试
[root@web1 named]# scp -p /etc/named.{conf,rfc1912.zones} 172.25.254.20:/etc
[root@web1 named]# scp -p /var/named/timinglee.org.zone 172.25.254.20:/var/named/timinglee.org.zone
[root@web2 ~]# vim /var/named/timinglee.org.zone
$TTL 1D
@ IN SOA ns.timinglee.org. root.timinglee.org. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.timinglee.org.
ns A 172.25.254.20
www A 172.25.254.20
[root@web2 ~]# systemctl restart named
测试
3.实现 FastCGI
CGI的由来:
最早的Web服务器只能简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏 览器,也就是静态html文件,但是后期随着网站功能增多网站开发也越来越复杂,以至于出现动态技 术,比如像php(1995年)、java(1995)、python(1991)语言开发的网站,但是nginx/apache服务器并不 能直接运行 php、java这样的文件,apache实现的方式是打补丁,但是nginx缺通过与第三方基于协议实 现,即通过某种特定协议将客户端请求转发给第三方服务处理,第三方服务器会新建新的进程处理用户 的请求,处理完成后返回数据给Nginx并回收进程,最后nginx在返回给客户端,那这个约定就是通用网 关接口(common gateway interface,简称CGI),CGI(协议) 是web服务器和外部应用程序之间的接口 标准,是cgi程序和web服务器之间传递信息的标准化接口。
为什么会有FastCGI?
CGI协议虽然解决了语言解析器和 Web Server 之间通讯的问题,但是它的效率很低,因为 Web Server 每收到一个请求都会创建一个CGI进程,PHP解析器都会解析php.ini文件,初始化环境,请求结束的时候 再关闭进程,对于每一个创建的CGI进程都会执行这些操作,所以效率很低,而FastCGI是用来提高CGI性 能的,FastCGI每次处理完请求之后不会关闭掉进程,而是保留这个进程,使这个进程可以处理多个请 求。这样的话每个请求都不用再重新创建一个进程了,大大提升了处理效率。
什么是PHP-FPM?
PHP-FPM(FastCGI Process Manager:
- FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能
- 进程包括master进程和worker进程。master进程只有一个,负责监听端口,接受来自web server 的请求
- worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,进行PHP代码的处理
3.1、Nginx与php-fpm在同一服务器
重新编译安装ngin增加两个模块
[root@nginx ~]# ls
公共 anaconda-ks.cfg nginx-1.24.0.tar.gz
模板 clear_mnt nginx-1.26.1
视频 echo-nginx-module-0.63 nginx-1.26.1.tar.gz
图片 echo-nginx-module-0.63.tar.gz openresty-1.25.3.1.tar.gz
文档 eth160.nmconnection php-8.3.9.tar.bz2
下载 memcache-8.2.tgz php-8.3.9.tar.gz
音乐 memc-nginx-module-0.20.tar.gz srcache-nginx-module-0.33.tar.gz
桌面 nginx-1.24.0 test.sh
[root@nginx ~]# tar zxf memc-nginx-module-0.20.tar.gz
[root@nginx ~]# tar zxf php-8.3.9.tar.gz
[root@nginx ~]# tar zxf srcache-nginx-module-0.33.tar.gz
[root@nginx ~]# tar zxf openresty-1.25.3.1.tar.gz
[root@nginx nginx-1.26.1]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/echo-nginx-module-0.63 --add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module-0.33 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
[root@nginx nginx-1.26.1]# make && make install
[root@nginx nginx-1.26.1]# systemctl daemon-reload
[root@nginx nginx-1.26.1]# systemctl restart nginx
源码编译PHP
[root@nginx ~]# cd php-8.3.9/
[root@nginx php-8.3.9]# yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel
[root@nginx ~]# rpm -ivh oniguruma-devel-6.9.6-1.el9.5.x86_64.rpm
[root@nginx php-8.3.9]# ./configure --prefix=/usr/local/php --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-curl --with-iconv --with-mhash --with-zlib --with-openssl --enable-mysqlnd --with-mysqli --with-pdo-mysql --disable-debug --enable-sockets --enable-soap --enable-xml --enable-ftp --enable-gd --enable-exif --enable-mbstring --enable-bcmath --with-fpm-systemd
[root@nginx php-8.3.9]# make && make install
php相关配置优化
[root@nginx php-8.3.9]# cd /usr/local/php/etc/
[root@nginx etc]# cp -p php-fpm.conf.default php-fpm.conf
[root@nginx etc]# cd php-fpm.d/
[root@nginx php-fpm.d]# cp www.conf.default www.conf -p
[root@nginx php-fpm.d]# vim www.conf
; a specific port;
; 'port' - to listen on a TCP socket to all addresses
; (IPv6 and IPv4-mapped) on a specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 0.0.0.0:9000
#更改时区
[root@nginx php-fpm.d]# cd
[root@nginx ~]# cd php-8.3.9/
[root@nginx php-8.3.9]# cp php.ini-production /usr/local/php/etc/php.ini
[root@nginx php-8.3.9]# vim /usr/local/php/etc/php.ini
[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
date.timezone = Asia/Shanghai
生成启动脚本
[root@nginx ~]# cd php-8.3.9/sapi/fpm/
[root@nginx fpm]# cp php-fpm.service /lib/systemd/system/
[root@nginx fpm]# vim /lib/systemd/system/php-fpm.service
# Mounts the /usr, /boot, and /etc directories read-only for processes invoked by this unit.
#ProtectSystem=full
[root@nginx fpm]# systemctl daemon-reload
[root@nginx fpm]# systemctl start php-fpm
添加环境变量
[root@nginx fpm]# vim ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
export PATH=$PATH:/usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/php/sbin
[root@nginx fpm]# source ~/.bash_profile
php测试页面
[root@nginx fpm]# mkdir -p /data/web/php
[root@nginx fpm]# cd /data/web/php/
[root@nginx php]# vim index.php
<?php
phpinfo()
?>
PHP结合nginx,Nginx配置转发
[root@nginx php]# cd
[root@nginx ~]# cd nginx-1.26.1/
[root@nginx nginx-1.26.1]# vim /usr/local/nginx/conf/nginx.conf
include "/usr/local/nginx/conf.d/*.conf";
[root@nginx nginx-1.26.1]# mkdir -p /usr/local/nginx/conf.d
[root@nginx nginx-1.26.1]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name www.timingzpy.org;
root /data/web/html;
index index.html;
location ~ \.php$ {
root /data/web/php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
[root@nginx nginx-1.26.1]# nginx -s reload
测试
3.2. php的动态扩展模块(php的缓存模块)
配置php使其支持memcache
添加并解压memcache的功能模块
[root@nginx ~]# tar zxf memcache-8.2.tgz
[root@nginx ~]# ls
公共 memc-nginx-module-0.20.tar.gz
模板 nginx-1.24.0
视频 nginx-1.24.0.tar.gz
图片 nginx-1.26.1
文档 nginx-1.26.1.tar.gz
下载 oniguruma-devel-6.9.6-1.el9.5.x86_64.rpm
音乐 openresty-1.25.3.1
桌面 openresty-1.25.3.1.tar.gz
anaconda-ks.cfg package.xml
clear_mnt php-8.3.9
echo-nginx-module-0.63 php-8.3.9.tar.bz2
echo-nginx-module-0.63.tar.gz php-8.3.9.tar.gz
eth160.nmconnection srcache-nginx-module-0.33
memcache-8.2 srcache-nginx-module-0.33.tar.gz
memcache-8.2.tgz test.sh
memc-nginx-module-0.20
安装memcache模块
[root@nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# yum install autoconf -y
[root@nginx memcache-8.2]# phpize
Configuring for:
PHP Api Version: 20230831
Zend Module Api No: 20230831
Zend Extension Api No: 420230831
[root@nginx memcache-8.2]# ./configure && make && make install
[root@nginx memcache-8.2]# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20230831/
memcache.so opcache.so
[root@nginx memcache-8.2]# systemctl restart php-fpm.service
复制测试文件到nginx发布目录中
[root@nginx memcache-8.2]# cp example.php memcache.php /data/web/php/
[root@nginx memcache-8.2]# vim /data/web/php/memcache.php
define('ADMIN_USERNAME','admin'); // Admin Username
define('ADMIN_PASSWORD','lee'); // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
$MEMCACHE_SERVERS[] = '127.0.0.1:11211'; // add more as an array
$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
配置php加载memcache模块
[root@nginx memcache-8.2]# vim /usr/local/php/etc/php.ini
;zend_extension=opcache
extension=memcache
;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
[root@nginx memcache-8.2]# systemctl restart php-fpm.service
部署memcached
[root@nginx memcache-8.2]# dnf install memcached -y
[root@nginx memcache-8.2]# systemctl enable --now memcached.service
[root@nginx memcache-8.2]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1,::1"
测试
七、nginx二次开发版本
1. openresty
Nginx 是俄罗斯人发明的, Lua 是巴西几个教授发明的,中国人章亦春把 LuaJIT VM 嵌入到 Nginx 中, 实现了 OpenResty 这个高性能服务端解决方案
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方 模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服 务和动态网关。
OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言 调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高 性能 Web 应用系统。
OpenResty 由于有功能强大且方便的的API,可扩展性更强,如果需要实现定制功能,OpenResty是个不错的 选择
2.编译安装openresty
[root@nginx ~]# dnf -yq install gcc pcre-devel openssl-devel perl
[root@Nginx ~]#useradd -r -s /sbin/nologin nginx
[root@Nginx ~]#cd /usr/local/src
[root@Nginx src]#wget https://openresty.org/download/openresty-1.17.8.2.tar.gz
[root@Nginx src]#tar zxf openresty-1.17.8.2.tar.gz
[root@Nginx src]#cd openresty-1.17.8.2/
[root@Nginx openresty-1.17.8.2]#./configure --prefix=/apps/openresty --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with_http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
[root@Nginx openresty-1.17.8.2]#make && make install
[root@Nginx openresty-1.17.8.2]#ln -s /usr/local/openresty/bin/* /usr/bin/
[root@Nginx openresty-1.17.8.2]#openresty -v
nginx version: openresty/1.17.8.2
八、结语
- 理解配置的重要性:Nginx 的配置不仅影响服务器的性能,还直接关系到网站的可用性和安全性。合理配置可以显著提高服务器的响应速度和处理能力。
-
性能优化:通过启用压缩、调整缓存策略、优化负载均衡等措施,可以进一步提升 Nginx 的性能,减少资源消耗,提高并发处理能力。
-
安全性考虑:在配置过程中,应始终考虑到安全性,如使用 HTTPS、配置防火墙规则、以及实施访问控制等,以保护服务器和用户数据的安全。
-
持续监控与维护:服务器配置不是一成不变的,需要根据实际运行情况进行持续的监控和调整。定期检查日志、更新软件、以及优化配置是保持服务器长期稳定运行的关键。
-
利用社区资源:Nginx 拥有一个活跃的开源社区,当遇到问题时,可以利用社区资源,如论坛、文档、教程等,获取帮助和最佳实践。
通过深入理解Web服务器的工作原理和配置优化,企业可以构建出既高效又稳定的Web服务平台。Nginx作为一种高性能的Web服务器,通过合理的配置和应用零拷贝技术,能够显著提升企业Web服务的性能和用户体验。