当前位置: 首页 > ai >正文

【liunx】web高可用---nginx

NGINX简介

Nginx(发音为 “engine x”)是一款由俄罗斯程序员 Igor Sysoev 开发的 轻量级、高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。自 2004 年首次发布以来,Nginx 凭借其 高并发处理能力、低内存消耗和稳定性,成为全球最受欢迎的 Web 服务器之一,广泛应用于静态资源服务、反向代理、负载均衡、API 网关等场景

NGINX安装

源码编译

#解压压缩包
tar zxf nginx-1.24.0.tar.gzcd nginx-1.24.0
#编译
./configure  --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --
with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-pcre --
with-stream --with-stream_ssl_module --with-stream_realip_module
make
make install

使用make和makeinstall编译和安装

验证版本以及编译参数

查看版本信息

自定义版本(在编译前编辑文件)

#编辑版本相关文件
[root@Webserver nginx-1.26.1]# vim src/core/nginx.h#define NGINX_VERSION      ""       
#define NGINX_VER          "xixihaha/" NGINX_VERSION

重新编译后查看版本信息

平滑升级

服务器运行时要进行升级,此时不能停止服务器,我们可以进行平滑升级---即不停止服务器的情况下进行升级

将新版本编译和make后不用makeinstall

[root@Nginx sbin]# cd /usr/local/nginx/sbin/
[root@Nginx sbin]# cp -p nginx nginx.old
[root@Nginx sbin]# /usr/bin/cp -f /mnt/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin/nginx
[root@Nginx sbin]# ps aux | grep nginx
root       37705  0.0  0.1   9868  2052 ?        Ss   16:04   0:00 nginx: master process ./nginx
nginx      37706  0.0  0.2  14200  5124 ?        S    16:04   0:00 nginx: worker process
root       40854  0.0  0.1   6408  2304 pts/0    S+   16:20   0:00 grep --color=auto nginx
[root@Nginx sbin]# kill -USR2 37705
[root@Nginx sbin]# kill -WINCH 37705
[root@Nginx sbin]# ps aux | grep nginx
root       37705  0.0  0.1   9868  2564 ?        Ss   16:04   0:00 nginx: master process ./nginx
root       40857  0.0  0.3   9876  6528 ?        S    16:20   0:00 nginx: master process ./nginx
nginx      40858  0.0  0.2  14208  4996 ?        S    16:20   0:00 nginx: worker process
root       40862  0.0  0.1   6408  2304 pts/0    S+   16:21   0:00 grep --color=auto nginx
[root@Nginx sbin]# nginx -V
nginx version: nginx/1.26.1
built by gcc 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC)
built with OpenSSL 3.0.7 1 Nov 2022
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module ip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_modm_realip_module

使用sysstemctl控制nginx

#编辑/lib/systemd/system/nginx.service文件
[root@Webserver ~]# cd /lib/systemd/system
[root@Webserver system]# vim nginx.service
#配置文件内容
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid   #指定pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t    #在主服务启动之前执行的命令
ExecStart=/usr/local/nginx/sbin/nginx   #启动服务的核心进程
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target

NGINX核心配置

nginx主配置文件

main block:主配置段,即全局配置段#事件驱动相关的配置
event {
...
}#http/https 作为web服务器相关配置段
http {
...
}#默认配置文件不包括下面两个部分
#mail 作为邮件服务器相关配置段
mail {
...
}#stream 反向代理相关配置段
stream {
...
}

全局配置参数

/usr/local/nginx/conf/nginx.conf

http块参数


