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
[root@Webserver ~]#vim /etc/security/limits.conf
安装测试压力工具以及测试
[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会匹配普通匹配
账户认证
账户认证是一种通过用户名和密码验证访问者身份的安全机制,常用于限制对特定网页、目录或整个网站的访问,适用于内部系统、后台管理界面等需要权限控制的场景
配置文件:
实验效果:
自定义错误页面
自定义错误页面是指通过配置 Nginx,将默认的错误提示页面(如 404、500 等)替换为自定义设计的页面,以提升用户体验、保持网站风格一致性,甚至传递品牌信息或引导用户操作
创建错误页面
子配置文件内容:
效果:
自定义错误日志
自定义错误日志是指通过配置,对错误日志的存储路径、记录格式、日志级别等进行个性化设置,以便更高效地监控、排查和分析服务器运行过程中出现的错误
配置文件:
效果:
检测文件是否存在
当检测的文件不存在时会显示指定的内容
测试效果:
长连接
长连接(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;}
测试:
压缩功能
通过对发送给客户端的数据进行压缩,有效减少数据传输量,进而提升网站访问速度,优化用户体验,同时还能降低服务器带宽消耗
[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;
测试效果:
NGINX变量使用
使用nginx的变量需要在编译时添加模块
常用内置变量
$remote_addr | 客户端的 IP 地址 |
$args | 请求中的查询字符串(即 URL 中? 后面的部分) |
$document_root | 当前请求对应的 Nginx 配置中的root 指令指定的文档根目录 |
$document_uri | 与$request_uri 类似,是当前请求的 URI,不包含域名部分 |
$host | 请求头中的Host 字段值 |
$http_user_agent | 客户端的用户代理字符串,包含客户端的浏览器、操作系统等信息 |
$request_filename | 当前请求的文件路径,结合root 或alias 指令生成 |
$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。
动静分离
两台后端服务器一台静态一台动态
配置文件
缓存
配置方法:
测试效果:
缓存前:
缓存后:
二次开发
编译
[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
访问效果: