【Web服务器集群】Nginx网站服务

news2024/12/24 9:30:30

文章目录

  • 一、Nginx 概述
    • 1.什么是 Nginx
    • 2.Nginx 的特点
    • 3.Nginx 应用场景
  • 二、Nginx 服务基础
    • 1.编译安装 Nginx 服务
      • 1.1 布置环境
      • 1.2 安装依赖包
      • 1.3 创建运行用户、组
      • 1.4 编译安装
    • 2.Nginx 的运行控制
      • 2.1 检查配置文件
      • 2.2 启动、停止 Nginx
      • 2.3 日志分割以及升级 Nginx 服务
      • 2.4 添加 Nginx 系统服务
        • 方法一
        • 方法二
    • 3.配置文件 nginx.conf
      • 3.1 全局配置
      • 3.2 I/O事件配置
      • 3.3 HTTP配置
      • 3.4 日志文件格式设定
        • remote_addr 和 http_x_forwarded_for 的区别
      • 3.5 location常见配置指令
  • 三、Nginx访问控制
    • 1.访问状态统计
      • 1.1 查看已经安装模块
      • 1.2 修改配置文件
      • 1.3 重启服务,访问测试
      • 1.4 判断服务器并发量
    • 2.


一、Nginx 概述

1.什么是 Nginx

  Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是, Nginx 是免费的并可以商业化,配置使用也比较简单。

2.Nginx 的特点

  • Nginx 具有高并发、高性能的特性;
  • 系统资源消耗低,相比于 Apache 更加轻量级;
  • Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率
  • Nginx支持热部署。它的启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级;
  • 对 HTTP 并发连接的处理能力高,单台服务器可支持30000 ~ 50000个并发请求,在实际生产环境中约20000~30000并发连接数。

Nginx 和 Apache 的差异

  • 轻量级,Nqinx比Apache占用更少的内存及资源。

  • 静态处理,Nginx静态处理性能比Apache高。

  • Nginx可以实现无缓存的反向代理加速,提高网站运行速度。

  • Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于硬件。

  • Nginx支持热部署,启动速度迅速,可以在不间断服务的情况下,对软件版本或者配置进行升级。

  • Nginx是异步进程,多个连接可以对应一个进程;Apache是同步多进程,一个连接对应一个进程。

  • Nginx高度模块化,编写模块相对简单,且组件比Apache少。

  • 高并发下nginx能保持低资源低消耗高性能;Nqinx配置简洁,Apache配置复杂。

3.Nginx 应用场景

  • http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
  • 虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
  • 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
  • nginz 中也可以配置安全管理。比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。

二、Nginx 服务基础

1.编译安装 Nginx 服务

1.1 布置环境

  关闭防火墙,将安装nginx所需软件包传到/opt目录下。安装包下载网址:nginx中文官网。

###关闭防火墙及开机自启功能
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# systemctl disable firewalld.service 
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# setenforce 0
[root@localhost ~]# cd /opt/
###上传安装包
[root@localhost opt]# rz -E
rz waiting to receive.
[root@localhost opt]# ls
nginx-1.24.0.tar.gz  rh

1.2 安装依赖包

  nginx的配置及运行需要pcre、zlib、openss1等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。

[root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

1.3 创建运行用户、组

  创建运行用户、组(Nginx服务程序默认以 nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)

###创建一个名为nginx的用户,不建立宿主目录,禁止登录到Shell环境中
[root@localhost ~]# useradd -M -s /sbin/nologin nginx

1.4 编译安装

[root@localhost ~]# cd /opt/cd / opt
[root@localhost opt]# tar zxvf nginx-1.24.0.tar.gz
[root@localhost opt]# ls
nginx-1.24.0  nginx-1.24.0.tar.gz  rh

[root@localhost opt]# cd nginx-1.24.0/
[root@localhost nginx-1.24.0]# ls
auto     CHANGES.ru  configure  html     Makefile  objs    src
CHANGES  conf        contrib    LICENSE  man       README
[root@localhost nginx-1.24.0]# ./configure \
--prefix=/usr/local/nginx \					#指定nginx的安装路径
--user=nginx \								#指定用户名
--group=nginx \								#指定组名
--with-http_stub_status_module				#启用http stub_status_module模块以支持状态统计

[root@localhost nginx-1.24.0]# make -j2 && make install

  为了使 Nginx 服务器的运行更方便,可以为主程序 nginx 创建链接文件,以便管理员直接执行nginx 命令就可以调用 Nginx 的主程序

[root@localhost nginx-1.24.0]# cd /usr/local/nginx/
[root@localhost nginx]# ls
conf  html  logs  sbin
[root@localhost nginx]# cd sbin/
[root@localhost sbin]# ls
nginx
###让系统识别nginx的操作命令
[root@localhost sbin]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
###查看版本信息
[root@localhost sbin]# ./nginx -v
nginx version: nginx/1.24.0
###查看版本信息以及配置项
[root@localhost sbin]# nginx -V
nginx version: nginx/1.24.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

2.Nginx 的运行控制

2.1 检查配置文件

  检查配置文件是否配置正确和语法是否正确。若要检查其他位置的配置文件,可以使用-c选项来指定路径。

[root@localhost sbin]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

2.2 启动、停止 Nginx

  直接运行 nginx 即可启动 Nginx 服务器,这种方式将使用默认的配置文件,若要改用其他配置文件,需添加-c 配置文件路径选项来指定路径。这里需要注意,如果服务器中已装有 httpd 等其他 Web 服务软件,应修改端口或停用、卸载,以免造成冲突。

  一般习惯建议使用路径来指定文件启动nginx,因为在升级过程中系统需要指定用户用指定路径来运行nginx

[root@localhost sbin]# /usr/local/nginx/sbin/nginx 
[root@localhost sbin]# ps -aux | grep nginx
root      14711  0.0  0.0  20584   620 ?        Ss   16:07   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     14712  0.0  0.0  23112  1380 ?        S    16:07   0:00 nginx: worker process
root      14812  0.0  0.0 112824   980 pts/1    R+   16:18   0:00 grep --color=auto nginx

  nginx有两种进程,分别是master、worker。master进程是用来管理worker进程以及在启动nginx时用来读取配置文件的;而worker进程使用来处理用户请求。

  查看 nginx 的 PID 号 除了一般的netstat -lntp | grep nginxss -lntp | grep nginxps aux | grep nginx的常规方式,还可以通过nginx的PID文件查看PID号。一般大部分的应用程序在启动过程中都会生成PID文件。

[root@localhost sbin]# cat /usr/local/nginx/logs/nginx.pid
14711

  通过 kill 命令发送 HUP 信息表示重载配置,发送 QUIT 信息表示退出进程,发送 kill 信息表示杀死进程。当Nginx 进程运行时,PID 号默认存放在 logs/ 目录下得 nginx.pid 文件中,因此若使用 kill 命令,可以根据 PID 号进行控制。

#结束进程
kill -3 <PID号>
kill -s QUIT <PID号>      					 #-s选项表示指定信号种类
killall -3 nginx
killall -s QUIT nginx                        #等同于-3
 
#重载配置
kill -1 <PID号>
kill -s HUP <PID号>
killall -1 nginx
killall -s HUP nginx                         #等同于-1

  注意,这里谨慎使用 kill -9 选项,可能导致数据丢失,而 kill -3 并不会影响程序运行。

2.3 日志分割以及升级 Nginx 服务

#日志分制,重新打开日志文件
kill -USR1 <PID号>
#平滑升级
ki1l -USR2 <PID号>

  如果想要升级nginx的版本,除了平滑升级外,还可以使用新版本升级。

###需要解压新版本的压缩包
tar -zxvf nginx-1.xx.xx.tar.gz
###进入新版本的配置目录下
cd nginx-1.xx.xx
###加载新的模块
./configure \
-prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
--with-http_ssl_module
###进行编译安装
make
###将原来的可执行文件进行备份,防止升级失败破坏文件
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old
cp objs/nginx /usr/local/nginx/sbin/nginx
make upgrade  #要保证当前 nginx进程是通过 /usr/locaL/nginx/sbin/nginx启动的,而不是通过查找环境变量中那个nginx命令启动的
#或者先killall nginx ,再/usr/local/nginx/sbin/nginx

2.4 添加 Nginx 系统服务

方法一

  编写脚本来获取nginx系统服务

[root@localhost ~]# cd /etc/init.d/
[root@localhost init.d]# vim /etc/init.d/nginx
#!/bin/bash
###通过chkconfig调用到系统服务当中,设置开机自启动以及第22个启动和第88个关闭
#chkconfig: 35 22 88
###设置相关描述
#description:Nginx Service Control Script
###获取nginx路径
COM="/usr/local/nginx/sbin/nginx"
###获取nginx进程的pid
PID="/usr/local/nginx/logs/nginx.pid"
###获取执行脚本后面跟着的第一个位置变量
case "$1" in
start)
    netstat -lntp | grep nginx
    if  [ $? -eq 0 ]
    then
        echo "nginx 已经启动..."
    else
        echo "nginx 正在启动..."
        $COM
    fi
