【企业化架构部署】Nginx网站服务

news2024/11/27 10:39:41

文章目录

  • 一、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.访问状态统计
      • 判断服务器并发量
    • 2.基于授权的访问控制
    • 3.基于客户端的访问控制
      • 3.1认证控制规则
      • 3.2具体配置
    • 4.基于域名的 Nginx 虚拟主机
    • 5.基于IP 的 Nginx 虚拟主机
    • 6.基于端口的 Nginx虚拟主机
  • 总结


一、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.访问状态统计

查看已经安装模块

  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 

修改配置文件

  要使用 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.accp.com;
		charset utf-8;
		location / {
			root html;
			index index.html index.php;
		}
		##添加 stub status 配置##			
		location /status {						#访问位置为/status
			stub_status on;						#打开状态统计功能
			access_log off;						#关闭访问/status目录下页面的访问日志记录
		}
	}
}

重启服务,访问测试

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UQzq6kyC-1685628245129)(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:表示当前空闲等待请求的连接数。

判断服务器并发量

  编写脚本用来判断

[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.基于授权的访问控制

生成用户密码认证文件

[root@localhost ~]# yum install -y httpd-tools

#在/usr/local/nginx/目录下生成passwd.db文件,用户名为 zhangsan
[root@localhost ~]# htpasswd -c /usr/local/nginx/passwd.db zhangsan
New password: 
Re-type new password: 
Adding password for user zhangsan	#生成用户和密码的密文
##修改密码文件的权限为400,将所有者改为 nignx ,设置 nginx 的运行用户有读取的权限
[root@localhost ~]# chown nginx /usr/local/nginx/passwd.db
[root@localhost ~]# chmod 400 /usr/local/nginx/passwd.db

修改配置文件

  修改著配置文件相对应目录,添加认证配置项

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
	server {
		location / {
			......
			##添加认证配置##
			#设置密码提示框文字信息
			auth_basic "secret";				
			auth_basic_user_file /usr/local/nginx/passwd.db;
		}
	}

重启服务,访问测试

###检查语法错误
[root@localhost ~]# 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
[root@localhost ~]# systemctl restart nginx

浏览器访问 http://192.168.145.45

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

3.基于客户端的访问控制

3.1认证控制规则

  • deny IP/IP段:拒绝某个IP或IP段的客户端访问。
  • allow IP/IP段:允许某个IP或IP段的客户端访问。
  • 规则从上往下执行,如匹配则停止,不再往下匹配。

3.2具体配置

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
	server {
		location / {
			......
			##添加控制规则##
			#允许访问的客户端 IP
			allow 192.168.145.30;
            #拒绝其它IP客户端访问
			deny all;								
		}
	}

[root@localhost ~]# systemctl restart nginx

4.基于域名的 Nginx 虚拟主机

为虚拟主机提供域名解析

[root@localhost ~]# echo "192.168.145.45 www.accp.com www.benet.com" >> /etc/hosts

为虚拟主机准备网页文档

[root@localhost ~]# mkdir -p /var/www/html/benet
[root@localhost ~]# mkdir -p /var/www/html/accp
[root@localhost ~]# echo "<h1>www.accp.com</h1>" > /var/www/html/accp/index.html
[root@localhost ~]# echo "<h1>www.benet.com</h1>" > /var/www/html/benet/index.html

修改Nginx的配置文件

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
......
	server {
		listen 80;
		#设置域名www.accp.com
		server_name www.accp.com;					
		charset utf-8;
		#设置日志名
		access_log logs/www.accp.access.log; 		
		location / {
			#设置www.accp.com 的工作目录
			root /var/www/html/accp;					
			index index.html index.php;
		}
		error_page 500 502 503 504 /50x.html;
		location = 50x.html{
			root html;
		}
	}
	server {
		listen 80;
		#设置域名www.benet.com
		server_name www.benet.com;	
		charset utf-8;
		access_log logs/www.benet.access.log; 
		location / {
			root /var/www/html/benet;
			index index.html index.php;
		}
		error_page 500 502 503 504 /50x.html;
		location = 50x.html{
			root html;
		}
	}
}

重启服务,访问测试

[root@localhost ~]# systemctl restart nginx

浏览器访问
[root@localhost ~]# http://www.accp.com
[root@localhost ~]# http://www.benet.com

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

5.基于IP 的 Nginx 虚拟主机

添加虚拟网卡

[root@localhost ~]# ifconfig ens32:0 192.168.145.145 netmask 255.255.255.0 

修改nginx配置文件

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
......
	server {
		#设置监听地址192.168.145.45
		listen 192.168.145.45:80;					
		server_name www.accp.com;
		charset utf-8;
		access_log logs/www.accp.access.log; 
		location / {
			root /var/www/html/accpc;
			index index.html index.php;
		}
		error_page 500 502 503 504 /50x.html;
		location = 50x.html{
			root html;
		}
	}
	
	server {
		#设置监听地址192.168.145.145
		listen 192.168.145.145:80;					
		server_name www.benet.com;
		charset utf-8;
		access_log logs/www.benet.access.log; 
		location / {
			root /var/www/html/benet;
			index index.html index.php;
		}
		error_page 500 502 503 504 /50x.html;
		location = 50x.html{
			root html;
		}
	}	
}

