文章目录
- 一、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 nginx
、ss -lntp | grep nginx
、ps 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 | 配置后端服务器具体地址,负载均衡配置不可或缺的部分。 |
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
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
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
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
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
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
总结
- Nginx 内建的访问统计功能由 stub_status 模块提供,需要在编译时启用
- -with-http_stub_status_module
”选项 - Nginx 页面访问安全有基于授权和基于客户端两种方式
- Nginx 虚拟主机搭建可基于 IP、域名和端口