;;
stop)
    kill -s QUIT $(cat $PID)
;;
restart)
    $0 stop
    $0 start
;;
reload)
    kill -s HUP $(cat $PID)
;;
status)
    netstat -lntp | grep nginx
    if  [ $? -eq 0 ]
    then
        echo "nginx 已经启动..."
    else
        echo "nginx 没有启动..."
    fi
;;
*)
    echo "Usage: $0 {start|stop|restart|reload|status}"
esac

  给脚本赋执行权限以及执行脚本

[root@localhost init.d]# chmod +x /etc/init.d/nginx
###停止nginx
[root@localhost init.d]# ./nginx stop
[root@localhost init.d]# ps -aux | grep nginx
root      73048  0.0  0.0 112824   976 pts/1    R+   17:04   0:00 grep --color=auto nginx
###启动nginx
[root@localhost init.d]# ./nginx start
nginx 正在启动...
###查看nginx
[root@localhost init.d]# ./nginx status
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      73084/nginx: master 
nginx 已经启动...
[root@localhost init.d]# ps -aux | grep nginx
root      73084  0.0  0.0  20584   620 ?        Ss   17:07   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     73085  0.0  0.0  23112  1380 ?        S    17:07   0:00 nginx: worker process
root      73098  0.0  0.0 112824   980 pts/1    R+   17:07   0:00 grep --color=auto nginx

方法二

  添加nginx为nginx.service服务

[root@localhost ~]# cd /usr/lib/systemd/system/
[root@localhost /usr/lib/systemd/system]# ls            #里面都是启动脚本
abrt-ccpp.service                        plymouth-poweroff.service
abrtd.service                            plymouth-quit.service
abrt-oops.service                        plymouth-quit-wait.service
abrt-pstoreoops.service                  plymouth-read-write.service
.......

  配置nginx.service启动脚本

[root@localhost /usr/lib/systemd/system]#vim nginx.service
[Unit]										
Description=nginx							#服务的描述
After=network.target						#描述服务类别,设置依赖关系
[Service]									#服务管理参数
Type=forking								#后台运行类型
PIDFile =/usr/local/nginx/logs/nginx.pid	#PID文件位置
ExecStart=/usr/local/nginx/sbin/nginx		#启动服务
ExecrReload=/bin/kill -s HUP $MAINPID		#根据PID重载配置
ExecrStop=/bin/kill -s QUIT $MAINPID		#根据PID终止进程,其中MAINPID是获取主进程的PID
PrivateTmp=true								#是否给服务配置独立临时空间
[Install]									#服务安装相关设置
WantedBy=multi-user.target					#设置在多用户环境环境当中安装服务

  加载服务并启动