重启服务,访问测试

[root@localhost ~]# systemctl restart nginx

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

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

6.基于端口的 Nginx虚拟主机

修改nginx配置文件

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
......
	server {
		#设置监听 666 端口
		listen 192.168.145.45:666;
		server_name www.accp.com;
		charset utf-8;
		access_log logs/www.accp.access.log; 
		location / {
			root /var/www/html/accp;
			index index.html index.php;
		}
		error_page 500 502 503 504 /50x.html;
		location = 50x.html{
			root html;
		}
	}
	
	server {
		#设置监听 888 端口
		listen 192.168.145.45:888;	
		server_name www.benet.com;
		charset utf-8;
		access_log logs/www.benet.access.log; 
		location / {
			root /var/www/html/benet;
			index index.html index.php;
		}
		error_page 500 502 503 504 /50x.html;
		location = 50x.html{
			root html;
		}
	}	
}

重启服务,访问测试

[root@localhost ~]# systemctl restart nginx

浏览器访问
http://192.168.145.45:666
http://192.168.145.45:888

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

总结

  • Nginx 内建的访问统计功能由 stub_status 模块提供,需要在编译时启用 - -with-http_stub_status_module”选项
  • Nginx 页面访问安全有基于授权和基于客户端两种方式
  • Nginx 虚拟主机搭建可基于 IP、域名和端口

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

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

相关文章

39 KVM管理设备-管理快照

文章目录 39 KVM管理设备-管理快照39.1 概述39.2 操作步骤 39 KVM管理设备-管理快照 39.1 概述 虚拟机在使用过程中可能由于病毒对系统的破坏、系统文件被误删除或误格式化等原因造成虚拟机系统损坏导致系统无法启动。为了使损坏的系统快速恢复&#xff0c;openEuler提供了存…

每日学术速递5.30

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Accelerated Coordinate Encoding: Learning to Relocalize in Minutes using RGB and Poses(CVPR 2023 Highlight) 标题&#xff1a;加速坐标编码&#xff1a;学习使用 RGB 和姿势…

阿里邮箱POP3/SMTP服务

最近发现一个问题&#xff0c;小伙伴给我发的邮件&#xff0c;收和回都不及时。于是我现在将所有的邮箱&#xff0c;通过POP3/SMTP协议整合到了一起。再配合小米手环&#xff0c;就能做到邮件无遗漏。 一、邮箱常用协议 邮箱中常用三类协议 POP3 Post Office Protocol versi…

Python numpy - 数组与矩阵的运算

目录 数组array 一 数组的函数 unique函数 sum函数 max函数 二 数组的加减 三 数组的乘除 矩阵matrix 一 矩阵的生成 二 矩阵的加减 三 矩阵的乘法 数组array 创建数组a和b用来运算&#xff08;至少两个&#xff09; import numpy as np a np.random.randint(10,siz…

Java网络开发(Tomcat)—— web的 请求request (post和get请求)和 响应response

目录 引出请求request1.带数据的请求初步2.用注解WebServlet代替配置文件3.表单form的请求4.get请求和post请求 响应response1.用户登陆前端显示一段话2.如何在前端显示一张表 转发和重定向1.请求转发---request2.响应重定向----response 【需求】表格显示在网页方案一&#xf…

自然语言处理从入门到应用——评价指标

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 相关文章&#xff1a; 深入理解机器学习——机器学习模型的性能度量 由于自然语言处理任务的多样性以及评价的主观性&#xff0c;因此很难使用单一的评价指标衡量所有任务的性能&#xff0c;所以针对不同类型的任务&…

C++服务器框架开发9——日志系统LogFormatter_4/各个类的关系梳理/std::function/std::get

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见&#xff1a;[C高级教程]从零开始开发服务器框架(sylar) 上一篇&#xff1a;C服务器框架开发8——日志系统LogFormatter_3/override/宏定义优化switchcase结构 C服务器框架开发9——日志系统LogFormatt…

3-10 0-1背包问题