[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {#在响应报文中将指定的文件扩展名映射至MIME对应的类型include       mime.types;				#可以识别文本,图像,音频,视频等其他的数据default_type  application/octet-stream;	#没有识别的默认类型,例如php,ngxin不识别需要安装php才能渲染呈现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;		#使用定义为main的日志格式,存放在根目录的logs/access.log中sendfile        on;						#零拷贝功能,sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作)#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;					#长连接超时时间,单位是s#gzip  on;								#开启压缩功能server {#web服务配置}include "/usr/local/nginx/conf.d/*.conf";	#导入其他路径的配置文件,子配置文件#要放在默认发布文件目录下,不然会覆盖默认

核心配置块

c10k高并发

[root@Webserver ~]# vim /usr/local/nginx/conf/nginx.conf

[root@Webserver ~]#vim /usr/local/nginx/conf/nginx.conf

image-20250724153054696

[root@Webserver ~]#vim /etc/security/limits.conf

image-20250724164908954

安装测试压力工具以及测试

[root@Nginx sbin]# dnf install httpd-tools -y
[root@Nginx sbin]# ab -n 100000 -c 5000 http://172.25.254.10/index.html

基于域名的web站点发布

root和alias

root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location

示例:

alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于 location上下文,此指令使用较少

示例:

location详细使用

location指令用于匹配请求 URI,其匹配规则可分为匹配模式和优先级两部分

匹配模式符号规则优先级
精确匹配=规则:仅匹配与uri完全一致的请求,不包含子路径最优先
前缀匹配^~规则:匹配以uri为前缀的请求,一旦匹配成功,不再检查正则匹配其次
正则匹配

~或~*

~是区分大小写的

~*是不区分大小写的

规则:按正则表达式匹配 URI,仅匹配完整路径中符合正则的部分再其次
一般匹配无符号规则:匹配以uri为前缀的请求,但优先级低于正则匹配,会先检查正则匹配再判断最不优先

示例:

假设配置如下

location = / { ... }          # 1. 精确匹配 /
location ^~ /static/ { ... }   # 2. 前缀匹配 /static/ 及子路径
location ~ \.php$ { ... }      # 3. 正则匹配 .php 结尾的请求
location /test { ... }         # 4. 普通前缀匹配 /test 及子路径

当访问/时匹配精准匹配

当访问/static/css/style.css匹配前缀匹配

当访问/index.php时会匹配正则匹配

当访问/test/abc会匹配普通匹配

账户认证

账户认证是一种通过用户名和密码验证访问者身份的安全机制,常用于限制对特定网页、目录或整个网站的访问,适用于内部系统、后台管理界面等需要权限控制的场景

配置文件:

image-20250726124442872

实验效果:

image-20250726124622186

自定义错误页面

自定义错误页面是指通过配置 Nginx,将默认的错误提示页面(如 404、500 等)替换为自定义设计的页面,以提升用户体验、保持网站风格一致性,甚至传递品牌信息或引导用户操作

创建错误页面

image-20250726125100092

子配置文件内容:

image-20250726125252436

效果:

image-20250726125457994

自定义错误日志

自定义错误日志是指通过配置,对错误日志的存储路径、记录格式、日志级别等进行个性化设置,以便更高效地监控、排查和分析服务器运行过程中出现的错误

配置文件:

image-20250726125715881

效果:

image-20250726125907600

检测文件是否存在

当检测的文件不存在时会显示指定的内容

image-20250726130507071

image-20250726130721118

测试效果:

image-20250726130735777

长连接

长连接(Persistent Connection)是指客户端与服务器建立一次 TCP 连接后,可在该连接上发送多个 HTTP 请求,而无需每次请求都重新建立连接,从而减少连接建立 / 关闭的开销,提升通信效率。这一机制在 HTTP/1.1 中默认启用,是优化 Web 性能的重要手段

长连接一般在主配置文件中配置

NGINX高级配置

nginx状态页

状态页是 Nginx 提供的一个内置功能,用于展示当前 Nginx 服务器的实时运行状态信息,如连接数、请求处理情况、worker 进程状态等。它通过 ngx_http_stub_status_module 模块实现,是监控 Nginx 性能和排查问题的重要工具

[root@Webserver ~]# vim /usr/local/nginx/conf.d/jie.conf
location /status {stub_status;auth_basic "login pwsswd";auth_basic_user_file /usr/local/nginx/.htpasswd;}

image-20250726151336937

测试:

image-20250726151406406

压缩功能

通过对发送给客户端的数据进行压缩,有效减少数据传输量,进而提升网站访问速度,优化用户体验,同时还能降低服务器带宽消耗

  [root@Webserver ~]# vim /usr/local/nginx/conf/nginx.confkeepalive_timeout  60;keepalive_requests 120;gzip  on;gzip_comp_level 4;gzip_disable "MSIE [1-6]\.";gzip_min_length 4k;gzip_vary on;

image-20250726151602315

测试效果:

NGINX变量使用

使用nginx的变量需要在编译时添加模块

常用内置变量

$remote_addr客户端的 IP 地址
$args请求中的查询字符串(即 URL 中?后面的部分)
$document_root当前请求对应的 Nginx 配置中的root指令指定的文档根目录
$document_uri$request_uri类似,是当前请求的 URI,不包含域名部分
$host请求头中的Host字段值
$http_user_agent客户端的用户代理字符串,包含客户端的浏览器、操作系统等信息
$request_filename当前请求的文件路径,结合rootalias指令生成
$scheme请求使用的协议,通常是http 或 https
$http_cookie客户端发送的Cookie请求头内容
$cookie_key2获取客户端Cookie中名为key2 的值
$http_Accept客户端发送的Accept请求头内容,表明客户端能够接受的响应内容类型

自定义变量

Nginx Rewrite相关功能

riwrite简介

  • Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求

  • 此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库

  • rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能

  • 比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的 链接,就可以设置为访问

  • 另外还可以在一定程度上提高网站的安全性。

ngx_http_rewrite_module 模块指令

if

if 指令用于根据指定条件执行一系列重写或配置操作,类似于编程语言中的条件判断语句。它允许根据请求的属性(如 URL、请求头、变量等)动态调整 Nginx 的处理逻辑,是实现 URL 重写、访问控制、动态配置等功能的核心工具

set

set 指令用于定义或修改变量,这些变量可在后续的配置逻辑(如 if 判断、rewrite 重写、请求头设置等)中引用,是实现动态配置和逻辑处理的重要工具

break

break 指令用于终止当前作用域内的重写规则(rewrite)执行,并停止后续其他重写相关指令的处理,直接按当前 URI 继续处理请求。它的核心作用是控制重写流程,避免不必要的规则重复执行

return

return 指令用于直接终止请求处理流程,并向客户端返回指定的 HTTP 状态码、重定向 URL 或响应内容。它是实现跳转、访问控制、错误处理等功能的常用指令,作用于请求处理的任意阶段,一旦执行就会立即结束当前请求的处理

常用状态码:

200:成功(常用于返回简单响应内容)

301:永久重定向(浏览器会缓存跳转关系,适合永久迁移的 URL)

302:临时重定向(默认,浏览器不缓存,适合临时跳转)

403:禁止访问(常用于权限控制)

404:资源不存在(可自定义错误页面或直接返回)

503:服务暂时不可用(常用于过载保护或维护)

示例:

强制使用加密的https
server {listen 80;server_name example.com;# 所有 HTTP 请求永久重定向到 HTTPSreturn 301 https://www.jie.org;
}

rewrite

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配, rewrite主要是针对用户请求的URL或者是URI做具体处理

正则表达式:

. #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字
\b #匹配单词的开始或结束
^ #匹配字付串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
(n) #匹配重复n次
{n,} #匹配重复n次或更多次
{n,m} #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
{n,m}? #匹配重复n到m次,但尽可能少重复
{n,}? #匹配重复n次以上,但尽可能少重复
\W #匹配任意不是字母,数字,下划线,汉字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非数字的字符
\B #匹配不是单词开头或结束的位置
[^x] #匹配除了x以外的任意字符
[^jie] #匹配除了jie 这几个字母以外的任意字符

rewrite flag 使用介绍

用于控制重写规则执行后的处理流程,决定是否继续执行其他规则、是否重新匹配 location 等。合理使用 flag 可以精准控制 URL 重写的逻辑,避免不必要的规则循环或错误跳转

redirect;
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求,状态码:301break;
#重写完成后,停止对当前URL在当前location中后续的其它重写操作
#而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在location中使用
#适用于一个URL一次重写last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,
#而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户

redirect与permanent区别

redirect(临时重定向浏览器会临时记录新 URL,但下次请求原 URL 时,仍会向服务器确认最新地址。搜索引擎不会更新原 URL 的索引,仍会保留原 URL 的权重和排名。通常指HTTP 302 Found(或 307 Temporary Redirect)状态码,表示请求的资源临时转移到了新的 URL。

permanent(永久重定向)浏览器会永久缓存新 URL,下次请求原 URL 时,会直接跳转到新地址,不再向服务器确认。搜索引擎会更新索引,将原 URL 的权重和排名转移到新 URL,原 URL 会逐渐从搜索结果中消失。对应HTTP 301 Moved Permanently状态码,表示请求的资源永久转移到了新的 URL。

动静分离

两台后端服务器一台静态一台动态

配置文件

image-20250727151523622

缓存

配置方法:

image-20250727160633315

image-20250727160653469

测试效果:

缓存前:

image-20250727160709216

缓存后:

image-20250727160731119

二次开发

编译  ​

[root@Webserver openresty-1.25.3.1]# ./configure --prefix=/usr/local/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@Webserver openresty-1.25.3.1]# gmake && gmake install

image-20250729165648388

访问效果:

http://www.xdnf.cn/news/17500.html

相关文章:

  • GSON 框架下百度天气 JSON 数据转 JavaBean 的实战攻略
  • ZooKeeper和Reids做分布式锁的区别?
  • Notepad--:国产跨平台文本编辑器,Notepad++ 的理想替代方案
  • 车载软件架构 --- 车辆量产后怎么刷写Flash Bootloader
  • 【数据结构入门】二叉树(1)
  • Redis7 GEO功能介绍与电商场景案例解析
  • Android模块化架构深度解析:从设计到实践
  • HTML5中华美食网站源码
  • (Arxiv-2025)Phantom-Data:迈向通用的主体一致性视频生成数据集
  • LangChain框架之 invoke() 方法
  • 【SpringBoot】02 基础入门-什么是Spring Boot?:Spring与SpringBoot
  • CLIP在文生图模型中的应用
  • Unity笔记(五)知识补充——场景切换、退出游戏、鼠标隐藏锁定、随机数、委托
  • redis笔记(二)
  • 深入解析游戏引擎(OGRE引擎)通用属性系统:基于Any类的类型安全动态属性设计
  • 《深度剖析前端框架中错误边界:异常处理的基石与进阶》
  • Rust 实战五 | 配置 Tauri 应用图标及解决 exe 被识别为威胁的问题
  • 麒麟系统使用-PATH设置
  • 【96页PPT】华为IPD流程管理详细版(附下载方式)
  • 34-Hive SQL DML语法之查询数据-3
  • 游戏盾是什么?
  • Vibe Coding 自然语言驱动 AI 编程方式
  • 在Linux中部署tomcat
  • Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin
  • 自然语言处理实战:用LSTM打造武侠小说生成器
  • GraalVM !拥抱云原生的 JVM
  • Python 的浅拷贝 vs 深拷贝(含嵌套可变对象示例与踩坑场景)
  • 人工智能正在学习自我提升的方式
  • TF-IDF提取关键词(附实战案例)
  • 商业解决方案技术栈总结