###加载新的 unit 配置文件
[root@localhost system]# systemctl daemon-reload
[root@localhost system]# systemctl start nginx.service
[root@localhost system]# ps -aux | grep nginx
root      75742  0.0  0.0  20584   616 ?        Ss   19:21   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     75743  0.0  0.0  23112  1380 ?        S    19:21   0:00 nginx: worker process
root      75775  0.0  0.0 112824   980 pts/1    S+   19:25   0:00 grep --color=auto nginx

3.配置文件 nginx.conf

  在 Nginx 服务器的主配置文件 /usr/local/nginx/conf/nginx.conf 中,包括全局配置、I/O 事件配置和 HTTP 配置这三大块内容,配置语句的格式为 关键字 值;(末尾以分号表示结束),以#开始的部分表示注释。

###过滤出配置文件中没有#开头以及空行
[root@localhost conf]# cat nginx.conf | egrep -v "^$|^\s*#"
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

  注意如果需要修改配置文件建议先备份一个文件。

nginx配置文件主要是由以下几个构成的

模块作用
全局块全局配置,对全局生效;
events块配置影响Nginx服务器与用户的网络连接;
http块配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
server块配置虚拟主机的相关参数,一个http 块中可以有多个server块;
location块用于配置匹配的 uri;
upstream配置后端服务器具体地址,负载均衡配置不可或缺的部分。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2F7seyqz-1685545274802)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230531220006045.png)]

3.1 全局配置

  由各种配置语句组成,不使用特定的界定标记。全局配置部分包括 Nginx 服务的运行用户、工作进程数、错误日志、PID存放位置等基本设置。

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
[root@localhost /usr/local/nginx/conf]#cat nginx.conf
#user  nobody;                              #运行用户,若编译时未指定则默认为nobody
worker_processes  1;						#工作进程数量,一般设置为和cPu核数一样;设置为auto,nginx将会自己获取这个数值
#error_log  logs/error.log;					#错误日志存放位置
#error_log  logs/error.log  notice;			
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;                 #PID文件的位置
worker_rlimit_nofile 60000;					#设置所有worker进程最大可以打开的文件数,默认为1024

3.2 I/O事件配置

(1)使用 events { } 界定标记,用来指定 Nginx 进程的 I/O 相应模型,每个进程的连接数等设置(默认为1024)。

events {
	use epoll;					#使用epoll I/O模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
	worker_connections 60000 ;	#每个进程处理60000个连接
	multi_accept on;			#是否一次性将监听到的连接全接收进来,默认为off,关闭时一次接收一条连接
	accept_mutex on;			#默认为on,开启时表示以串行方式接入新连接,否则将通报给所有worker。这可能会浪费资源并产生不可预计的后果,例如惊群问题
}

知识点:

  • 如提高每个进程的连接数还需执行"ulimit -n 65535"命令临时修改本地每个进程可以同时打开的最大文件数。
  • 在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制。(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)
  • epoll是Linux内核为处理大批句柄而作改进的poll,是Linux 下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
  • worker_prcesses的值和work_connections的值决定了最大并发数量,最大并发数计算方式为: worker_prcesses*work_connections。但在反向代理场景中计算方法不同,因为nginx既要维持和客户路的连接,又要维持和后端服务器的连接,因此处理一次连接要占用2个连接,所以最大并发数计算方式为: worker_prcesses*work_connections/2

(2)linux 系统对文件打开的数量有最大的限制,通常设置为1024,这个数值很容易会达到,从而造成系统程序或者系统的瓶颈。

  如果想要提高每个进程的连接数还需执行 ulimit -n 65535 命令临时修改本地每个进程可以同时打开的最大文件数。

