官网:https://nginx.org/
简介:Nginx是一个开源的高性能HTTP和反向代理服务器。它可以用于静态内容的服务和动态内容的代理,也可以作为负载均衡器、HTTP缓存和反向代理服务器,以及提供HTTP缓存和SSL终端等功能。Nginx已经成为许多大型网站和应用程序的首选服务器软件之一。
源码:Nginx是由C语言编写。
系统:Linux/Mac/Windows
Nginx是一款非常流行的服务器软件,被广泛应用于市场上的各种场景和规模的网站和应用程序中。
1.Web服务器:Nginx可以作为静态内容的服务器,提供快速的文件传输和处理能力。它可以处理大量的并发连接,并具有高性能和低内存消耗的特点。
2.反向代理服务器:Nginx可以作为反向代理服务器,将客户端请求转发给后端的多个服务器。它可以实现负载均衡、请求分发和故障转移,提高系统的可靠性和性能。
3.负载均衡器:Nginx可以将请求分发给多个后端服务器,实现负载均衡。它可以根据不同的算法(如轮询、IP哈希、最少连接等)来分配请求,确保服务器资源的合理利用和高可用性。
4.HTTP缓存服务器:Nginx可以作为HTTP缓存服务器,缓存静态内容和动态内容的响应。这样可以减轻后端服务器的负载,提高响应速度,并减少贷款消耗。
5.SSL终端:Nginx可以作为SSL终端,处理HTTPS请求的加密和解密。它可以提供安全的通信通道,保护用户的数据安全。
总之,Nginx在市场上被广泛应用于各种规模的网站、应用程序和服务中,它的高性能、可靠性和灵活性使其成为许多开发者和运维人员的首选服务器之一。
客户端和目标服务器之间的服务器,客户端向代理发送一个请求指定目标服务器,然后代理向目标服务器请求并获得内容,并返回给客户端,平时说的代理服务器一般是正向代理服务器。
核心:用户知道自己访问的目标服务器。
客户端和目标服务器之间的服务器,客户端向代理发送一个请求,然后代理向目标服务器请求并获得内容,并返回给客户端。反向代理隐藏了真实的服务器。
核心:客户端不知道要访问的目标服务器是哪台服务器,代理会根据一定的策略选择一个真实的服务器进行请求。
场景:访问淘宝,知道访问的域名是taobao.com,但最后面提供数据的集体是什么域名或IP我们并不知道。
官网:https://nginx.org/
备注:请务必使用CentOS 7 以上的的版本,64位系统。
推荐FinalShell 优点:既可以当SSH客户端有可以当做终端模拟器、免费
快速下载:https://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
yum -y install gcc zlib zlib-devel pcre-devel openssl
注:请确保您具有管理员权限(例如,使用root用户或具有sudo权限的用户)来执行此命令。
tar -zxvf nginx-1.18.0.tar.gz
./configure
make
make install
# 使用prefix 可自定义安装路径(./configure --prefix=/usr/local),不填写默认在/usr/local下创建一个nginx文件
# ./configure:这个命令是在源代码目录中运行的,它会检查系统环境并生成一个用于构建软件的Makefile。Makefile是一个包含了编译和链接指令的脚本文件,它告诉计算机如何编译和安装软件。
# make:这个命令会根据Makefile中的指令编译源代码,生成可执行文件。它会自动查找源代码目录中的Makefile文件,并执行其中的编译指令。
# make install:这个命令会将编译生成的可执行文件和相关的文件复制到系统的指定位置,完成软件的安装过程。通常,这些文件会被复制到系统的标准目录,以便其他程序可以找到并使用它们。
cd /usr/local/nginx/sbin
./nginx
# 查看Nginx 进程:
ps -ef | grep nginx
所有配置文件目录
nginx.conf # 主要配置文件
nginx.conf.default #模版、示例(用于nginx.conf文件损坏或者想恢复初始配置时使用)
这是编译安装时Nginx的默认站点⽬录
50x.html #错误⻚⾯
index.html #默认⾸⻚
nginx默认的⽇志路径,包括错误⽇志及访问⽇志
error.log #错误⽇志
nginx.pid #nginx启动后的进程id
access.log #nginx访问⽇志
nginx命令的⽬录
nginx #启动命令
./nginx #默认配置⽂件启动
./nginx -s reload #重启,加载默认配置⽂件
./nginx -c /usr/local/nginx/conf/nginx.conf
#启动指定某个配置⽂件
./nginx -s stop #停⽌
#关闭进程,nginx有master process 和worker process,关闭master即可
ps -ef | grep nginx
kill -9 PID
配置文件(nginx.conf)里每个配置项由配置指令、参数 2个部分构成
# Nginx 运行时会以 nobody 用户身份来执行,这是为了提高安全性,因为 nobody 用户通常具有较低的权限。
user nobody;
# 是一个指令,用于指定 Nginx 启动时使用的工作进程数。在这个例子中,设置为 1,表示只启动一个工作进程。工作进程是 Nginx 的核心组件,用于处理客户端请求和响应。通过设置适当的工作进程数,可以根据服务器的硬件资源和负载情况来优化 Nginx 的性能。
worker_processes 1;
# 用于指定错误日志文件的路径和名称 常见的 Nginx 日志级别:
# debug:最详细的日志级别,用于调试目的。它会记录更多的信息,包括请求的详细数据、变量的值等。在生产环境中一般不建议使用该级别,因为会产生大量的日志数据。
# info:一般的信息级别,用于记录一般的操作和事件。这是默认的日志级别。
# notice:用于记录一些重要的系统事件和警告信息。
# warn:用于记录警告信息,表示可能存在一些问题或潜在的错误。
# error:用于记录错误信息,表示发生了一些错误的操作或事件。
# crit:用于记录严重的错误信息,表示发生了一些严重的问题,可能导致系统崩溃或无法正常工作。
# alert:用于记录需要立即采取行动的事件,表示发生了一些需要立即处理的情况。
# emerg:最高级别的日志,表示发生了紧急情况,可能导致系统无法正常工作。
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
# 用于指定 Nginx 进程 ID 文件的路径和名称
pid logs/nginx.pid;
# 事件模块指令,⽤来指定Nginx的IO模型,Nginx⽀持的有select、poll、kqueue、epoll 等。不同的是epoll⽤在Linux平台上,⽽kqueue⽤在BSD系统中,对于Linux系统,epoll⼯作模式是⾸选
events {
use epoll;
# 定义Nginx每个进程的最⼤连接数, 作为服务器来说:worker_connections * worker_processes,
# 作为反向代理来说,最⼤并发数量应该是 worker_connections * worker_processes/2。因为反向代理服务器,每个并发会建⽴与客户端的连接和与后端服务的连接,会占⽤两个连接
worker_connections 1024;
}
http {
# 该指令用于包含 mime.types 文件,该文件定义了 MIME 类型与文件扩展名之间的映射关系。这样可以确保 Nginx 在处理请求时能够正确地设置响应的 MIME 类型
include mime.types;
# 该指令设置默认的 MIME 类型为 application/octet-stream,即未知文件类型的默认类型。当 Nginx 无法确定请求的文件类型时,将使用该默认类型。
default_type application/octet-stream;
# 日志格式:
# $remote_addr 表示客户端的 IP 地址
# $remote_user 表示远程用户
# $time_local 表示访问时间
# $request 表示请求的 URL
# $status 表示响应状态码
# $body_bytes_sent 表示发送给客户端的字节数
# $http_referer 表示请求的来源页面
# $http_user_agent 表示客户端的 User-Agent 信息
# $http_x_forwarded_for 表示经过代理服务器后的客户端 IP 地址
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 指定日志文件的输出位置
access_log logs/access.log main;
# 是否开启⾼效传输模式 on开启 off关闭
sendfile on;
# 减少⽹络报⽂段的数量
tcp_nopush on;
# 该指令设置了 keep-alive 连接的超时时间为 65 秒。Keep-alive 是一种技术,允许客户端和服务器在单个 TCP 连接上进行多个 HTTP 请求和响应,以减少连接建立和关闭的开销。
#keepalive_timeout 0;
keepalive_timeout 65;
# 启用 Gzip 压缩功能
gzip on;
# 虚拟主机的配置
server {
# 虚拟主机的服务端⼝
listen 80;
# ⽤来指定IP地址或域名,多个域名之间⽤空格分开
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
# URL地址匹配
location / {
# 服务默认启动⽬录
root html;
#默认访问⽂件,按照顺序找
index index.html index.htm;
}
#错误状态码的显示⻚⾯
error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
使用 Nginx 搭建图像和文件服务器有以下几个好处:
综上所述,使用 Nginx 搭建图像和文件服务器具有高性能、低资源占用、简单配置和可定制性强等优势,适用于快速、高效地共享和传输图像和文件的场景。
使用流程:
前端提交图片->后端处理->存储到图片服务器->拼接好访问路径存储到数据库
备注:简单使用,web项目一般会把图片上传到项目本身。很少会用这种方式。
配置文件、图片专属访问路径:
server {
listen 8080;
server_name 59.110.68.26;
location /uploads {
alias /usr/local/uploads/;
}
}
注:1.添加配置后需要重启nginx
./nginx -s reload
2.阿里云服务器_安全组开通8080端口号
访问地址:http://59.110.68.26:8080/uploads/1.jpg
access.log 日志用处:
此外,access.log还可以通过日志分析工具进行进一步的处理和可视化,如ELK Stack、AWStats、GoAccess等,以便更方便地进行日志分析和监控。
默认配置:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 示例
118.186.5.82 - - [20/Jul/2023:14:34:35 +0800] "GET /uploads/1.jpg HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
允许自定义日志记录的格式置项:
$remote_addr:客户端的IP地址。
$remote_user:客户端的用户名(如果启用了基本身份验证)。
$time_local:请求的本地时间。
$request:完整的HTTP请求行,包括请求方法、URL和协议版本。
$status:HTTP响应的状态码。
$body_bytes_sent:发送给客户端的响应体的字节数。
$http_referer:引导用户访问当前页面的URL。
$http_user_agent:客户端的用户代理字符串,用于标识客户端的浏览器和操作系统。
$http_x_forwarded_for:如果使用了代理服务器,该变量包含了客户端的真实IP地址。
$request_method:HTTP请求的方法,如GET、POST等。
$scheme:请求的协议,如http或https。
$host:请求的主机名。
$server_protocol:服务器使用的协议版本。
$request_uri:请求的URI,不包括主机名和查询参数。
$uri:请求的URI,包括主机名和查询参数。
$args:请求的查询参数。
$http_host:请求中的Host头部字段。
$http_user_agent:客户端的用户代理字符串。
$http_cookie:请求中的Cookie头部字段。
$http_x_forwarded_proto:如果使用了代理服务器,该变量包含了客户端请求的协议。
$upstream_addr:如果使用了反向代理,该变量包含了向上游服务器发送请求的IP地址和端口号。
…
awk '{print $1}' access_temp.log | sort -n|uniq -c | sort -rn | head -n 100
命令解析:
awk 是⽂本处理⼯具,默认按照空格切分,
$N 是第切割后第N个,从1开始
sort命令⽤于将⽂本⽂件内容加以排序,-n 按照数值排,-r 按照倒序来排案例的
sort -n 是按照第⼀列的数值⼤⼩进⾏排序,从⼩到⼤,倒序就是 sort -rn
uniq 去除重复出现的⾏列, -c 在每列旁边显示该⾏重复出现的次数。
从接受⽤户请求的第⼀个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间
$upstream_response_time:指从Nginx向后端建⽴连接开始到接受完数据然后关闭连接为⽌的时间
$request_time⼀般会⽐upstream_response_time⼤,因为⽤户⽹络较差,或者传递数据较⼤时,前者会耗时⼤很多
# nginx.cnf
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time';
server {
access_log logs/host.access.log main;
}
重启Nginx后,请求接口
cat time_temp.log|awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
备注:$NF 表示最后⼀列, awk '{print $NF}'
sudo yum install java-11-openjdk-devel
java -version
demo1-1.0-SNAPSHOT.jar监听8080端⼝
下载地址:https://chick-shop-server.oss-cn-beijing.aliyuncs.com/MyServer/demo1-1.0-SNAPSHOT.jar
demo2-1.0-SNAPSHOT.jar监听8081端⼝
下载地址:https://chick-shop-server.oss-cn-beijing.aliyuncs.com/MyServer/demo2-1.0-SNAPSHOT.jar
GET http://IP地址:端口号/api/demo/{id}
# I.直接启动
java -jar demo1-1.0-SNAPSHOT.jar
java -jar demo2-1.0-SNAPSHOT.jar
# II.守护进程方式
nohup java -jar demo1-1.0-SNAPSHOT.jar &
nohup java -jar demo2-1.0-SNAPSHOT.jar &
守护进程的方式启动完成后,输入tail -f nohup.out 查看日志
1、分布式系统中⼀个⾮常重要的概念,当访问的服务具有多个实例时,需要根据某种“均衡”的策略决定请求发往哪个节点,这就是所谓的负载均衡
2、原理是将数据流量分摊到多个服务器执⾏,减轻每台服务器的压⼒,从⽽提⾼了数据的吞吐量
方案一:通过硬件来进⾏解决,常⻅的硬件有NetScaler、F5、Radware和Array等商⽤的负载均衡器,但⽐较昂贵的
方案二:通过软件来进⾏解决,常⻅的软件有LVS、Nginx等,它们是基于Linux系统并且开源的负载均衡策略⽬前性能和成本来看,Nginx是⽬前多数公司选择使⽤的
upstream lbs {
server 59.110.68.26:8080;
server 59.110.68.26:8081;
}
server {
location /api/ {
proxy_pass http://lbs;
proxy_redirect default;
}
}
cd /usr/local/nginx/sbin
./nginx -s reload
访问了6次http://59.110.68.26/api/demo/1后发现每个服务后台各打印了三条日志。
Nginx常⻅的负载均衡策略:节点轮询(默认)
简介:每个请求按顺序分配到不同的后端服务器
场景:会造成可靠性低和负载分配不均衡,适合静态⽂件服务器
简介:weight和访问⽐率成正⽐,数字越⼤,分配得到的流量越⾼
场景:服务器性能差异⼤的情况使⽤
upstream lbs {
server 59.110.68.26:8080 weight=5;
server 59.110.68.26:8081 weight=10;
}
简介:根据请求按访问ip的hash结果分配,这样每个⽤户就可以固定访问⼀个后端服务器
场景:服务器业务分区、业务缓存、Session需要单点的情况
upstream lbs {
ip_hash;
server 59.110.68.26:8080;
server 59.110.68.26:8081;
}
upstream还可以为每个节点设置状态值 down 表示当前的server暂时不参与负载
upstream lbs {
server 59.110.68.26:8080;
server 59.110.68.26:8081;
server 59.110.68.26:8082 down;
}
backup 其它所有的⾮backup机器down的时候,会请求backup机器,这台机器压⼒会最轻,配置也会相对低
upstream lbs {
server 59.110.68.26:8080;
server 59.110.68.26:8081;
server 59.110.68.26:8082 backup;
}
背景:如果某个应用挂了,请求不应该继续分发过去
max_fails :允许请求失败的次数,默认为1.当超过最⼤次数时就不会请求
fail_timeout : max_fails次失败后,暂停的时间,默认:fail_timeout为10s
参数解释:
1.max_fails=N 设定Nginx与后端节点通信的尝试失败的次数。
2.在fail_timeout参数定义的时间内,如果失败的次数达到此值,Nginx就这个节点不可⽤。在下⼀个fail_timeout时间段到来前,服务器不会再被尝试。
3.失败的尝试次数默认是1,如果设为0就会停⽌统计尝试次数,认为服务器是⼀直可⽤的。
具体什么是nginx认为的失败呢?
可以通过指令proxy_next_upstream来配置什么是失败的尝试。
注意默认配置时,http_404状态不被认为是失败的尝试。
upstream lbs {
server 59.110.68.26:8080 max_fails=2 fail_timeout=60s;
server 59.110.68.26:8081 max_fails=2 fail_timeout=60s;
}
server {
location /api/ {
proxy_pass http://lbs;
proxy_redirect default;
proxy_next_upstream error timeout http_500 http_503;
}
}
案例实操
1.暂停⼀个节点后,然后访问接⼝⼤于2次,Nginx会把这个节点剔除
2.重启这个节点,在fail_timeout周期⾥⾯不会再获取流量
1.任何接⼝都是可能出错,4xx、5xx等
2.如果业务没有做好统⼀的错误管理,直接暴露给⽤户,⽆疑是看不懂
3.所以假如后端某个业务出错,nginx层也需要进⾏转换
4.让前端知道Http响应是200,其实是将错误的状态码定向⾄200,返回了全局兜底数据
location /api/ {
proxy_pass http://lbs;
proxy_redirect default;
# 存放⽤户的真实ip
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout http_503 non_idempotent;
#开启错误拦截配置,⼀定要开启
proxy_intercept_errors on;
}
# 不加 =200,则返回的就是原先的http错误码;配上后如果出现500等错误都返回给⽤户200状态,并跳转⾄/default_api
error_page 404 500 502 503 504 =200 /default_api;
location = /default_api {
default_type application/json;
return 200 '{"code":"-1","msg":"invoke fail, not found "}';
}
# 配置完成后重启
cd /usr/local/nginx/sbin
./nginx -s reload
请求一个404地址:http://59.110.68.26/api/demo/1/asdf 故意加了后缀,正常接口地址应该是:http://59.110.68.26/api/demo/1
注:为了方便测试,我把error_page 里面配置了 404,正常情况下http_404状态不被认为是失败状态。
⽹络攻击时有发⽣:
1.TCP洪⽔攻击、注⼊攻击、DOS等
2.⽐较难防的有DDOS等
数据安全,防⽌对⼿爬⾍恶意爬取,封禁IP:
1.⼀般就是封禁ip
2.linux server的层⾯封IP:iptables
3.nginx的层⾯封IP ,⽅式多种 (但 req还是会打进来,让nginx 返回 403, 占⽤资源)
Nginx作为⽹关,可以有效的封禁ip
# 单独⽹站屏蔽IP的⽅法,把include xxx; 放到⽹址对应的在server{}语句块。
# 虚拟主机所有⽹站屏蔽IP的⽅法,把include xxx; 放到http{}语句块。
# nginx配置如下:
http{
# ....
include blacklist.conf;
}
location / {
proxy_pass http://lbs;
proxy_redirect default;
}
#blacklist.conf⽬录下⽂件内容
deny 126.168.1.82;
deny 126.168.1.83;
#重新加载配置,不中断服务
./nginx -s reload
请求地址:http://59.110.68.26/api/demo/1 我本地IP 126.168.1.82
拓展-⾃动化封禁思路:
1.编写shell脚本
2.AWK统计access.log,记录每秒访问超过60次的ip,然后配合nginx或者iptables进⾏封禁
3.crontab定时跑脚本
跨域:浏览器同源策略 1995年,同源政策由 Netscape 公司引⼊浏览器。⽬前,所有浏览器都实⾏这个政策。 最初,它的含义是指,A⽹⻚设置的 Cookie,B⽹⻚不能打开,除⾮这两个⽹⻚"同源"。所谓"同源"指的是"三个相同"
解决⽅法:
1.JSONP
2.Http响应头配置允许跨域
3.nginx层配置
协议相同 http https
域名相同 www.yuming.com
端⼝相同 80 81
协议相同 http https
域名相同 www.xdclass.net
端⼝相同 80 81
⼀句话:浏览器从⼀个域名的⽹⻚去请求另⼀个域名的资源时,域名、端⼝、协议任⼀不同,都是跨域。
浏览器控制台跨域提示:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
Nginx开启跨域配置
location /api/ {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
#如果预检请求则返回成功,不需要转发到后端
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age'1728000;
add_header 'Content-Type''text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 200;
}
正则概述:
^ 以什么开始
$ 以什么结束
^/api/user$
语法 location [ = | ~ | ~* | ^~ ] uri { … }
= 表示精准匹配,只要完全匹配上才能⽣效
不带任何修饰符,表示前缀匹配
匹配任何已 /uri/ 开头的任何查询并且停⽌搜索
通⽤匹配,任何未匹配到其他location的请求都会匹配到
1.区分⼤⼩写匹配(~)
2.不区分⼤⼩写匹配(~*)
注:不要写复杂,容易出问题和遗忘
精准匹配 > 字符串匹配(若有多个匹配项匹配成功,那么选择匹配⻓的并记录) > 正则匹配
server {
server_name www.baidu.com;
location ~^/api/pub$ {
...
}
}
^/api/pub$这个正则表达式表示字符串必须以/开始,以b $结束,中间必须是/api/pub
http://www.baidu.com/api/v1 匹配(完全匹配)
http://www.baidu.com/API/PUB 不匹配,⼤⼩写敏感
http://www.baidu.com/api/pub?key1=value1 匹配
http://www.baidu.com/api/pub/ 不匹配
http://www.baidu.com/api/public 不匹配,不能匹配正则表达式
Nginx的rewrite规则使用正则表达式来匹配URL,并使用指定的替换规则来重写URL。
rewrite regex replacement[flag],这是最基本的rewrite指令格式。它使用正则表达式regex来匹配URL,并使用replacement来替换匹配的部分。flag是可选的,用于指定附加的行为。
rewrite ^/(.*) https://www.baidu.com/$1 permanent
# 这是⼀个正则表达式,匹配完整的域名和后⾯的路径地址
# replacement部分是https://www.baidu.com/$1,$1是取⾃regex部分()⾥的内容
# 重定向url:
rewrite ^/old-url$ /new-url permanent; 这个规则将匹配以/old-url结尾的URL,并将其重定向到/new-url。permanent标志表示这是一个永久重定向。
# 重写URL参数:
rewrite ^/product/(.*)$ /item?id=$1 last; 这个规则将匹配以/product/开头的URL,并将其重写为/item?id=后跟匹配的部分。last标志表示这是最后一个rewrite规则。
# 阻止访问特定文件:
location ~* .(log|txt)$ { rewrite ^(.*)$ /403.html last; } 这个规则将匹配以.log或.txt结尾的URL,并将其重写为/403.html。这样可以阻止直接访问这些文件。
# 重写URL并添加查询参数:
rewrite ^/search/(.*)$ /search.php?q=$1&lang=en last; 这个规则将匹配以/search/开头的URL,并将其重写为/search.php?q=后跟匹配的部分和lang=en查询参数。
这只是一些rewrite规则的示例,您可以根据自己的需求进行更多的定制。请注意,rewrite规则的顺序很重要,因为Nginx将按照配置文件中的顺序逐个匹配规则。
字符 | 描述 |
---|---|
^ | 匹配输⼊字符串的起始位置 |
$ | 匹配输⼊字符串的结束位置 |
* | 匹配前⾯的字符零次或者多次 |
+ | 匹配前⾯字符串⼀次或者多次 |
? | 匹配前⾯字符串的零次或者⼀次 |
. | 匹配除“\n”之外的所有单个字符 |
(pattern) | 匹配括号内的pattern |
标记符号 | 说明 |
---|---|
last | 本条规则匹配完成后继续向下匹配新的 |
break | location URI规则本条规则匹配完成后终⽌,不在匹配任何规 |
redirect | 则返回302临时重定向 |
permanent | 返回301永久重定向 |
1.⾮法访问跳转,防盗链
2.⽹站更换新域名
3.http跳转https
4.不同地址访问同⼀个虚拟主机的资源
当项目中有用到Websocket协议时使用
核⼼是下⾯的配置 其他和普通反向代理没区别, 表示请求服务器升级协议为WebSocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
配置
server {
listen 80;
server_name 59.110.68.26;
location / {
proxy_pass http://lbs;
proxy_read_timeout 300s; //websocket空闲保持时⻓
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
服务器处理完请求后,响应如下报⽂# 状态码为101
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
WebSocket简介:
WebSocket是一种在Web应用程序中实现双向通信的协议。与传统的HTTP请求-响应模型不同,WebSocket允许服务器主动向客户端发送数据,而不需要客户端发起请求。以下是一些使用WebSocket的常见用途和优势:
WebSocket提供了一种更高效、实时和双向的通信方式,适用于需要实时数据传输和即时通信的Web应用程序。它可以改善用户体验、降低延迟、减少网络流量和节省服务器资源。
1、数据库缓存
2、应用程序缓存
3、Nginx网关缓存
/root/cache
本地路径,⽤来设置Nginx缓存资源的存放地址
levels=1:2
默认所有缓存⽂件都放在上⾯指定的根路径中,可能影响缓存的性能,推荐指定为 2 级⽬录来存储缓存⽂件;1和2表示⽤1位和2位16进制来命名⽬录名称。第⼀级⽬录⽤1位16进制命名,如a;第⼆级⽬录⽤2位16进制命名,如3a。所以此例中⼀级⽬录有16个,⼆级⽬录有16*16=256个,总⽬录数为16 *256=4096个。
当levels=1:1:1时,表示是三级⽬录,且每级⽬录数均为16个key_zone 在共享内存中定义⼀块存储区域来存放缓存的 key和 metadata
max_size
最⼤ 缓存空间, 如果不指定会使⽤掉所有磁盘空间。当达到 disk 上限后,会删除最少使⽤的 cache
inactive
某个缓存在inactive指定的时间内如果不访问,将会从缓存中删除
proxy_cache_valid
配置nginx cache中的缓存⽂件的缓存时间,proxy_cache_valid 200 304 2m 对于状态为200和304的缓存⽂件的缓存时间是2分钟
use_temp_path
建议为 off,则 nginx 会将缓存⽂件直接写⼊指定的cache ⽂件中proxy_cache启⽤proxy cache,并指定key_zone,如果proxy_cache off表示关闭掉缓存
add_header Nging-Cache “$upstream_cache_status”
⽤于前端判断是否是缓存,miss、hit、expired(缓存过期)、updating(更新,使⽤旧的应答)
http {
proxy_cache_path /root/cache levels=1:2 keys_zone=server_cache:10m max_size=1g inactive=60m use_temp_path=off;
# proxy_cache_path: 指定缓存路径,这里设置为/root/cache。
# levels=1:2: 指定缓存路径的目录层级结构,这里设置为1个主目录和2个子目录。
# keys_zone=xd_cache:10m: 定义一个名为server_cache的缓存区域,大小为10MB,用于存储缓存键和元数据。
# max_size=1g: 设置缓存区域的最大大小为1GB。
# inactive=60m: 设置缓存条目在60分钟内没有被访问时被认为是不活跃的。
# use_temp_path=off: 禁用临时文件路径,直接将缓存文件存储在指定的路径中。
server {
location /{
...
proxy_cache server_cache;
proxy_cache_valid 200 304 10m;
proxy_cache_valid 404 1m;
proxy_cache_key $host$uri$is_args$args;
add_header Nginx-Cache "$upstream_cache_status";
}
}
# proxy_cache server_cache;: 指定使用名为server_cache的缓存区域进行缓存。
# proxy_cache_valid 200 304 10m;: 设置对于状态码为200和304的响应,缓存有效期为10分钟。
# proxy_cache_valid 404 1m;: 设置对于状态码为404的响应,缓存有效期为1分钟。
# proxy_cache_key $host$uri$is_args$args;: 设置缓存键的生成规则,使用请求的主机、URI和查询参数作为缓存键。
# add_header Nginx-Cache "$upstream_cache_status";: 在响应头中添加一个名为Nginx-Cache的自定义头,值为$upstream_cache_status,表示上游缓存的状态。
}
# 重启Nginx
./nginx -s reload
配置完后,第一次能正常访问。请求地址:http://59.110.68.26/api/demo/1
注:Nginx-Cache 为MISS,说明第一次请求,没有经过缓存
第二次访问时发现请求失败了。请求地址:http://59.110.68.26/api/demo/1
不要慌,查看下Nginx logs目录下的error.log日志,发现Nginx已经开始去读取/root/cache下的缓存文件,但是报错了
发现有错误日志,Nginx尝试打开/root/cache/9/69/a8f478942444b07f80cc94e1ab727699.00000000025
文件时被拒绝了访问,错误代码为13,表示权限被拒绝。
这个错误是由于Nginx进程以root用户身份运行,并且缓存路径/root/cache
的权限设置不允许Nginx进程读取该文件。这是一个安全措施,防止非授权用户访问敏感文件。
需要再nginx.conf文件头部添加配置:
user root;
# 使用user root;将Nginx进程的所有权和权限设置为root用户,这意味着Nginx将以root用户的身份运行。
# 重启Nginx
./nginx -s reload
重启后再次访问:http://59.110.68.26/api/demo/1
发现Nginx-Cache 为HIT 表示缓存命中!这个接口的返回结果是从缓存中取的
这表示Nginx成功从缓存中获取了响应,而不是向上游服务器发出请求。
当Nginx接收到客户端的请求时,它首先检查缓存中是否存在与该请求匹配的缓存条目。如果存在匹配的缓存条目且仍然有效(根据缓存的有效期),Nginx将直接从缓存中返回响应,而不是将请求转发给上游服务器。这就是所谓的"HIT",表示缓存命中。
缓存命中可以显著提高响应速度和减轻上游服务器的负载,因为Nginx无需再次请求上游服务器,而是直接返回缓存的响应。
在你的情况下,Nginx成功从缓存中获取了响应,这是一个良好的结果,说明缓存配置和使用是有效的。这有助于提高性能并减少对上游服务器的依赖。
缓存文件:
evels=1:2
是Nginx配置中proxy_cache_path
指令的一部分。它用于定义缓存路径的目录层级结构。
具体来说,levels=1:2
表示缓存路径将包含1个主目录和2个子目录。这种层级结构有助于在大量缓存文件时更好地组织和管理文件。
例如,假设你的缓存路径为/root/cache
,并且你有一个缓存文件的键为a8f478942444b07f80cc94e1ab727699
。使用levels=1:2
配置后,该缓存文件将被存储在以下路径中:
/root/cache/9/69/a8f478942444b07f80cc94e1ab727699.0000000009
其中,9
是第一个子目录,69
是第二个子目录,a8f478942444b07f80cc94e1ab727699.0000000009
是缓存文件。
这种层级结构有助于提高文件系统的性能,因为它可以更好地分散缓存文件在不同目录中的存储,避免在单个目录中存储大量文件导致性能下降。
请注意,levels=1:2
只是一个示例配置,你可以根据需要调整层级的数量。较大的层级数可能会更好地分散缓存文件,但也会增加目录的数量。因此,根据你的具体需求和文件数量,可以选择适当的层级配置。
存取文件数量:
在Nginx中,每个子目录可以存储最多256个文件。因此,对于levels=1:2
的配置,可以计算出可以存储的最大文件数量如下:
第一个子目录:256个文件 第二个子目录:256个文件 总计:256 * 256 = 65,536个文件
因此,使用levels=1:2
配置,可以存储最多65,536个文件。
请注意,这只是一个理论上的最大数量。实际上,文件系统的限制、硬件性能和可用的磁盘空间等因素都会对实际存储的文件数量产生影响。此外,还要考虑缓存文件的大小和缓存区域的最大大小设置。
如果你需要存储更多的文件,可以考虑增加层级的数量或使用更大的文件系统来扩展存储容量。根据你的具体需求,可以调整层级配置以满足存储需求。
缓存命中率统计
1.前端打点⽇志上报
2.nginx⽇志模板增加信息 $upstream_cache_status
对⽂本、js和css⽂件等进⾏压缩,⼀般是压缩后的⼤⼩是原始⼤⼩的25%
#开启gzip,减少我们发送的数据量
gzip on;
gzip_min_length 1k;
#4个单位为16k的内存作为压缩结果流缓存
gzip_buffers 4 16k;
#gzip压缩⽐,可在1~9中设置,1压缩⽐最⼩,速度最快,9压缩⽐最⼤,速度最慢,消耗CPU
gzip_comp_level 4;
#压缩的类型
gzip_types application/javascript text/plain text/css application/json application/xml text/javascript;
#给代理服务器⽤的,有的浏览器⽀持压缩,有的不⽀持,所以避免浪费不⽀持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
gzip_vary on;
#禁⽤IE6以下的gzip压缩,IE某些版本对gzip的压缩⽀持很不好
gzip_disable "MSIE [1-6].";
压缩前后区别(上传js⽂件进⾏验证)
location /static {
alias /usr/local/uploads/;
}
随便在网上扒拉一个300KB的js文件
配置后请求:http://59.110.68.26/uploads/index_fb6bebb.js
这样Nginx压缩配置就完成了! 注:浏览器也有页面缓存,测试时要用无痕模式。
1.web层主要涉及浏览器和服务器的⽹络交互,⽽⽹络交互显然是耗费时间的
2.要尽量减少交互次数降低每次请求或响应数据量。
开启压缩:
1.在服务端是时间换空间的策略,服务端需要牺牲时间进⾏压缩以减⼩响应数据⼤⼩。
2.压缩后的内容可以获得更快的⽹络传输速度,时间是得到了优化。
3.所以是双向的。