1.什么是0-1背包问题 0-1背包问题是动态规划中的一个经典问题&#xff0c;其目标是在给定背包容量和一组物品的重量和价值的情况下&#xff0c;选择一些物品放入背包中&#xff0c;使得放入的物品总重量不超过背包容量&#xff0c;并且使得放入的物品总价值最大化。 问题的输…

低代码平台实力盘点:2023年最具实力的低代码平台排行榜

低代码平台是近年来迅猛发展的技术之一。它通过用最少量的编程代码去开发应用程序&#xff0c;从而提高效率。由此&#xff0c;许多企业都在使用低代码平台进行业务的开发和升级。低代码平台可以大幅简化编码过程&#xff0c;并且可以快速构建定制化的应用程序&#xff0c;从而…

GC 调优(工具篇)

进行GC性能调优时, 需要明确了解, 当前的GC行为对系统和用户有多大的影响。有多种监控GC的工具和方法, 本章将逐一介绍常用的工具。 JVM 在程序执行的过程中, 提供了GC行为的原生数据。那么, 我们就可以利用这些原生数据来生成各种报告。原生数据(raw data) 包括: 各个内存池…

1. 卷积的基本结构

一、卷积神经网络的结构有哪些&#xff1f; 一般包含5种类型的网络层次结构&#xff1a; 输入层&#xff1a;卷积网络的原始输入&#xff0c;可以是原始或预处理后的像素矩阵 卷积层 &#xff1a;参数共享、局部连接&#xff0c;利用平移不变性从全局特征图提取局部特征 激活层…

路径规划算法:基于原子搜索优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于原子搜索优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于原子搜索优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

java并发编程:java内存模型介绍

文章目录 并发编程模型的两个关键问题物理计算机的内存模型缓存不一致的问题总线加LOCK#锁的方式缓存一致性协议 Java内存模型 并发编程模型的两个关键问题 线程间如何通信&#xff1f;即&#xff1a;线程之间以何种机制来交换信息 线程间如何同步&#xff1f;即&#xff1a;…

JavaEE-Servlet(CookieSession)

目录 CookieCookie从哪里来&#xff1f;Cookie到哪里去&#xff1f;Cookie有啥用&#xff1f; SessionServlet中操作 Cookie 和 Session 的APIHttpServletRequest小案例&#xff1a;模拟实现登录功能 HttpServletResponseHttpSessionCookie 类中的相关方法小案例&#xff1a;上…

【深入浅出C#】章节 1:C#入门介绍:C#开发环境的设置和配置

一、环境准备 1.1 安装和配置.NET Core 当配置C#开发环境时&#xff0c;安装.NET Core是一个重要的步骤。以下是安装.NET Core的基本过程&#xff1a; 访问官方网站&#xff1a;打开浏览器&#xff0c;访问.NET Core的官方网站&#xff1a;https://dotnet.microsoft.com/en-u…

【vue】三:核心处理---vue的生命周期

文章目录 1.Vue生命周期的四个阶段&#xff0c;八个钩子2.vue的生命周期图例3. 初始阶段&#xff1a;虚拟DOM生成4. 挂载阶段&#xff1a;真实DOM生成5. 更新阶段&#xff1a;data变化重新渲染6. 销毁阶段&#xff1a;卸载所有&#xff0c;销毁vm 1.Vue生命周期的四个阶段&…

Python+Django人脸识别考勤系统网站

程序示例精选 PythonDjango人脸识别考勤系统网站 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonDjango人脸识别考勤系统网站>>编写代码&#xff0c;代码整洁&#xff0c…

文本分类系统Python,基于深度学习CNN卷积神经网络

一、介绍 文本分类系统&#xff0c;使用Python作为主要开发语言&#xff0c;通过TensorFlow搭建CNN卷积神经网络对十余种不同种类的文本数据集进行训练&#xff0c;最后得到一个h5格式的本地模型文件&#xff0c;然后采用Django开发网页界面&#xff0c;实现用户在界面中输入一…

I.MX6ull 按键抖动消除

1 按键消抖的原理 其实就是在按键按下以后延时一段时间再 去读取按键值&#xff0c;如果此时按键值还有效那就表示这是一次有效的按键&#xff0c;中间的延时就是消抖的。 延时函数实现 会浪费 CPU 性能&#xff0c;因为延时函数就是空跑。 我们可以借助定时器来实现消抖&…

小程序服务器SSL证书替换,访问小程序异常

小程序最近SSL证书过期&#xff0c;访问小程序errno: 600001, errMsg: “request:fail -102:net::ERR_CONNECTION_REFUSED“。 1.在阿里云申请DV证书&#xff0c; DV证书&#xff1a;域名验证型证书&#xff0c;证书审核方式为通过验证域名所有权即可签发证书。 DV证书只验证…