###查看当前进程可以打开的最大文件数open files
[root@localhost /usr/local/nginx/conf]# ulimit -a               
...
pending signals                 (-i) 14959
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
...
###修改当前进程可以打开文件的最大数量
[root@localhost /usr/local/nginx/conf]# ulimit -n              
1024
###查看当前系统的最大文件数
[root@nginx /usr/local/nginx/conf]# cat /proc/sys/fs/file-max      
378925
###通过命令ulimit -n 65535可以进行更改
[root@localhost /usr/local/nginx/conf]# ulimit -a 65535
[root@localhost /usr/local/nginx/conf]# ulimit -n
65535

  如果想要永久修改最大连接数,可以在/etc/security/limits.conf文件中修改。

###在最后一行添加如下内容
###第一列为用户和组
###第二列为磁盘限额,软硬限制
###第三列为项目
###第四列为相应项目的数量
[root@localhost conf]# vim etc/security/limits.conf
*                soft    nofile          65535
*                hard    nofile          65535

   其中nofile是指文件描述符。如果还想修改用户可以打开的最大进程数,可以使用nproc参数。如果想要锁定内存大小,可以使用memlock参数。注意:这些参数配置的文件需要重启系统才能生效。

3.3 HTTP配置

(1)使用 http { } 界定标记,包括访问日志、HTTP 端口、网页目录、默认字符集、连接保持,以及虚拟Web主机、PHP解析等一系列设置,其中大部分配置语句都包含在子界定标记 server { }` 内。

http {
	##文件扩展名与文件类型映射表
	include mime. types;
	##默认文件类型
	default_type application/octet-stream;
	##日志格式设定
	#log_format main  	'Sremote addr - $remote user [$time local] "$request" '
	#					'$status $body_bytes_sent "$http referer" '
	#					'"$http user agent" "shttp x forwarded for"';
	##访问日志位置
	#access_log logs/access.logmain;
	##开启文件传输模式
	sendfile 		on; 
	#只在sendfile on时有效。调用tcp_cork方法,让数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵赛。默认为off。
	#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;
		}
	}
}

(2)验证能否通过ip地址访问nginx网站

[root@localhost /usr/local/nginx/conf]# cd /usr/local/nginx/html/
###查看是否有错误网页和正常网页文件
[root@localhost /usr/local/nginx/html]# ls
50x.html  index.html
[root@localhost /usr/local/nginx/html]# systemctl stop nginx.service 
[root@localhost /usr/local/nginx/html]# systemctl start nginx.service

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DbYmUVyX-1685545274803)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230531212202938.png)]

3.4 日志文件格式设定

[root@localhost logs]# cat /usr/local/nginx/logs/access.log 
192.168.145.1 - - [31/May/2023:21:20:30 +0800] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
192.168.145.1 - - [31/May/2023:21:20:30 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.145.45/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"

   用第一行的日志语句来进行解释各个字段的含义:

    192.168.145.1:客户端地址。

   - -:用户名。

   31/May/2023:21:20:30 +0800:访问时间和时区。

   GET / HTTP/1.1:记录请求方法、请求路径、请求协议。/favicon.ico是浏览器访问会自带文件,它是存储网站前面的log图标。

   200:响应状态码。

   615:记录给客户端发送的文件大小。

   -:可以记录用户是从哪个链接访问过来的。如果是直接访问的话是不显示的,可以用来判断防盗链。

   Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36:记录客户浏览器的相关信息。

参数含义
$remote_addr客户端的ip地址(代理服务器,显示代理服务ip地址)
$remote_user用于记录远程客户端的用户名称(一般为-
$time_local用于记录访问时间和时区
$request用来记录请求的uri与http协议
$status用来记录响应状态码,例如:200成功、404页面找不到等。
$body_bytes_sent给客户端发送的文件主体内容字节数
$http_user_agent记录客户浏览器的相关信息
$http_x_forwarded_for可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$http_referer可以记录用户是从哪个链接访问过来的

remote_addr 和 http_x_forwarded_for 的区别

  通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote _addr拿到的IP地址是反向代理服务器的IP地址。反向代理服务器在转发请求的http头信息中,可以增加http_x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

  简单来说,比如客户访问服务器,中间有个代理服务器,那么$remote _addr获取的IP地址是客户端发来的,而http_x_forwarded_for会获取客户端发给代理服务器的IP地址以及代理服务器发送给服务器的IP地址。

3.5 location常见配置指令

location / {
			##网结根目录的位置/usr/local/nginx/html
			root html;
			##默认首页文件名
			index index.html index.php;
		}

  在location模块下可以添加以下参数进行文件目录配置:

root、 alias、 proxy_pass
root(根路径配置)root /var/www/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 状态统计模块,用来反馈当前得 Web 访问情况,配置编译参数时可添加--with-http_stup_status_dodule 来启用此模块支持。

###查看已安装的 Nginx 是否包含 HTTP STUB STATUS 模块
[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.24.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@localhost ~]# cd /opt/nginx-1.24.0/auto/
###可查看 nginx是否安装了HTTP_STUB_STATUS
[root@localhost auto]# cat options  | grep "HTTP_STUB_STATUS"
HTTP_STUB_STATUS=NO
        --with-http_stub_status_module)  HTTP_STUB_STATUS=YES 

1.2 修改配置文件

  要使用 Nginx 的状态统计功能,除了启用内建模块以外,还需要修改 nginx.conf 配置文件,指定访问位置并添加stub_status 配置代码。(修改之前进行备份)

[root@localhost ~]# cd /usr/local/nginx/conf
[root@localhost conf]# vim /usr/local/nginx/conf/nginx.conf
.....
http {
.....
	server {
		listen 80;
		server name www.kgc.com;
		charset utf-8;
		location / {
			root html;
			index index.html index.php;
		}
		##添加 stub status 配置##			
		location /status {						#访问位置为/status
			stub_status on;						#打开状态统计功能
			access_log off;						#关闭访问/status目录下页面的访问日志记录
		}
	}
}

1.3 重启服务,访问测试

[root@localhost conf]# systemctl restart nginx.service

浏览器访问 http://192.168.145.45/status

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AQSonIHo-1685545274804)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230531224136063.png)]

Active connections:表示当前的活动连接数,即当前与 Nqinx 服务器建立的连接数。
server accepts handled requests:表示已经处理的连接信息。
2 2 1:服务器已接收的连接数:服务器成功处理的连接数;服务器累计处理的总请求数(在保持连接模式下,请求数量可能会大于连接数量)。
Reading:表示当前正在从客户端读取数据的连接数。
Writing:表示当前正在从客户端写入数据的连接数。
Waiting:表示当前空闲等待请求的连接数。

1.4 判断服务器并发量

  编写脚本用来判断

[root@localhost ~]# cat test.sh 
#!/bin/bash
while true
do
    ACTIVECONN=$(curl -Ls 192.168.145.45/status | awk '/Active connections/{print $3}')
    if [ $ACTIVECONN -ge 2 ]
    then 
        echo "警告!当前并发连接过高!当前并发连接数为:$ACTIVECONN 。"
    fi
    sleep 10
done

  执行脚本并打开多个浏览器访问192.168.145.45/status

###将脚本放在后台运行
[root@localhost ~]# ./test.sh &
[1] 78016
[root@localhost ~]# curl -Ls 192.168.145.45/status
Active connections: 1 
server accepts handled requests
 10 10 9 
Reading: 0 Writing: 1 Waiting: 0 
[root@localhost ~]# 警告!当前并发连接过高!当前并发连接数为:3 。
警告!当前并发连接过高!当前并发连接数为:3 。

2.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/595361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux - 第18节 - 网络基础(传输层一)

目录 1.传输层 1.1.再谈端口号 1.2.端口号范围划分 1.3.认识知名端口号 1.4.两个问题 1.5.netstat命令 1.6.pidof命令 2.UDP协议 2.1.UDP协议格式 2.2.UDP协议的特点 2.3.面向数据报 2.4.UDP的缓冲区 2.5.UDP使用注意事项 2.6.基于UDP的应用层协议 3.TCP协议 3…

抖音seo源码开发代码分享

抖音seo优化&#xff0c;抖音seo源码开发&#xff0c;抖音排名系统源码开发展示实例&#xff1a; 思路&#xff1a;抖音seo源码&#xff0c;抖音seo矩阵系统底层框架上支持了从ai视频混剪&#xff0c;视频批量原创产出&#xff0c;云存储批量视频制作&#xff0c;账号矩阵&…

如何制作一个连杆组简易四足机器人

1. 运动功能说明 本文示例将实现R296样机连杆组简易四足机器人前进的功能。 2. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09;‍ 扩展板 Bigfish2.1扩展板‍ 电池7.4V锂…

STM32F105RBT6 -- RCC 系统时钟

1. STM32F105RBT6 系统时钟树 2. 使用外部时钟给系统提供时钟HSE&#xff0c;外接一个8Mhz的晶振 3. 系统在启动的时候就会调用系统初始化函数&#xff0c;配置RCC 时钟系统&#xff0c;在调用main函数之前调用SystemInit函数 startup_stm32f10x_hd.s ; Reset handler Reset_…

电脑重装系统 / 系统迁移

1. 台式机太卡了&#xff0c;在网上买了个固态硬盘&#xff1a;250G&#xff0c; Kingston的&#xff0c;把C盘&#xff08;系统盘&#xff09;迁移到固态硬盘上去 2. 下载软件 https://www.diskgenius.cn/download.php3. 使用DiskGenius软件&#xff0c;可以方便地将系统从一…

【MySQL】- 04 MVCC 概要

MVCC 概要 事务概念事务的特性&#xff1a;ACID事务的操作隔离性引发的并发问题事务的隔离级别 LBCC&MVCCLBCC记录锁&#xff08;Record Locks&#xff09;间隙锁&#xff08;GAP Locks&#xff09;临键锁&#xff08;Next-Key Locks&#xff09;总结当前读什么是MVCC?什么…

[QT_055]设置QT源码调试(qtc+vs/mingw+msvc)

在开发过程中&#xff0c;我们经常用到调试功能&#xff0c;这样方便查找Bug&#xff1b;Qt是一个开源的框架&#xff0c;可以看到源码。虽然但大部分情况下&#xff0c;我们开发时&#xff0c;只是使用&#xff0c;并没有调试它的源码&#xff0c;但如果想深入了解Qt的一些机制…

对于创业者而言,租赁传统办公室和共享办公室有何不同

租办公室和创业密切相关。创业公司需要一个专业、高效、协作的工作环境来促进业务的开展&#xff0c;提升团队的工作效率和形象。租办公室可以为创业公司提供必要的场所和资源&#xff0c;方便团队成员之间的交流和合作&#xff0c;同时也可以作为公司的品牌形象和实力展示。此…

【IDEA】IntelliJ IDEA的使用 和 配置相关

idea安装后首次使用 新建项目 选择项目框架 下一步&#xff1a; 选择文件夹 隐藏文件不必要显示文件 在setings设置&#xff1a; 设置隐藏页面&#xff1a; 输入后回车 快捷键的配置 1.解决输入法冲突 关闭输入法系统功能快捷键 2.把eclipse的快捷键复用 常用快捷键&#…

Java学习(Tomacat)—— web的 请求request (post和get请求)和 响应response

引出 web的 请求request &#xff08;post和get请求&#xff09;和 响应response 请求request 请求&#xff1a;一切从浏览器发往服务器的都叫请求&#xff0c;包括从浏览器地址栏和网页上输入发出的。响应&#xff1a;一切从服务器发给浏览器的都叫响应 1.带数据的请求初步…

django读取csv文件数据生成可视化系统

Django是一个高效、灵活的Python Web框架&#xff0c;它可以快速地构建Web应用程序。在本篇文章中&#xff0c;我们将介绍如何使用django读取csv文件生成数据可视化系统。 1.使用虚拟环境创建项目 pip install virtualenv pip install virtualenvwrapper2.安装django模块,可使…

Oracle19C数据库迁移DM8库

Oracle19C数据库迁移DM8库 一、前期准备... 3 二、数据库信息查询... 3 三、DTS迁移... 6 Oracle数据库&#xff1a;... 6 达梦数据库... 7 1、新建工程... 8 2、新建迁移... 8 3、填写源库信息&#xff0c;使用指定驱动并自定义URL连接... 9 4、填写目标库信息... 10 …

书单 | IPD的12本书

随着IPD&#xff08;集成产品开发&#xff09;在IBM、华为等企业取得了巨大的成功&#xff0c;IPD逐渐被人们所知晓。诸多实践证明&#xff0c;IPD既是一种先进思想&#xff0c;也是一种卓越的产品开发模式&#xff0c;随着人们对IPD认识和探索&#xff0c;未来将会被应用到更多…

同步阻塞与异步非阻塞

同步阻塞消息处理 假如有这样一个系统功能&#xff0c;客户端提交Event至服务器&#xff0c;服务器接收到客户请求之后开辟线程处理客户请求&#xff0c;经过比较复杂的业务计算后将结果返回给客户端 以上设计存在几个显著的缺陷&#xff0c;具体如下。同步Event提交&#xf…

nginx(七十九)rewrite模块指令再探之(一)变量漫谈

一 set与变量 ① 知识回顾 rewrite模块 1) 关注一些易错点、难点的案例场景2) 本文内容很杂,建议读者选取感兴趣的阅读3) 重点关注&#xff1a; nginx.conf中的脚本类指令、本节关注if和set rewrite功能 ② 带着问题学习 1) 变量的作用域2) 变量的声明周期3) nginx变量…

《操作系统》by李治军 | 实验5 - 基于内核栈切换的进程切换

目录 一、实验目的 二、实验内容 三、实验准备 &#xff08;一&#xff09;TSS 切换 &#xff08;二&#xff09;基于堆栈的进程切换流程 四、实验过程 &#xff08;一&#xff09;实现 switch_to() 1、修改 schedule() 中的 switch_to() 2、实现 switch_to() 的汇编代…

企业网站架构部署与优化之LAMP

LAMP LAMP概述1、各组件的主要作用2、各组件安装顺序 编译安装Apache http服务编译安装MySQL服务编译安装PHP解析环境安装论坛 LAMP概述 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供静态和动态Web站点服务…

REST API和GraphQL API的比较

REST API REST&#xff08;表述性状态传输&#xff09;API 是一种应用程序接口 (API) 的架构风格&#xff0c;它使用 HTTP 请求来访问和使用数据。该数据可用于GET、PUT、POST和DELETE数据类型&#xff0c;指的是对资源的读取、更新、创建和删除操作。 RESTful API 使用 HTTP 方…

智能马达保护器在有色冶金行业中的应用

关注acrelzxz 摘要&#xff1a;简要介绍了热继电器、电子式电动机保护器和智能电动机保护器的优缺点&#xff0c;并阐述了智能电动机保护器如何正确的选型&#xff0c;重点比较了智能电动机保护器保护模式、端子控制模式、全通信模式、半通信模式等几种常见工作模式&#xff0…

Java基础(9)——从匿名内部类 到 函数式编程

引出 从匿名内部类到函数式编程的进化 什么是匿名内部类 没有类名----匿名内部类 List的匿名内部类 FunctionalInterface 注解 Collections.sort(list, new Comparator<Emp>() {Overridepublic int compare(Emp o1, Emp o2) {return (int) (o1.getAge()-o2.getAge())…