文章目录
一,基础服务
1.nginx是什么
由俄罗斯工程师Igor Sysoev于2002年开始开发,于2004年首次发布。由于其高性能、稳定性和丰富的功能集,NGINX已经成为全球常用Web服务器之一。 是一种高性能的轻量级开源Web服务器和反向代理服务器(正向代理是客户端),还可以用作邮件代理(IMAP、POP3、SMTP)服务器 。 系统消耗的资源少,对于HTTP并发连接到的处理能力高,单台物理服务器可支持30000~50000个并发请求 。NGINX并发能力受CPU个数,本地服务器的最大打开文件的数量(优化并发量)。NGINX在应用层(七层),也支持传输层(第四层,ip+端口)
下载地址:http://mirrors.sohu.com/nginx/
**Tengine **
是一个基于 NGINX 的开源 Web 服务器和反向代理服务器,由阿里巴巴公司开发。继承了 NGINX 的许多核心功能,并在此基础上进行了扩展和优化,在性能、稳定性和企业级特性方面进行了优化 在设计上与 NGINX 高度兼容,大部分 NGINX 的配置和功能可以无缝迁移到 Tengine。 提供了许多 NGINX 中没有的扩展模块 。 如用于访问控制、流量管理和日志分析的功能模块 。 增强了负载均衡算法, 安全模块 添加了访问控制。 内置了更详细的监控和统计功能,支持实时查看服务器的性能和状态。
下载地址:http://tengine.taobao.org/
2.功能
- 静态资源服务器:NGINX 处理静态文件( 图片,js,css,tx )请求,提供高效的文件服务。
- HTTP/HTTPS 反向代理:NGINX 根据 URL (在七层)路由请求,支持负载均衡和缓存。
- 动态资源请求:NGINX 将请求转发到后端应用服务器(如 FastCGI、uWSGI、SCGI)。
- TCP/UDP 请求转发:(在第四层)NGINX 处理低层协议的负载均衡和代理,适用于数据库、DNS、邮件等服务。
3.基础特性
- 模块化设计,扩展能力好
- 高度可靠
- 处理大量的 keep-alive 连接时,10000 个连接仅需 2.5M 内存,消耗内存低
- Event-driven(事件驱动)AIO(Asynchronous I/O,异步I/O)mmap(Memory-mapped file,内存映射文件)sendfile
- 能够并不关机更新配置,升级版本,整理日志(热部署)
4.和web服务相关联的功能
4.1支持 Keep-alive 和管道连接:
- Keep-alive:Nginx默认支持Keep-alive连接,这允许单个TCP连接上进行多个HTTP请求/响应交换,减少了连接建立和关闭的开销,提高了效率。
- 管道连接(Pipelining):需要注意的是,HTTP/1.1标准并没有明确要求支持真正的管道连接(即客户端在收到前一个响应之前发送多个请求),且大多数现代浏览器和服务器(包括Nginx)并不完全支持这种机制,因为它可能导致资源使用效率低下和安全问题。然而,通过Keep-alive连接,Nginx已经能够高效地处理多个并发请求,尽管这不是传统意义上的管道连接。
4.2基于IP及用户的访问控制:
- Nginx支持基于IP地址的访问控制,通过
allow
和deny
指令可以限制或允许特定IP地址的请求。 - 对于基于用户的访问控制,Nginx通常与认证模块(如
ngx_http_auth_basic_module
)结合使用,通过用户名和密码进行认证。
4.3支持速率限制及并发数限制:
- 速率限制:Nginx的
limit_req_module
模块支持请求速率限制,可以限制客户端在指定时间窗口内的请求数。 - 并发数限制:虽然Nginx本身不直接限制并发连接数(因为它基于事件驱动模型,能够处理大量并发连接),但可以通过配置worker进程数和每个进程的连接数来间接控制并发处理能力。此外,可以使用第三方模块(如
ngx_http_limit_conn_module
)来实现更精细的并发连接数限制。
4.4访问日志:
- Nginx支持详细的访问日志记录,帮助管理员分析网站流量、监控性能和调试问题。
- 为了提高性能,Nginx提供了基于日志缓冲的机制。通过
open_log_file_cache
指令,Nginx可以缓存打开的日志文件句柄,从而减少文件打开和关闭的次数。
4.5URL Rewrite:
- Nginx通过
rewrite
指令支持URL重写功能,允许将复杂的URL映射到简单的路径上,便于用户访问和SEO优化。 - 可以在
server
或location
块中配置重写规则,实现灵活的URL管理。
4.6路径别名:
- Nginx通过
alias
指令支持路径别名功能,允许将服务器上的文件或目录映射到不同的URL路径上。 - 这在处理静态文件、分离应用代码和静态资源等方面非常有用。
4.7重新配置和在线升级而无须中断客户的工作进程:
- Nginx支持在线平滑升级(也称为热升级),可以在不停机的情况下更新Nginx版本或配置文件。
- 当重新加载配置文件时,Nginx会优雅地关闭旧连接并启动新配置,确保服务的连续性和稳定性。
- 这意味着在升级或重新配置Nginx时,可以最大限度地减少对客户端的影响。
5.应用环境
- 静态网站托管(提供 HTML、CSS、JavaScript、图片等静态资源 ,文件压缩)
- 动态内容服务( 与应用服务器集成 ,缓存机制 )
- 内容缓存(缓存策略,缓存控制)
- 反向代理( 缓存机制,负载均衡, SSL/TLS 终止 )
6.和apache的区别
6.1基于事件与基于流程:
- Nginx是一个基于事件驱动的服务器,它使用异步非阻塞的方式来处理请求,这意味着Nginx可以处理更多的并发连接,而不需要为每个连接创建新的进程或线程。
- Apache(较老的版本,如Apache HTTPD 2.2及之前)通常使用多进程或多线程模型(MPM,Multi-Processing Modules),每个请求可能在一个新的进程或线程中处理,这增加了内存消耗和上下文切换的开销。然而,Apache 2.4及更高版本也引入了事件驱动(Event MPM)和异步处理(如mod_proxy_http2模块)的改进。
6.2热部署:
- Nginx支持热部署,即在不中断服务的情况下升级或重新加载配置文件。
- Apache也支持类似的功能,但具体实现可能因版本和配置而异。例,Apache的
graceful restart
功能允许在不中断现有连接的情况下重启服务器。
6.3静态文件处理:
- Nginx在处理静态文件(如HTML、CSS、JavaScript、图片等)时通常更高效,因为它直接通过内存和文件系统缓存来服务这些文件,减少了不必要的处理开销。
- Apache也能很好地处理静态文件,但可能需要更多的配置和优化来达到Nginx的性能水平。
6.4反向代理:
- Nginx在反向代理场景中表现出色,特别是与负载均衡和高可用性相关的功能。它支持多种负载均衡算法,并且可以与缓存模块结合使用来进一步提高性能。
- Apache也支持反向代理和负载均衡,但Nginx在性能和灵活性方面更具优势。
6.5子进程与内存消耗:
- Nginx避免使用子进程(或至少不是为每个请求创建子进程),而是使用少量的工作进程(worker processes)和异步事件处理机制。这有助于减少内存消耗和上下文切换。
- Apache在MPM模型中,特别是使用prefork或worker模式时,会为每个请求或一组请求创建子进程或线程,这导致更高的内存消耗。
6.6性能和可伸缩性:
- Nginx的性能和可伸缩性不直接依赖于硬件,因为它通过高效的异步事件处理机制来优化资源使用。
- Apache的性能和可伸缩性则更多地受到其使用的MPM模型和硬件资源(如CPU和内存)的限制。然而,通过适当的配置和优化,Apache也可以达到很高的性能和可伸缩性。
6.7 Nginx 相对于 Apache 的优点
1.轻量级,占用更少的内存及资源:
- Nginx的设计注重效率和资源使用。它不与Apache那样为每个请求创建新的进程或线程(尽管Apache也支持基于事件的MPM,如event MPM,但默认配置下并非如此)。相反,Nginx使用少量的工作进程和异步非阻塞的事件处理机制来处理多个请求。这种设计使得Nginx在资源消耗方面比Apache更加轻量级,特别是在高并发场景下。
2.高并发,保持低资源低消耗高性能:
- Nginx的异步非阻塞模型使其能够处理大量的并发连接,而不会导致系统资源(如CPU和内存)的过度消耗。这种模型允许Nginx同时处理多个请求,而不会使它们相互阻塞。相比之下,Apache的阻塞型模型在处理高并发请求时可能会遇到性能瓶颈,因为每个请求都需要占用一定的系统资源,并且当资源不足时,请求会被阻塞或排队等待。
3.高度模块化的设计:
- Nginx采用了高度模块化的设计,其核心代码非常简洁,而各种功能则通过加载不同的模块来实现。这种设计使得Nginx非常灵活,用户可以根据需要选择加载哪些模块,而不需要担心不必要的功能带来的额外开销。同时,编写Nginx模块也相对简单,因为Nginx提供了清晰的API和文档支持。
3.社区活跃,各种高性能模块出品迅速:
- Nginx拥有一个非常活跃的社区,这个社区中有大量的开发者和用户。他们不断地为Nginx贡献新的模块、修复bug和改进性能。由于Nginx的模块化设计,这些新模块可以很容易地集成到Nginx中,为用户提供更多的功能和选择。同时,由于社区的支持和推动,Nginx的性能和稳定性也得到了不断的提升。
6.8 Apache 相对于 Nginx 的优点
1.Rewrite功能更强大:
- Apache的mod_rewrite模块提供了非常强大和灵活的URL重写功能。它支持基于多种条件的重写规则,包括请求头、请求方法、URL路径等,并且支持正则表达式等高级匹配方式。这使得Apache在处理复杂的URL结构和SEO优化时具有更大的优势。相比之下,Nginx的rewrite功能虽然也很强大,但在某些复杂场景下可能不如Apache灵活。
2.模块超多,功能丰富:
- Apache拥有庞大的模块库,几乎涵盖了Web服务器可能需要的所有功能。从认证、授权、加密、日志记录到内容压缩、缓存、代理等,Apache都提供了相应的模块支持。这种丰富的模块集使得Apache能够轻松应对各种复杂的应用场景,满足用户的不同需求。
3.稳定性高,bug相对较少:
- Apache作为Web服务器的鼻祖之一,已经经过了长时间的发展和完善,其稳定性和可靠性得到了广泛的认可。Apache的社区也非常活跃,不断地修复已知的bug并发布新版本,以确保其稳定性和安全性。相比之下,Nginx虽然也非常稳定,但由于其相对较新的历史,可能在某些方面还存在一些未知的bug或潜在的问题。
4.适合处理动态请求:
- Apache内置了对多种动态内容处理机制的支持,如mod_php、mod_perl等。这使得Apache在处理PHP、Perl等脚本语言时更加直接和高效。虽然Nginx也可以通过与后端服务器(如PHP-FPM)配合使用来处理动态请求,但在某些场景下可能不如Apache直接和高效。
8.构架
上图是 Nginx 的进程模型,下面是图中不同部分的含义:
worker 进程之间是平等的,每个进程,处理请求的机会也是一样的。
当提供 80 端口的 http 服务时,一个连接请求过来,每个进程都有可能处理这个连接。
一个完整的请求是怎样通过互相的协作来实现的:
(1)首先,每个 worker 进程都是从 master 进程 fork 过来,在 master 进程里面,先建立好需要 listen 的 **socket(listenfd)**之后,然后再 fork 出多个 worker 进程。
(2)所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有 worker 进程会在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个进程注册 listenfd 读事件,然后在读事件里调用 accept 接受该连接。(解决惊群)
(3)当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求。产生数据后,再返回给客户端,最后才断开连接,一个完整的请求就是这样的。
一个请求,完全由 worker 进程来处理,而且只在一个 worker 进程中处理
异步非阻塞:
异步的概念是和同步相对的,也就是不同事件之间不是同时发生的。 非阻塞的概念是和阻塞对应的,阻塞是事件按顺序执行,每一事件都要等待上一事件的完成,而非阻塞是如果 事件没有准备好,这个事件可以直接返回,过一段时间再进行处理询问,这期间可以做其他事情。
9.进程结构
工作进程(worker process)的功能
- 所有 Worker 进程都是平等的
- 实际处理的网络请求,由 Worker 进程处理
- Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源
- 增加上下文切换的损耗
- 接受处理客户的请求
- 将请求依次送入各个功能模块进行处理
- I/O调用,获取响应数据
- 与后端服务器通信,接收后端服务器的处理结果
- 缓存数据,访问缓存索引,查询和调用缓存数据
- 发送请求结果,响应客户的请求
- 接收主程序指令,比如重启、升级和退出等
web请求处理的机制
- 多进程方式:服务器每接收到一个客户端请求服务器的主进程就生成一个子进程响应客户端,直到用户关闭连接,优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供服务。
- 多线程方式:与多进程方式类似,但每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销小于一个进程,因此多线程方式减轻了web服务器 对系统资源的要求,多线程也有缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以会相互影响,一旦主进程挂掉则所有子线程都不能工作,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
10.模块
10.1核心模块
- http_core:提供基础 HTTP 功能,如请求和响应的处理、文件服务等。
- events:处理连接的事件驱动机制。
- mail_core:处理邮件代理的基础功能。
- stream_core:提供基础的 TCP/UDP 流处理功能。
10.2标准 HTTP 模块
- http_access:实现基于 IP 地址的访问控制。
- http_auth_basic:实现 HTTP 基本认证。
- http_autoindex:生成目录列表。
- http_browser:基于 User-Agent 的访问控制。
- http_cache_purge:清理缓存。
- http_dav:实现 WebDAV 功能。
- http_gzip:实现对响应内容的 gzip 压缩。
- http_headers:修改 HTTP 头。
- http_limit_conn:限制连接数。
- http_limit_req:限制请求速率。
- http_log:提供日志记录功能。
- http_proxy:实现反向代理功能。
- http_rewrite:重写 URL。
- http_ssl:提供 SSL/TLS 支持。
- http_stub_status:提供 NGINX 状态监控。
- http_upstream:实现上游服务器的负载均衡。
10.3邮件服务核心模块
- mail:这个模块是邮件服务的核心模块,用于处理与邮件相关的配置。
- mail_ssl:为邮件服务提供 SSL/TLS 支持。
- mail_proxy:实现对邮件服务的反向代理功能。
- mail_auth_http:通过 HTTP 协议实现外部邮件认证。
stream模块
- stream模块用于处理 TCP 和 UDP 流量的代理,常用于数据库、消息队列等非 HTTP 协议的负载均衡和反向代理。这个模块在四层工作(OSI 模型的传输层),可以实现高效的 TCP 和 UDP 代理。
10.4第三方模块
- ngx_pagespeed:Google 提供的优化网站速度的模块。
- nginx_http_push_module:实现 HTTP 推送功能。
- nginx_lua_module:支持在 NGINX 中嵌入 Lua 脚本。
- nginx_tcp_proxy_module:提供 TCP 代理功能。
10.5nginx常用模块
ngx_http_core_module 核心模块
ngx_http_access_module 访问控制
ngx_http_auth_basic_module 身份验证
ngx_http_gzip_module 压缩模块
ngx_http_log_module 日志模块
ngx_http_proxy_module 代理模块
ngx_http_rewrite_module 重写模块
ngx_http_stub_status_module 状态页模块
ngx_http_upstream_module 反向代理
ngx_http_stream_module 四层代理
10.6核心模块:
core module
10.7标准模块:
HTTP 模块: ngx_http_*
HTTP Core modules #默认功能
HTTP Optional modules #需编译时指定
Mail 模块: ngx_mail_*
Stream 模块 ngx_stream_*
第三方模块
二,nginx的安装
1.yum安装
配置文件位置在:/etc/nginx.conf
默认根目录在:/usr/share/nginx/html
默认日志文件在:/var/log/nginx/路径下
1.1安装epel-release扩展包
yum install -y epel-release
1.2安装nginx
yum install -y nginx
2.编译安装
nginx下载网址 https://nginx.org/download/nginx-1.18.0.tar.gz
wget https://nginx.org/download/nginx-1.18.0.tar.gz
https://nginx.org/download/nginx-1.20.1.tar.gz
将nginx安装在/opt
2.1先关闭防火墙,关闭增强功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0 #关闭增强功能暂时的
2.2安装依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
2.3创建用户属主属组,让nginx以/sbin/nologin运行,
useradd -M -s /sbin/nologin nginx
chown -R nginx:nginx /usr/local/nginx
tail -1 /etc/passwd #查看创建情况
cd /usr/local/nginx/sbin
./nginx -v #检查版本号
./nginx -V #检查详细信息
2.4到/opt解压
cd /opt
tar xf nginx-1.12.0.tar.gz
2.5切换到解压的nginx目录下, ./configure
cd /opt/nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \ #指定nginx的安装路径
--user=nginx \ #指定用户名
--group=nginx \ #指定组名
--with-http_stub_status_module #启用 http_stub_status_module 模块以支持状态统计操作 VTS
1.18.0
tar zxvf nginx-1.18.0.tar.gz -C /opt/
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
./configure --help
#查看帮助模块
./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-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
make #升级只要make就行
2.6make
make && make install
2.7建立软连接
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin #让系统识别nginx的操作命令
nginx -t #检查配置文件是否配置正确
2.8添加 Nginx 系统服务
方法一
vim /lib/systemd/system/nginx.service
[Unit] #服务的说明
Description=nginx #描述服务
After=network.target #依赖,当依赖的服务启动之后再启动自定义的服务
[Service] #服务运行参数的设置
Type=forking #是后台运行的形式,使用此启动类型应同时指定
PIDFile=/usr/local/nginx/logs/nginx.pid #能够跟踪服务的主进程
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
方法二 service 系统管理
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 35 99 20 固定格式,2345表示运行级别,之后为开机执行顺序和关机执
行顺序
#description:Nginx Service Control Script //这也是必须的
COM="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$COM
;;
stop)
kill -s QUIT $(cat $PID)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PID)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
chmod +x /etc/init.d/nginx
chkconfig --add nginx #添加为系统服务
systemctl stop nginx
systemctl start nginx
service nginx start|stop|restart|reload
2.9给文件授权
chmod 754 /lib/systemd/system/nginx.service
2.10开启nginx服务
systemctl daemon-reload
systemctl start nginx.service
systemctl enable nginx.service
三,nginx信号
1.Nginx 命令选项与含义
选项 | 描述 | 示例命令 |
---|---|---|
-v | 显示 NGINX 的版本并退出 | nginx -v |
-V | 显示 NGINX 的版本和编译时的配置选项,并退出 | nginx -V |
-t | 测试配置文件的语法并退出 | nginx -t |
-T | 测试配置文件的语法,显示配置内容,并退出 | nginx -T |
-q | 抑制非错误信息,仅显示配置测试中的错误信息 | nginx -t -q |
-s signal | 向 NGINX 主进程发送信号(stop | |
, quit | ||
, reopen | ||
, reload | ||
) | nginx -s reload | |
-p prefix | 设置 NGINX 的前缀路径(默认:/etc/nginx/ | |
) | nginx -p /usr/local/nginx/ | |
-e filename | 设置错误日志文件的位置(默认:/var/log/nginx/error.log | |
) | nginx -e /var/log/nginx/my_error.log | |
-c filename | 设置配置文件的位置(默认:/etc/nginx/nginx.conf | |
) | nginx -c /path/to/nginx.conf | |
-g directives | 设置全局指令,这些指令会覆盖配置文件中的设置 | nginx -g "daemon off;" |
2.Nginx 命令与 Kill 命令对比表
Nginx 命令 | Kill 命令 | 含义 |
---|---|---|
nginx -s reload | kill -s HUP | 重新加载配置文件 |
nginx -s stop | kill -9 | |
(KILL) | 立即停止 | |
nginx -s quit | kill -3 | |
(QUIT) | 优雅地退出 | |
nginx -s reopen | kill -s USR1 | 重新生成日志文件 |
nginx -s USR2 | kill -s USR2 | 飞行中升级 |
四,主配置文件
配置文件位置 /usr/local/nginx/conf/nginx.conf
1 全局配置
#user nobody; #运行用户,若编译时未指定则默认为 nobody
worker_processes 4; #工作进程数量,可配置成服务器内核数 * 2,如果网站访问量不大,一般设
为1就够用了
CPU
2P:2个物理CPU
4C:1物理核有4个核心一共有2*4=8个逻辑核
8G内存
4C 16G 高效盘 40G (系统盘) 存储 oss 网络存储 nas 50M
master_processes off或者on #关闭或者打开master进程,默认是开启的
#error_log logs/error.log; #错误日志文件的位置
#pid logs/nginx.pid; #PID 文件的位置
2.I/O实践配置
events {
use epoll; #使用 epoll 模型,2.6及以上版本的系统内核,建议使用
epoll模型以提高性能
worker_connections 4096; #每个进程处理 4096 个连接 2000
}
#如提高每个进程的连接数还需执行“ulimit -n 65535”命令临时修改本地每个进程可以同时打开的最大文
件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文
件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句
柄)。
#可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。
/etc/security/limits.conf
#epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版
本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
若工作进程数为 8,每个进程处理 4 096 个连接,则允许 Nginx 正常提供服务的连接数
已超过 3 万个(4 096×8=32 768),当然具体还要看服务器硬件、网络带宽等物理条件的性
能表现。
3.HTTP 配置
使用“http { }”界定标记,包括访问日志、HTTP 端口、网页目录、默认字符集、连接保 持,以及后面要讲到的虚拟 Web 主机、PHP 解析等一系列设置,其中大部分配置语句都包 含在子界定标记“server { }”内
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;
##此选项允许或禁止使用socket的TCP_CORK的选项(发送数据包前先缓存数据),此选项仅在使用
sendfile的时候使用
#tcp_nopush on;
##连接保持超时时间,单位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
##gzip模块设置,设置是否开启gzip压缩输出
#gzip on;
##Web 服务的监听配置
server {
##监听地址及端口
listen 80;
##站点域名,可以有多个,用空格隔开
server_name www.kgc.com;
##网页的默认字符集
charset utf-8;
##根目录配置
location / {
##网站根目录的位置/usr/local/nginx/html
root html;
##默认首页文件名
index index.html index.php;
}
##内部错误的反馈页面
error_page 500 502 503 504 /50x.html;
##错误页面配置
location = /50x.html {
root html;
}
}
}
日志格式设定:
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录访问时间与时区;
$request: 用来记录请求的url与http协议;
$status: 用来记录请求状态;成功是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从哪个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址
是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信
息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
location常见配置指令,root、alias、proxy_pass
root(根路径配置):root /var/www/html 编译安装 /usr/local/nginx/html
请求www.kgc.com/test/1.html,会返回文件/var/www/html/test/1.html
alias(别名配置):alias /var/www/html
请求www.kgc.com/test/1.html,会返回文件/var/www/html/1.html
proxy_pass(反向代理配置)
五,nginx配置
1. 访问状态统计
1.1确定nginx信息看看是否安装HTTP_STUB_STATUS,查看已安装所有模块
cat /usr/local/nginx/sbin
./nginx -V #查看已安装的 Nginx 是否包含HTTP_STUB_STATUS 模块
cat /opt/nginx-1.18.0/auto/options | grep YES #查看 nginx 已安装的所有模块
1.2备份/usr/local/nginx/conf/nginx.conf
cd /usr/local/nginx/conf
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
1.3修改nginx.conf配置文件,添加 stub_status 配置
vim /usr/local/nginx/conf/nginx.conf
原文
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
改成
server {
listen 80;
server_name l92.168.88.30; #改成nginx服务端ip
charset utf-8; #取消注释“#”号改成这样
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
添加stub_status配置
location / status{
stub_status on; #开启
access_log off;
}
nginx -t #测试配置文件是否有问题
1.4重启
systemctl restart nginx.service
1.5验证
打开浏览器输入192.168.88.30/status
再次访问有变化
已被淘汰了解即可,现在有nginx-module-vts
Active connections :表示当前的活动连接数; server accepts handled requests :表示已经处理的连接信息,三个数字依次表示已处理的连接数、 成功的TCP握手次数、 已处理的请求数。
使用curl -s http://192.168.88.30/status 结合 awk与if 语句可以进行性能监控。
#!/bin/bash
# 使用curl获取状态数据
status=$(curl -s http://192.168.88.30/status)
# 使用awk从状态数据中提取活跃连接数
active_connections=$(echo "$status" | awk '/Active connections/ {print $3}')
# 设置阈值
threshold=200
# 使用if语句判断活跃连接数是否超过阈值
if [ "$active_connections" -gt "$threshold" ]; then
echo "警告: 活跃连接数超过 $threshold,当前为 $active_connections"
# 在这里可以添加更多操作,比如发送通知或执行某个脚本
else
echo "当前活跃连接数为 $active_connections,在安全范围内。"
fi
2. 授权的访问控制
2.1生成用户密码认证文件
yum install -y httpd-tools #apache自带安全工具
htpasswd -c /usr/local/nginx/passwd.db zhang3 #创建和更新存储 HTTP 基本认证用户名和密码的文件
cat /usr/local/nginx/passwd.db #确认是否创建好httpdpasswd
chown nginx /usr/local/nginx/passwd.db #设置属主属组
chmod 400 /usr/local/nginx/passwd.db #仅文件所有者有读的权限
ll /usr/local/nginx/ #查看400权限是否授权成功
2.2 .修改主配置文件 ,添加认证配置
vim /usr/local/nginx/conf/nginx.conf
原文
location / {
root html;
index index.html index.htm;
}
改成
location / {
root html;
index index.html index.htm;
auth_basic "secret";
auth_basic_user_file /usr/local/nginx/passwd.db; #定义密码匹配字符对对应哪个用户哪个文件
}
2.3检查确认有无错误
nginx -t
2.4重启nginx
systemct restart nginx.service
2.5测试
使用zhang3账号密码登录成功
3. 客户端的访问控制
3.1配置
vim /usr/local/nginx/conf/nginx.conf
原文
location / {
root html;
index index.html index.htm;
auth_basic "secret";
auth_basic_user_file /usr/local/nginx/passwd.db; #定义密码匹配字符对对应哪个用户哪个文件
}
改成
location / {
root html;
index index.html index.htm;
allow 192.168.88.40; #添加白名单
deny all; #添加黑名单
#auth_basic "secret"; #注释掉
#auth_basic_user_file /usr/local/nginx/passwd.db; #注释掉
}
nginx -t #检查配置
3.2重启
systemctl restart nginx.service
3.3测试
用192.168.88.20登录192.168.88.30,被提示403被拒绝
用192.168.88.40登录192.168.88.30,正常
4. 域名的 Nginx 虚拟主机
4.1 为虚拟主机提供的域名解析
echo "192.168.88.30 www.xxx.com www.yyy.com" >> /etc/hosts
4.2创建两个网页文档
mkdir -p /usr/local/nginx/html/xxx
mkdir -p /usr/local/nginx/html/yyy
echo "<h1>www.xxx.com</h1>" > /usr/local/nginx/html/xxx/index.html
echo "<h1>www.yyy.com</h1>" > /usr/local/nginx/html/yyy/index.html
4.3配置
vim /usr/local/nginx/conf/nginx.conf
原文
server {
listen 80;
server_name www.xxx.com;
charset utf-8;
access_log logs/xxx.access.log;
location / {
root html;
index index.html index.htm;
allow 192.168.88.40;
deny all;
#auth_basic "secret";
#auth_basic_user_file /usr/local/nginx/passwd.db;
}
location /status {
stub_status on;
access_log off;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
改成
server {
listen 80;
server_name www.xxx.com; # 改成域名
charset utf-8;
access_log logs/xxx.access.log main; # 开启日志记录
location / {
# root html;
root /usr/local/nginx/html/xxx; # 改成域名的地址路径
index index.html index.htm;
# allow 192.168.88.40; # 注释掉
# deny all; # 注释掉
# auth_basic "secret";
# auth_basic_user_file /usr/local/nginx/passwd.db;
}
# location /status { # 注释掉
# stub_status on; # 注释掉
# access_log off; # 注释掉
# } # 注释掉
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
在添加一个server改成如下
server {
listen 80;
server_name www.yyy.com;
charset utf-8;
access_log logs/yyy.access.log;
location / {
# root html;
root /usr/local/nginx/html/yyy; #改成域名地址路径
index index.html index.htm;
# allow 192.168.88.40; # 注释掉
# deny all; # 注释掉
# auth_basic "secret"; # 注释掉
# auth_basic_user_file /usr/local/nginx/passwd.db; # 注释掉
}
# location /status { # 注释掉
# stub_status on; # 注释掉
# access_log off; # 注释掉
# } # 注释掉
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
末行模式输入:set paste再复制server
4.4 重启
systemctl restart nginx
nginx -s reload
4.5设置域名
vim /etc/hosts
192.168.88.30 www.xxx.com
192.168.88.30 www.yyy.com
4.6测试
5.ip的 Nginx 虚拟主机
5.1设置一个临时ip
ifconfig ens36:0 192.168.110.30 netmask 255.255.255.0
5.2配置nginx主配置文件
vim /usr/local/nginx/conf/nginx.conf
原文
server {
listen 80;
server_name www.yyy.com;
charset utf-8;
access_log logs/yyy.access.log;
location / {
# root html;
root /usr/local/nginx/html/yyy;
index index.html index.htm;
# allow 192.168.88.40;
# deny all;
# auth_basic "secret";
# auth_basic_user_file /usr/local/nginx/passwd.db;
}
location /status {
stub_status on;
access_log off;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
改成
server {
listen 192.168.88.33:80; #修改监听地址
server_name www.yyy.com;
charset utf-8;
access_log logs/yyy.access.log;
location / {
# root html;
root /usr/local/nginx/html/yyy;
index index.html index.htm;
# allow 192.168.88.40;
# deny all;
# auth_basic "secret";
# auth_basic_user_file /usr/local/nginx/passwd.db;
}
location /status {
stub_status on;
access_log off;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
5.3重启
systemctl restart nginx.service
5.4测试
6 端口的 Nginx 虚拟主机
6.1配置nginx主配置文件
vim /usr/local/nginx/conf/nginx.conf
原文
第一个server
server {
listen 192.168.88.30:80;
server_name www.xxx.com;
charset utf-8;
access_log logs/xxx.access.log;
location / {
# root html;
root /usr/local/nginx/html/xxx;
index index.html index.htm;
# allow 192.168.88.40;
# deny all;
# auth_basic "secret";
# auth_basic_user_file /usr/local/nginx/passwd.db;
}
# location /status {
# stub_status on;
# access_log off;
# }
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
第二个server
server {
listen 192.168.88.33:80;
server_name www.yyy.com;
charset utf-8;
access_log logs/yyy.access.log;
location / {
# root html;
root /usr/local/nginx/html/yyy;
index index.html index.htm;
# allow 192.168.88.40;
# deny all;
# auth_basic "secret";
# auth_basic_user_file /usr/local/nginx/passwd.db;
}
location /status {
stub_status on;
access_log off;
}
改成
第一个server
server {
listen 192.168.88.30:8080;
server_name www.xxx.com;
charset utf-8;
access_log logs/xxx.access.log;
location / {
# root html;
root /usr/local/nginx/html/xxx;
index index.html index.htm;
# allow 192.168.88.40;
# deny all;
# auth_basic "secret";
# auth_basic_user_file /usr/local/nginx/passwd.db;
}
# location /status {
# stub_status on;
# access_log off;
# }
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
第二个server
server {
listen 192.168.88.33:8090;
server_name www.yyy.com;
charset utf-8;
access_log logs/yyy.access.log;
location / {
# root html;
root /usr/local/nginx/html/yyy;
index index.html index.htm;
# allow 192.168.88.40;
# deny all;
# auth_basic "secret";
# auth_basic_user_file /usr/local/nginx/passwd.db;
}
location /status {
stub_status on;
access_log off;
}
6.2测试