目录
3.1nginx主配置文件(/etc/nginx/nginx.conf)
3.2默认的网站配置文件(/etc/nginx/conf.d/default.conf)
5.4日志轮转(/etc/logrotate.d/nginx)
6.2随机主页模块(random_index_module)
6.4文件读取模块(ngx_http_core_module)
6.6页面缓存模块(ngx_http_headers_module)
6.7防盗链模块(ngx_http_referer_module)
7.1ngx_http_limit_req_module(请求限制模块)
7.2ngx_http_limit_conn_module(连接限制模块)
8.1基于IP实现(ngx_http_access_module)
8.2基于用户实现(ngx_http_auth_basic_module)
附加1.nginx源码安装
官方源码包下载地址:nginx: download
# 使用 dnf 包管理器安装 gcc、pcre-devel、zlib-devel、openssl-devel
[root@Nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y
# 创建一个不允许登录的用户 nginx
[root@Nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx
# 解压 nginx-1.24.0.tar.gz 文件
[root@Nginx nginx]# tar zxf nginx-1.24.0.tar.gz
# 再次创建用户 nginx(可能是重复操作确保用户存在)
[root@Nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx
# 进入解压后的 nginx-1.24.0 目录
[root@Nginx nginx]# cd nginx-1.24.0/
# 列出当前目录下的文件和目录
[root@Nginx nginx-1.24.0]# ls
auto CHANGES.ru configure html Makefile objs src
CHANGES conf contrib LICENSE man README
# 运行 configure 脚本进行配置,指定安装路径、运行用户和组,以及启用多个模块
[root@Nginx nginx-1.24.0]#./configure --prefix=/usr/local/nginx \
--user=nginx \ # 指定 nginx 运行用户
--group=nginx \ # 指定 nginx 运行组
--with-http_ssl_module \ # 支持 https://
--with-http_v2_module \ # 支持 http 版本 2
--with-http_realip_module \ # 支持 ip 透传
--with-http_stub_status_module \ # 支持状态页面
--with-http_gzip_static_module \ # 支持压缩
--with-pcre \ # 支持正则
--with-stream \ # 支持 tcp 反向代理
--with-stream_ssl_module \ # 支持 tcp 的 ssl 加密
--with-stream_realip_module # 支持 tcp 的透传 ip
# 编译并安装 nginx
[root@Nginx nginx-1.24.0]# make && make install
#安装好会生成这些文件
[root@Nginx nginx-1.24.0]# ll /usr/local/nginx/
total 4
drwxr-xr-x. 2 root root 4096 Aug 15 23:11 conf # 配置文件目录
drwxr-xr-x. 2 root root 40 Aug 15 23:11 html # 网页文件目录
drwxr-xr-x. 2 root root 6 Aug 15 23:11 logs # 日志文件目录
drwxr-xr-x. 2 root root 19 Aug 15 23:11 sbin # nginx 可执行文件目录
#添加环境变量
[root@Nginx nginx-1.24.0]# grep export ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin # 将 nginx 的可执行文件路径添加到环境变量中
[root@Nginx nginx-1.24.0]# source ~/.bash_profile # 使环境变量生效
#查看版本
[root@Nginx ~]# nginx -v
nginx version: nginx/1.24.0 # 查看 nginx 版本号
#为nginx设置系统启动
[root@Nginx ~]# cat /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server # 服务描述
After=syslog.target network-online.target remote-fs.target nss-lookup.target # 在这些目标之后启动
Wants=network-online.target # 表示希望 network-online.target 启动,但不依赖
[Service]
Type=forking # 启动类型为 fork 类型,即启动后会产生一个子进程,父进程退出
PIDFile=/usr/local/nginx/logs/nginx.pid # 指定 Nginx 的进程 ID 文件路径
ExecStartPre=/usr/local/nginx/sbin/nginx -t # 在启动服务之前执行该命令进行配置文件检查
ExecStart=/usr/local/nginx/sbin/nginx # 启动服务的命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload # 重新加载服务的命令
ExecStop=/bin/kill -s QUIT $MAINPID # 停止服务的命令
PrivateTmp=true # 使用私有的临时目录
[Install]
WantedBy=multi-user.target # 表示该服务被多用户目标所需要
[root@Nginx ~]# systemctl daemon-reload # 重新加载 systemd 守护进程,使新的服务配置生效
[root@Nginx ~]# systemctl restart nginx.service # 重新启动 Nginx 服务
附加2.实现Nginx的平滑升级与回滚
平滑升级:
[root@Nginx nginx]# tar zxf nginx-1.26.1.tar.gz
# 解压 nginx-1.26.1 版本的安装包
[root@Nginx nginx]# cd nginx-1.26.1/
#开始编译新版本
[root@Nginx nginx-1.26.1]#./configure --with-http_ssl_module --withhttp_v2_module --with-http_realip_module --with-http_stub_status_module --withhttp_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --
with-stream_realip_module
# 运行配置脚本,指定多个模块用于编译新版本
#只要make无需要make install
[root@Nginx nginx-1.26.1]# make
# 进行编译操作,不执行安装步骤
#查看两个版本
[root@Nginx nginx-1.26.1]# ll objs/nginx /usr/local/nginx/sbin/nginx
-rwxr-xr-x 1 root root 1239416 Jul 18 15:08 objs/nginx
-rwxr-xr-x 1 root root 5671488 Jul 18 11:41 /usr/local/nginx/sbin/nginx
# 查看新编译的 nginx 可执行文件和已安装的旧版本 nginx 可执行文件
#把之前的旧版的nginx命令备份
[root@Nginx ~]# cd /usr/local/nginx/sbin/
[root@Nginx sbin]# cp nginx nginx.24
# 将旧版本的 nginx 命令进行备份,命名为 nginx.24
#把新版本的nginx命令复制过去
[root@Nginx sbin]# \cp -f /root/nginx/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin
# 将新编译的 nginx 可执行文件复制到安装目录下的可执行文件位置
#检测一下有没有问题
[root@Nginx 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
# 检查 nginx 配置文件是否有语法错误
[root@Nginx sbin]# kill -USR2 48732 #nginx worker ID
# 通过向旧版本 nginx 的主进程发送 USR2 信号,启动平滑升级过程。将旧版本主进程的 PID 文件重命名为 nginx.pid.oldbin,并启动新的 nginx 主进程。此时两个主进程都在运行,旧的主进程不再监听端口,新的主进程监听 80 端口,新的主进程会生成新的 worker 进程来处理请求,旧进程不再处理新请求。
#回收旧版本
[root@Nginx sbin]# kill -WINCH 48732
[root@Nginx sbin]# ps aux | grep nginx
# 向旧版本主进程发送 WINCH 信号,逐步停止旧版本的 worker 进程,同时检查系统中运行的 nginx 进程。
#检测版本信息
[root@Nginx sbin]# curl -I localhost
# 通过向本地服务器发送请求来检测 nginx 的响应头信息,以确认 nginx 是否正常运行及版本是否正确。
#查看升级的版本
[root@Nginx sbin]# nginx -v
nginx version: nginx/1.26.2
# 查看当前 nginx 的版本信息,确认已成功升级到 1.26.2 版本。
回滚:
#重新拉起旧版本的worker
[root@Nginx sbin]# cp nginx nginx.26 # 备份当前 nginx
[root@Nginx sbin]# mv nginx.24 nginx # 准备回滚到旧版本
[root@Nginx sbin]# kill -HUP 48732 # 让 nginx 重新加载配置
[root@Nginx sbin]# ps aux | grep nginx # 查看 nginx 进程状态
[root@Nginx sbin]# kill -WINCH 52075 # 停止新版本 nginx 进程
[root@Nginx sbin]# ps aux | grep nginx # 再次查看进程状态
[root@Nginx sbin]# curl -I localhost # 检测 nginx 是否正常
一.Nginx基础介绍
简介:
Nginx是一个高性能的HTTP和反向代理服务器,也是一个邮局服务器,支持高并发,其高并发是通过IO多路复用中的epoll模型实现的。
二.nginx安装配置
通过yum安装
yum install nginx -y
三.Nginx配置文件
/usr/share/nginx/htm/index.html Nginx默认的网站根目录
/etc/nginx/nginx.conf总配置文件
/etc/nginx/conf.d子配置文件夹
/etc/nginx/conf.d/default.conf默认的网站配置文件/etc/logrotate.d/nginx日志轮转
/etc/nginx/mime.types文件关联程序
/etc/nginx/modules模块文件夹
/usr/lib/systermd/system/nginx.service systemctl服务脚本。
/usr/sbin/nginx主程序
/var/cache/nginx缓存各种
var/og/nginx日志文件夹
/usr/ib64/nginx Nginx模块目录
3.1nginx主配置文件(/etc/nginx/nginx.conf)
user nginx; # 设置运行nginx的用户
worker_processes auto; # 设置工作进程数量为自动
error_log /var/log/nginx/error.log; # 错误日志文件路径
pid /run/nginx.pid; # 进程ID文件路径
events {
worker_connections 1024; # 每个工作进程的最大连接数
}
http {
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 /var/log/nginx/access.log main; # 访问日志文件路径及使用的日志格式
sendfile on; # 开启sendfile系统调用传输文件
tcp_nopush on; # 开启tcp_nopush功能
tcp_nodelay on; # 开启tcp_nodelay功能
keepalive_timeout 65; # 客户端保持连接超时时间
types_hash_max_size 4096; # MIME类型哈希表最大值
include /etc/nginx/mime.types; # 包含MIME类型文件
default_type application/octet-stream; # 默认MIME类型
include /etc/nginx/conf.d/*.conf; # 包含指定目录下的所有.conf配置文件
server{
location / {
}
}
}
总结:整个nginx主配置文件分为3大模块,分别是全局配置模块,events模块,http模块,而http模块还可以包括server模块(虚拟主机配置部分)和location模块(配置请求的路由)。
3.2默认的网站配置文件(/etc/nginx/conf.d/default.conf)
server {
listen 80; # 监听端口80
server_name localhost; # 设置服务器名称为localhost
#charset koi8-r; # 设置字符编码为koi8-r
#access_log /var/log/nginx/host.access.log main; # 设置访问日志路径及日志格式
location / {
root /usr/share/nginx/html; # 设置根目录为/usr/share/nginx/html
index index.html index.htm; # 设置默认访问文件为index.html或index.htm
}
}
四.创建新的虚拟主机
setenforce 0 # 临时关闭SELinux
systemctl stop firewalld # 停止Firewalld防火墙
vim /etc/nginx/conf.d/yulang.conf # 使用vim编辑器打开Nginx配置文件yulang.conf
# Nginx配置文件内容
server {
listen 80; # 监听端口80
server_name www.yulang.com; # 设置服务器名称为www.yulang.com
location / {
root /yulang; # 设置根目录为/yulang
index index.html; # 设置默认访问文件为index.html
}
}
mkdir /yulang # 创建/yulang目录
echo yulang > /yulang/index.html # 在/yulang目录下创建index.html并写入内容"yulang"
systemctl restart nginx # 重启Nginx服务
vim /etc/hosts # 使用vim编辑器打开hosts文件
192.168.145.129 www.yulang.com # 将www.yulang.com映射到IP地址192.168.145.129
curl www.yulang.com # 使用curl命令访问www.yulang.com网站
这里还可以访问指定的文件:
curl www.yulang.com/index.html
五.Nginx日志
5.1nginx日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
$remote_addr远程地址:记录客户端IP地址
$remote_user远程用户:记录客户端用户名称
$time_local本地时间:服务器自身时间
$request请求:记录请求的URL和HTTP协议
$status状态: 记录请求状态
$body_bytes_sent发送给客户端的字节数,不包括响应头的大小
$http_referer记录从哪个页面链接访问过来的(超链接 )
$http_user_agent记录客户端浏览器相关信息
$http_ x_ forwarded_for代理IP
5.2查看日志
/var/log/nginx/access.log(正常日志):
[root@serverd ~]# tail /var/log/nginx/access.log
192.168.145.131 - - [28/Feb/2024:16:58:43 +0800] "GET / HTTP/1.1" 403 153 "-" "curl/7.76.1" "-"
192.168.145.131 - - [28/Feb/2024:16:58:54 +0800] "GET / HTTP/1.1" 200 7 "-" "curl/7.76.1" "-"
# 详细注释:
# 192.168.145.131: 请求的客户端IP地址
# - -: 在标准日志格式中,通常表示标识用户和认证用户的字段,但在这里未提供信息
# [28/Feb/2024:16:58:43 +0800]: 记录的时间戳,包括日期、时分秒和时区信息 (+0800 表示东八区)
# "GET / HTTP/1.1": HTTP请求方法(GET),请求的URI路径(/),HTTP协议版本(HTTP/1.1)
# 403: 服务器响应状态码,表示禁止访问(Forbidden)
# 153: 响应内容的字节数
# "-": 用户代理(User-Agent)字符串,指示发起请求的客户端应用程序(curl/7.76.1)
# "-": 另一个横杠,在标准日志格式中通常表示引用页面的来源,但在这里未提供信息
/var/log/nginx/error.log(错误日志):
[root@serverd ~]# tail /var/log/nginx/error.log
2024/02/29 09:32:51 [emerg] 6937#6937: "access_log" directive is not allowed here in /etc/nginx/nginx.conf:8
2024/02/29 09:33:10 [emerg] 6947#6947: "access_log" directive is not allowed here in /etc/nginx/nginx.conf:8
2024/02/29 09:43:22 [error] 6965#6965: *1 open() "/yulang/89.html" failed (2: No such file or directory), client: 192.168.145.131, server: www.yulang.com, request: "GET /89.html HTTP/1.1", host: "www.yulang.com"
5.3日志缓存(了解)
大量访问到来时,对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭占用了系统的1O,与业务无关,可以使用open_log_file_cache来设定。
open_log_file_cache: max=1000 inactive=20s min_uses=3 vald=1m;
字段解析:
max 1000:日志文件的FD,最大的缓存数量为1000。
min_users3:20秒內小于 3次访问的FD,就给你清掉,结合inactive 20s的时间。
valid 1m:检查周期为1分钟。
总结:缓存最多1000个,到了极限每分钟开始清除掉20秒内小于3次的文件FD.
5.4日志轮转(/etc/logrotate.d/nginx)
[root@serverd ~]# vim /etc/logrotate.d/nginx
# 针对nginx日志文件的logrotate配置
# 匹配所有/var/log/nginx/目录下的以.log结尾的文件
/var/log/nginx/*log {
# 按日进行日志切割
daily
# 保留旧日志文件的数量,超过10个会被删除
rotate 10
# 如果日志文件丢失,也不报错
missingok
# 如果日志文件为空,也不报错
notifempty
# 压缩日志文件
compress
# 在压缩之前保留一个未压缩的副本
delaycompress
# 多个进程共享日志文件时,只在所有进程都完成后再执行postrotate
sharedscripts
# 日志切割后执行的命令
postrotate
# 向nginx主进程发送USR1信号,实现重新打开日志文件,使日志切割生效
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
六.Nginx WEB模块
6.1连接状态模块(stub_status_module)
意义:展示了用户和nginx链接数量信息。
启动状态模块:
[root@serverd ~]# vi /etc/nginx/conf.d/default.conf
在server内添加如下:
# 下面是用于展示Nginx状态的接口配置
location /nginx_status {
stub_status; # 使用stub_status模块
allow all; # 允许所有IP访问
}
[root@serverd ~]# curl 192.168.145.131/nginx_status
Active connections: 1 # 当前活动连接数为1
server accepts handled requests
5 5 5 # 这三个数字分别代表总共接受的连接、处理的连接和请求的数量
Reading: 0 Writing: 1 Waiting: 0 # 当前状态下读取连接数为0,写入连接数为1,等待连接数为0
6.2随机主页模块(random_index_module)
意义:将主页设置成随机页面,是一种微调更新机制
启动随机主页:
[root@serverd app]# mkdir /app #创建一个名为app的目录
[root@serverd app]# touch /app/{bule.html,green.html,red.html,.yellow.html} #在app目录下创建四个文件:bule.html, green.html, red.html, .yellow.html
[root@serverd app]# vim red.html
# 编辑red.html文件,添加HTML代码
<html>
<head>
<title>red color</title>
</head>
<body style="background-color:red">
<h1>red color!</h1>
</body>
</html>
其余几个文件一样添加,只需修改颜色部分
[root@serverd app]# vim /etc/nginx/conf.d/default.conf 编辑default.conf文件
[root@serverd app]# systemctl restart nginx # 重启nginx 服务
#访问
[root@serverd app]# curl 192.168.145.132
还可以在浏览器中测试,会显示出随机访问的结果。
第一次访问:
第二次访问:
其余情况不做展示,还会显示出green页面的情况。
6.3替换模块(sub_moddule)
意义:网页内容替换
[root@serverd app]# vim /etc/nginx/conf.d/default.conf
#将以下内容添加到server下面
server {
# 使用 sub_filter 将响应内容中的 'nginx' 替换为 'yulang'
sub_filter nginx 'yulang';
# 设置 sub_filter_once 为 off,允许多次替换
sub_filter_once off;
}
[root@serverd app]# systemctl restart nginx #重启服务
[root@serverd app]# curl 192.168.145.132 #访问
访问成功图:
成功将nginx替换成了yulang
6.4文件读取模块(ngx_http_core_module)
主要包含了sendfile() tcp_nopush() tcp_nodelay()这三个模块
sendfile:
sendfile:用于发送文件的模块,sendfile系统调用则提供了一种减少拷贝次数,提升文件传输性能的方法,DMA引擎会将数据直接从内核缓冲区拷贝到协议引擎中,从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝。该模块默认开启,形式为sendfile on。
tcp_nopush:
tcp_nopush():网络资源在发送时,除了资源本身会占据空间外,包头也会占据一定的空间,这样当大量资源发送时,会对减缓传输速率,以及浪费一定的网络资源,所以我们开启tcp_nopush()来提升网络传输的效率,当包积累到一定数量时再发送。该模块默认关闭,形式为tcp_nopush on,需手动在主配置文件中打开。
tcp_nodelay:
tcp_nodelay():当网络延迟比较长时,tcp_nodelay()会立刻将数据包发送出去,从而避免网络延迟,存在较长的网络延迟时,才会被启用,形式为tcp_nodelay on。
6.5文件压缩模块
文件传输前进行压缩能够提升文件的传输效率
开启关闭状态:
语法:gzip on|off;
默认:gzip off;压缩等级:
语法:gzip_comp_level level;
默认: gzip_comp_ level 1;(1~9)压缩协议版本:
语法: gzip_http_version1.0| 1.1;
默认:gzip_http_version 1.1;
6.6页面缓存模块(ngx_http_headers_module)
意义:expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求要配置expires,可以在http段中或者server段中或者location段中加入。Nginx(expires缓存减轻服务端压力),开启缓存可以加速浏览网站。
语法:
开启服务器缓存模块:
[root@serverd app]# vim /etc/nginx/conf.d/default.conf
location/ {
root /usr/share/nginx/html
index index.html index.htm;
#开启服务器缓存模块
expires 24h;
}
6.7防盗链模块(ngx_http_referer_module)
搭建一个a.com网站
[root@serverd a.com]# vim /etc/nginx/conf.d/a.conf # 这是 a.com 网站的 Nginx 配置文件 a.conf
server {
listen 80; # 监听端口 80,接受来自客户端的HTTP请求
server_name a.com; # 指定服务器名称为 a.com,在客户端请求中匹配此域名
location / {
root /a.com; # 指定根目录为 /a.com,即网站文件的根目录
index index.html; # 指定默认显示的文件为 index.html
}
}
[root@serverd a.com]# mkdir /a.com #创建a.com目录
[root@serverd a.com]# vim /a.com/index.html #创建index.html
<img src="1.jpg" />
[root@serverd a.com]# cd /a.com #上传图片:1.jpg
[root@serverd a.com]# ll
总用量 36
-rw-r--r--. 1 root root 29978 3月 1 14:27 1.jpg
-rw-r--r--. 1 root root 20 3月 1 14:45 index.html
[root@serverd a.com]# vim /etc/hosts #域名映射
192.168.145.132 a.com b.com
[root@serverd a.com]# systemctl restart nginx #重启服务
虚拟机中的firefox访问:
搭建一个b.com网站(在主页中盗链a网站中的图片)
[root@serverd b.com]# vim /etc/nginx/conf.d/b.conf # 这是 b.com 网站的 Nginx 配置文件 b.conf
server {
listen 80; # 监听端口 80,接受来自客户端的HTTP请求
server_name b.com; # 指定服务器名称为 b.com,在客户端请求中匹配此域名
location / {
root /b.com; # 指定根目录为 /b.com,即网站文件的根目录
index index.html; # 指定默认显示的文件为 index.html
}
}
[root@serverd b.com]# mkdir /b.com #创建b.com目录
[root@serverd b.com]# vim /b.com/index.html #创建index.html
<img src="http://a.com/1.jpg" /> #此处的图片形式是连接,因此盗链了a网站中的图片
[root@serverd a.com]# vim /etc/hosts #域名映射
192.168.145.132 a.com b.com
[root@serverd a.com]# systemctl restart nginx #重启服务
虚拟机中的firefox访问:
启用a.com防盗链功能:
[root@serverd ~]# vim /etc/nginx/conf.d/a.conf
location / {
valid_referers none blocked *.a.com; #不可以引用指定的任何区域
# 检查 Referer 是否有效,如果无效则返回 403 错误
if($invalid_referer){
return 403;
}
}
再次访问b网站,发现图片被防盗链了,访问不了:
如果需要某些网站能够使用盗链资源,需要在配置文件中添加白名单:
[root@serverd ~]# vim /etc/nginx/conf.d/a.conf
location / {
# 匹配以.goole.结尾的域名、以.baidu.结尾的域名、b.com、192.168.145.* 和 a.com
valid_referers none blocked *.a.com server_name ~\.goole\. ~\.baidu\. b.com 192.168.145.* a.com
if($invalid_referer){
return 403;
}
}
再次访问发现能够访问到了
七.Nginx访问限制模块
7.1ngx_http_limit_req_module(请求限制模块)
启动请求频率限制:
0测试未限制的情况下访问
[root@serverd ~]# yum install httpd-tools -y #安装httpd-tools工具
[root@serverd ~]# ab -n 100 -c 10 http://a.com
# 使用ab命令对网站进行压力测试
# -n 表示请求数,这里设置为100
# -c 表示并发数,这里设置为10
# http://a.com 是要测试的网站地址
1启动限制
[root@serverd ~]# vim /etc/nginx/nginx.conf
http{ #限制请求速率的配置,使用客户端IP地址作为限制的key,创建名为req_zone的内存区域,大小为10MB,
设置请求速率为每秒1个请求
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
}
[root@serverd ~]# vim /etc/nginx/conf.d/a.conf
location / {
limit_req zone=req_zone; # 引用名为req_zone的内存区域进行请求限制
}
[root@serverd ~]# systemctl restart nginx
[root@serverd ~]# ab -n 100 -c 10 http://a.com
再次访问时发现,请求的100次,失败了99次:
7.2ngx_http_limit_conn_module(连接限制模块)
意义:通过IP地址限制TCP的连接
八.Nginx访问控制模块
8.1基于IP实现(ngx_http_access_module)
1限制指定的主机访问
[root@serverd ~]# vim /etc/nginx/conf.d/a.conf
server{
allow 192.168.145.129;
deny all;
}
[root@serverd ~]# systemctl restart nginx
[root@serverd ~]# curl http://a.com/ #当前服务器对应的IP为192.168.145.132
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
#结果我们通过192.168.145.132访问不了
#开启对192.168.145.132的访问
[root@serverd ~]# vim /etc/nginx/conf.d/a.conf
server{
allow 192.168.145.132;
deny all;
}
[root@serverd ~]# systemctl restart nginx
#此时成功访问
[root@serverd ~]# curl http://a.com/
<img src="1.jpg" />
8.2基于用户实现(ngx_http_auth_basic_module)
1建立认证文件
[root@serverd ~]# htpasswd -cm /etc/nginx/conf.d/passwd user1 #在 /etc/nginx/conf.d/下创建一个加密的文件 -c创建文件 -m对文件加密
[root@serverd ~]# htpasswd -m /etc/nginx/conf.d/passwd user2 #再次添加要认证的用户时,不需要加-c参数
2启动认证
[root@serverd ~]# vim /etc/nginx/conf.d/a.conf
server{
auth_basic "nginx access test!"; #认证提示信息
auth_basic_user_file /etc/nginx/conf.d/passwd; #引用创建的加密文件
}
3重启验证
[root@serverd ~]# systemctl restart nginx
浏览器测试:
登陆后成功访问到了页面:
九.Nginx Proxy服务器
9.1代理
正向代理:在客户端部署代理服务器,代替客户端对外部网络发送和接收消息。客户端发送一个指定目标的请求给代理服务器,代理服务器再发送给目标服务器,目标服务器收到请求后,将响应的内容发送给代理服务器,代理服务器发给客户端。
反向代理:在服务器端部署代理服务器(为了区分,将真正响应的服务器成为业务服务器),让代理服务器替业务服务器接收请求或发送响应。客户端发送一个请求给代理服务器,代理服务器接收请求并将请求发送给业务服务器,业务服务器将响应发送给代理服务器,代理服务器再将响应发送给客户端。
正向代理和反向代理的不同点
1、部署的位置不同
正向代理部署在客户端,反向代理部署在服务器端。
2、作用不同
正向代理是客户端的代理,帮助客户端突破访问控制;反向代理是服务器的代理,帮助服务器实现负载均衡,安全防护。
9.2Nginx Proxy服务器反向代理实验
详细见链接:http://t.csdnimg.cn/MTQDc
9.3Nginx-proxy缓存(网页缓存)
作用:是将业务服务器中的部分内容存储到代理服务器,客户端发送请求到 Nginx 代理服务器,Nginx 检查缓存中是否有对应的响应内容,如果缓存中存在有效的响应,则直接返回给客户端,不用向后端服务器请求。
Nginx-proxy缓存指令:
1.proxy_cache_path: 配置缓存路径和相关参数
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;
/path/to/cache
: 缓存文件存放路径levels=1:2
: 指定目录结构的级别keys_zone=my_cache:10m
: 定义名为my_cache
的缓存区域,分配的内存大小为 10MBmax_size=10g
: 设置最大缓存大小为 10GBinactive=60m
: 指定缓存文件在闲置指定时间后会被删除
2.proxy_cache: 启用特定的缓存区域
proxy_cache my_cache;
3.proxy_cache_valid: 设置不同状态码的响应的缓存有效时间
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
- 对状态码为 200 和 302 的响应设置缓存有效时间为 10分钟
- 对状态码为 404 的响应设置缓存有效时间为 1分钟
4.proxy_cache_use_stale: 定义在更新缓存时是否允许使用过期的缓存内容
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
- 当请求过程中出现错误、超时或者后端返回特定状态码时,允许使用过期的缓存内容
十.Nginx之location
语法规则:
location优先级:
= > ^~ > ~|~*|!~* > /
精准匹配 > 以某个字符开头 > 正则匹配 > 通配符
实验测试优先级:
[root@serverd ~]# vim /etc/nginx/conf.d/level.conf #自定义一个虚拟主机
server {
listen 80; # 监听80端口
root /abcd; # 设置根目录为/abcd
index index.html; # 设置默认的索引文件为index.html
location = / {
index a.html; # 当访问根路径时,返回a.html页面
}
location ~ / {
index b.html; # 当访问任意路径时,返回b.html页面
}
location / {
index c.html; # 对于其他路径的访问,返回c.html页面
}
}
[root@serverd ~]# mkdir /abcd #创建/abcd目录
[root@serverd ~]# echo aaa > /abcd/a.html #向a.html写入aaa
[root@serverd ~]# echo bbb > /abcd/b.html #向b.html写入bbb
[root@serverd ~]# echo ccc > /abcd/c.html #向c.html写入ccc
[root@serverd ~]# systemctl restart nginx #重启服务
[root@serverd conf.d]# curl 192.168.145.132 #测试
aaa
最后我们可以看到location中的=项确实是优先匹配了
十一.Nginx Rewrite
11.1基础介绍
简介:
用于修改URL或重定向请求。通过使用Rewrite指令,可以根据特定的规则来修改URL路径、重定向请求或执行其他操作。
作用:
1.URL Rewrite常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。
2.静态化的URL地址可以给我们带来更高的安全性。
3.实现网站地址跳转,例如用户访问360buy.com.将其跳转到jd.com。
相关指令:
11.2实验一
题目:当用户访间http://192.168.145.132/abc/a/1.html地址时,通过redirect重定向至http://192.168.145.132/ccc/bbb/2.html
# 还原默认站点
[root@serverd conf.d]# vim /etc/nginx/conf.d/default.conf
# 修改Nginx配置文件,设置默认站点的基本配置信息
server {
listen 80; # 监听端口80
server_name localhost; # 设置服务器名称为localhost
#charset koi8-r; # 设置字符编码为koi8-r
#access_log /var/log/nginx/host.access.log main; # 设置访问日志路径及日志格式
location / {
root /usr/share/nginx/html; # 设置根目录为/usr/share/nginx/html
index index.html index.htm; # 设置默认访问文件为index.html或index.htm
}
}
# 编辑index.html文件
[root@serverd conf.d]# vim /usr/share/nginx/html/index.html
/usr/share/nginx/html/index.html
# 重启Nginx服务
[root@serverd conf.d]# systemctl restart nginx
# 使用curl测试访问默认站点
[root@serverd conf.d]# curl 192.168.145.132
# 配置地址重写
[root@serverd conf.d]# cd /usr/share/nginx/html/ # 切换到html目录
[root@serverd html]# mkdir -p abc/a/
[root@serverd html]# echo abc/a/index.html > abc/a/1.html
[root@serverd html]# mkdir -p ccc/bbb
[root@serverd html]# echo ccc/bbb/2.html > ccc/bbb/2.html
# 修改Nginx配置文件,添加地址重写配置
[root@serverd html]# vim /etc/nginx/conf.d/default.conf
server {
# 定义针对路径 /abc 的配置
location /abc {
# 将任何请求重定向到 /ccc/bbb/2.html
rewrite .* /ccc/bbb/2.html permanent;
#对permanent的解释:
1)不添加permanent时,浏览器测试url不会变化,是服务器内部转换请求
2)添加permanent时,浏览器测试url时会变成重定向后的url,原因在于客户端向重定向的url
发送了请求
}
}
# 重启Nginx服务
[root@serverd html]# systemctl restart nginx
# 访问旧页面测试
[root@serverd html]# curl -L 192.168.145.132/abc/a/1.html #-L选项是为了让curl在遇到HTTP重定向时自动跟随重定向
# 结果显示重定向到了ccc/bbb/2.html页面的内容
匹配方式对是否发生重定向的影响:
11.3实验二
题目:将http://192.168.145.132/2016/a/b/c/1.html的内容重定向成 http://192.168.145.132/2017/a/b/c/1.html的内容
[root@serverd ~]# cd /usr/share/nginx/html/ # 切换到 Nginx 的 HTML 根目录
[root@serverd html]# mkdir -p 2017/a/b/c/ # 递归创建目录结构 2017/a/b/c/
[root@serverd html]# vim 2017/a/b/c/1.html #向2017/a/b/c/1.html中添加内容
2017/a/b/c/1.html
[root@serverd html]# mkdir -p 2016/a/b/c/ # 递归创建目录结构 2016/a/b/c/
[root@serverd html]# vim 2016/a/b/c/1.html #向2016/a/b/c/1.html中添加内容
2016/a/b/c/1.html
[root@serverd html]# vim /etc/nginx/conf.d/default.conf
server {
# 当用户访问 /2016 开头的路径时,执行重定向规则
location /2016 {
rewrite ^/2016(.*)$ /2017/$1; # 将 /2016 开头的路径重定向到 /2017
}
}
[root@serverd html]# systemctl restart nginx #重启服务
[root@serverd html]# curl http://192.168.145.132/2016/a/b/c/1.html #测试
2017/a/b/c/1.html
#我们再次访问http://192.168.145.132/2016/a/b/c/1.html时,发现内容被替换成了/2017中的内容
11.4实验三
题目:将http://www.qianfeng.com替换成http://jd.com
[root@serverd html]# vim /etc/nginx/conf.d/default.conf
server {
# 重定向主机名中包含 qianfeng.com 的请求到 http://jd.com
if ($host ~* qianfeng.com) {
rewrite .* http://jd.com;
}
}
[root@serverd html]# vim /etc/hosts #域名解析
192.168.145.132 qianfeng.com
[root@serverd html]# systemctl restart nginx #重启服务
[root@serverd html]# curl -L http://qianfeng.com/
最终发现访问到了京东:
11.5实验四
题目:将http://qianfeng.com/ccc/bbb/2.html换成http://cloud.com/ccc/bbb/2.html
1.部署http://cloud.com/ccc/bbb/2.html环境
# 编辑 Nginx 配置文件
vim /etc/nginx/conf.d/cloud.conf
# 在 cloud.conf 文件中添加以下内容
server {
listen 80;
server_name cloud.com;
location / {
root /cloud;
index index.html;
}
}
# 创建目录 /cloud
mkdir /cloud
# 在 /cloud 目录下创建 index.html 文件并写入内容 cloud.com
echo cloud.com > /cloud/index.html
# 创建多层目录 /cloud/ccc/bbb/
mkdir -p /cloud/ccc/bbb/
# 在 /cloud/ccc/bbb/ 目录下创建 2.html 文件并写入内容 /cloud/ccc/bbb/2.html
echo /cloud/ccc/bbb/2.html > /cloud/ccc/bbb/2.html
# 编辑 hosts 文件
vim /etc/hosts
# 在 hosts 文件中添加以下内容作为注释
# 192.168.145.132 cloud.com
[root@serverd ~]# curl cloud.com #测试
cloud.com
[root@serverd ~]#curl http://cloud.com/ccc/bbb/2.html #测试
/cloud/ccc/bbb/2.html
2.部署http://qianfeng.com/ccc/bbb/2.html环境
# 编辑 Nginx 配置文件
vim /etc/nginx/conf.d/qianfeng.conf
# 在 qianfeng.conf 文件中添加以下内容
server {
listen 80;
server_name qianfeng.com;
if ( $host ~* qianfeng.com ) {
rewrite .* http://cloud.com$request_uri;
}
location / {
root /qianfeng;
index index.html;
}
}
# 创建目录 /qianfeng
mkdir /qianfeng
# 在 /qianfeng 目录下创建 index.html 文件并写入内容 qianfeng.com
echo qianfeng.com > /qianfeng/index.html
# 创建多层目录 /qianfeng/ccc/bbb/
mkdir -p /qianfeng/ccc/bbb/
# 在 /qianfeng/ccc/bbb/ 目录下创建 2.html 文件并写入内容 /qianfeng/ccc/bbb/2.html
echo /qianfeng/ccc/bbb/2.html > /qianfeng/ccc/bbb/2.html
# 编辑 hosts 文件
vim /etc/hosts
# 在 hosts 文件中添加以下内容并作为注释(在代码旁边)
# 192.168.145.132 qianfeng.com
[root@serverd ~]# curl qianfeng.com #测试
cloud.com
[root@serverd ~]#curl http://qianfeng.com/ccc/bbb/2.html #测试
/qianfeng/ccc/bbb/2.html
#3.地址重写
# 编辑 Nginx 配置文件 qianfeng.conf
vim /etc/nginx/conf.d/qianfeng.conf
# 在 qianfeng.conf 文件中添加以下内容,并在下方添加注释
server {
listen 80;
server_name qianfeng.com;
if ( $host ~* qianfeng.com ) {
rewrite .* http://cloud.com$request_uri; # 将所有请求重定向到 cloud.com
}
location / {
root /qianfeng; # 设置根目录为 /qianfeng
index index.html; # 设置默认首页为 index.html
}
}
systemctl restart nginx #重启服务
#4.测试
[root@serverd conf.d]# curl -L qianfeng.com/ccc/bbb/2.html
/cloud/ccc/bbb/2.html
最后我们发现当我们输入qianfeng.com/ccc/bbb/2.html时返回的内容是http://cloud.com/ccc/bbb/2.html中的内容,成功重写
11.6实验五
题目:访问的urI是目录时,且末尾未添加"/",则会自动添加"/",若添加了"/"和为文件的情况不会添加
本实验基于实验四的背景
[root@serverd ~]# vim /etc/nginx/conf.d/qianfeng.conf
server{
if ( -d $request_filename ) {
# 检查请求的文件路径是否是一个目录
# 如果是目录,则执行以下操作
# 使用 rewrite 指令进行重定向
# 将末尾没有斜杠的 URL 重定向到以斜杠结尾的 URL
rewrite ^(.*)([^/])$ http://$host$1$2/;
}
}
cd /qianfeng/ccc/bbb # 进入路径 /qianfeng/ccc/bbb
mv 2.html index.html # 将文件名为 2.html 的文件重命名为 index.html
[root@serverd ~]# curl -L http://qianfeng.com/ccc/bbb # 使用 curl 命令访问 http://qianfeng.com/ccc/bbb,并跟随重定向
/qianfeng/ccc/bbb/2.html
浏览器测试:
当我们输入qianfeng/ccc/bbb时的页面:
按下回车后的页面:
我们发现未带/的目录在按下回车后的却添加了/
十二.Nginx之CA
简介:
CA证书颁发机构( CA, Certificate Authority)
基于https的协议工作的一中虚拟主机,要构建这样的网站需要mod_ssl模块的支持。且需要提供两个文件:证书文件和私钥文件,证书文件是标识这个网站服务器身份的,私钥文件主要用实现在服务器端对数据进行加密,然后在网站中传输的。证书在生产生活中需要到对应的机构去申请。
12.1私有CA
简介:
由组织或个人自行搭建和管理的证书颁发机构。与公共 CA 不同,私有 CA 并不是公共可信的第三方机构,而是由自己控制和信任的内部机构。
私有CA实验:
1.生成证书及密钥文件
mkdir -p /etc/nginx/ssl #准备存放证书和密钥的目录
openssl genrsa 1024 > /etc/nginx/ssl/server.key #生成私钥用于加密
openssl req -new -key /etc/nginx/ssl/server.key > /etc/nginx/ssl/server.csr #用私钥生成证书-申请书
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:QF
Organizational Unit Name (eg, section) []:CLOUD
Common Name (eg, your name or your server's hostname) []:nginx.linux.com
Email Address []:123@qq.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
openssl req -x509 -days 365 -key /etc/nginx/ssl/server.key -in /etc/nginx/ssl/server.csr > /etc/nginx/ssl/server.crt #同意申请,生成证书
2.将证书配置到服务器中
mkdir /bj
echo "bj ssl web" > /bj/index.html
vim /etc/nginx/conf.d/bj.conf
server {
listen 80; # 监听 80 端口
server_name www.bj.com; # 设置服务器名称为 www.bj.com
location / {
root /bj; # 设置根目录为 /bj
index index.html; # 指定默认首页文件为 index.html
}
}
systemctl restart nginx
vim /etc/hosts
192.168.145.132 www.bj.com
[root@serverd ssl]# curl www.bj.com
bj ssl web
3.将证书信息添加到虚拟主机中
# 下面是一个简单的 Nginx 配置,将 www.bj.com 的 HTTPS 请求指向 SSL 证书和密钥文件
server {
listen 443 ssl; # 监听 443 端口,并启用 SSL
server_name www.bj.com; # 设置服务器名称为 www.bj.com
ssl_certificate /etc/nginx/ssl/server.crt; # 指定 SSL 证书文件路径
ssl_certificate /etc/nginx/ssl/server.key; # 指定 SSL 密钥文件路径
}
systemctl restart nginx
4.测试访问,如下图所示
访问图:
最终我们成功访问到了添加证书后的网站。