高性能反向代理器Nginx
1、简介
相信大家在平时的CURD工作中也会接触到Nginx,可以说是万年的Nginx+Tomcat搭配。
代理服务器来接受客户端的网络访问连接请求,然后服务器将请求有策略的转发给网络中实际工作的业务服务器,并将从业务服务器处理的结果,返回给网络上发起连接请求的客户端。
2、Nginx安装
1、解压安装包
tar -xvzf nginx-1.18.0.tar.gz
2、进入解压目录,进行安装目录的配置
./configure --prefix=/usr/soft/nginx
安装过程中可能会出现缺少pcre、openssl等依赖的问题,此时需要用到yum去安装这些依赖,安装完依赖之后再次配置安装目录
yum install -y gcc pcre pcre-devel openssl openssl-devel gd gd-deve
3、编译安装
make && make install
4、启动Nginx
进入第二步配置的安装目录,-c 表示指定配置文件,也可以不带,默认使用conf下的文件
./sbin/nginx -c /usr/soft/nginx/conf/nginx.conf
启动之后就可以在浏览器上直接输入服务器ip访问。
5、关闭、重载配置
可用kill命令
kill -QUIT 进程号
kil -TERM 进程号
也可用nginx的脚本
./sbin/nginx -s stop
./sbin/nginx -s quit
重新加载配置文件:
./sbin/nginx -s reload
3、Nginx配置
主要包括三部分:Main、Event、Http
#Main
worker_processes 1; #需开启的进程数,也就是Nginx处理请求的进程
#Event,设定工作模式以及连接数上限
events {
use epoll; #Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。跟netty的是一样的
worker_connections 1024; #每个进程的最大连接数
}
#Http
http {
include mime.types;#主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度
default_type application/octet-stream;#如果没有include的类型,则采用默认类型
server {
listen 80; #监听端口
server_name localhost; #主机名
location / { #匹配url
root html; #转至html目录
index index.html index.htm; #目录下的文件
}
error_page 500 502 503 504 /50x.html; #定制错误码返回页面
location = /50x.html {
root html;
}
}
}
http模块可以配置多个server。
(1)日志配置
日志配置有两个参数,分别是log_format和access_log。
log_format:用来配置日志格式
access_log:开启日志以及日志文件
例如:定义一个名为main的日志格式,然后开启日志,日志文件是logs/access.log
worker_processes 1;
events {
use epoll;
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 80;
server_name localhost;
access_log logs/access_80.log main;
location / {
root html;
index lsy.html;
}
}
}
出来的日志格式是这样的:
192.168.197.1 - - [01/Aug/2020:00:29:41 -0700] "GET / HTTP/1.1" 200 17 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36" "-"
注:access_log也可配置在server外面,这样就是配置了所有server的日志格式
编写完配置之后,可用如下命令检测配置是否正确:
./sbin/nginx -c /usr/soft/nginx/conf/nginx.conf -t
下面是一些nginx自带的变量:
$args #这个变量等于请求行中的参数。 $content_length #请求头中的Content-length字段。 $content_type #请求头中的Content-Type字段。 $document_root #当前请求在root指令中指定的值。 $host #请求主机头字段,否则为服务器名称。 $http_user_agent #客户端agent信息。 $http_cookie #客户端cookie信。 $limit_rate #这个变量可以限制连接速率。 $request_body_file #客户端请求主体信息的临时文件名。 $request_method #客户端请求的动作,通常为GET或POST。 $remote_addr #客户端的IP地址。 $remote_port #客户端的端口。 $remote_user #已经经过Auth Basic Module验证的用户名。 $request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。 $query_string #与$args相同。 $scheme #HTTP方法(如http,https)。 $server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 $server_addr #服务器地址,在完成一次系统调用后可以确定这个值。 $server_name #服务器名称。 $server_port #请求到达服务器的端口号。 $request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。 $uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。 $document_uri #与$uri相同。 |
---|
(2)location配置
格式:
location [~|=|^~|~*] /uri {}
=:精准匹配,优先级最高
~:开头表示区分大小写的正则匹配
^~:开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格) 。以xx开头
~*:开头表示不区分大小写的正则匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
(3)rewrite使用
Rewrite通过ngx_http_rewrite_module模块支持url重写、支持if判断,但不支持else
Rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向
Rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用
常用指令
If 空格 (条件) {设定条件进行重写}条件的语法:
1.“=” 来判断相等,用于字符比较
2.“~” 用正则来匹配(表示区分大小写),“~*” 不区分大小写
3.“-f -d -e” 来判断是否为文件、目录、是否存在
return指令
语法:return code;
停止处理并返回指定状态码给客户端。
if ($request_uri ~ *.sh ){
return 403;
}
set指令
set variable value;
定义一个变量并复制,值可以是文本、变量或者文本变量混合体
rewrite指令
语法:rewrite regex replacement [flag]{last / break/ redirect 返回临时302/ permant 返回永久302}
last: 停止处理后续的rewrite指令集、 然后对当前重写的uri在rewrite指令集上重新查找
break; 停止处理后续的rewrite指令集 ,并不会重新查找
例如:将符合/images/([a-z]{3})/(.*).(png|jpg)正则的重写到/lsy路径下,其中$2是(.*),$3是.(png|jpg),try_files尝试在硬盘中寻找这个文件,如果有,则直接返回,如果没有,就转到/image404.html路径下。
location / {
rewrite '^/images/([a-z]{3})/(.*).(png|jpg)$' /lsy?file=$2.$3;
set $image_file $2;
set $image_type $3;
}
location /lsy {
root html/images;
try_files /$arg_file /image404.html;
}
location /image404.html {
return 404 "image not found exception";
}
此时需要在html目录下建立images目录,我这边放进一张a.jpg图片
访问一张不存在的图片:
(4)浏览器本地缓存配置及动静分离
语法:expires 60s|m|h|d
操作步骤
· 在html目录下创建一个images文件,在该文件中放一张图片
· 修改index.html, 增加<img src=”图片”/>
·修改nginx.conf配置。配置两个location实现动静分离,并且在静态文件中增加expires的缓存期限
location / {
root html;
index index.html index.hml;
}
location ~ .(jpg)$ {
root html/images;
expires 10s;
}
效果:
初次加载:
过期时间内再次加载:
(5)Gzip压缩策略
浏览器请求 -> 告诉服务端当前浏览器可以支持压缩类型->服务端会把内容根据浏览器所支持的压缩策略去进行压缩返回->浏览器拿到数据以后解码;
常见的压缩方式:gzip、deflate 、sdch
配置项
Gzip on|off 是否开启gzip压缩
Gzip_buffers 4 16k #设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。
Gzip_comp_level[1-9] 压缩级别, 级别越高,压缩越小,但是会占用CPU资源
Gzip_disable #正则匹配UA 表示什么样的浏览器不进行gzip
Gzip_min_length #开始压缩的最小长度(小于多少就不做压缩)
Gzip_http_version 1.0|1.1 表示开始压缩的http协议版本
Gzip_proxied (nginx 做前端代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用压缩)
Gzip_type text/pliain,application/xml 对那些类型的文件做压缩 (conf/mime.conf)
Gzip_vary on|off 是否传输gzip压缩标识
例如:
gzip on;
gzip_buffers 4 16k;
gzip_comp_level 7;
gzip_min_length 500;
gzip_types text/css application/javascript text/xml;
注意:
1. 图片、mp3这样的二进制文件,没必要做压缩处理,因为这类文件压缩比很小,压缩过程会耗费CPU资源
2. 太小的文件没必要压缩,因为压缩以后会增加一些头信息,反而导致文件变大
3. Nginx默认只对text/html进行压缩 ,如果要对html之外的内容进行压缩传输,我们需要手动来配置
(6)反向代理
proxy_pass
以下就是通过反向代理将请求转发到百度
location / {
proxy_pass http://www.baidu.com;
#proxy_set_header $Accept-Encoding gzip;
}
也可以转发至私有服务接口中,其中proxy_set_header是设置请求头,可根据业务需要设置请求头。
(7)负载均衡
upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。
Upstream常用参数介绍
server address [parameters]
其中关键字server必选。address也必选,可以是主机名、域名、ip或unix socket,也可以指定端口号。parameters是可选参数,可以是如下参数:
down |
表示当前server已停用 |
---|---|
backup |
表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求 |
weight |
表示当前server负载权重,权重越大被请求几率越大。默认是1 |
max_fails |
在fail_timeout时间内失败多少次,认为主机已挂掉则,踢出,默认是1 |
fail_timeout |
超时时间,默认是10s |
max_conns |
允许最大连接数 |
slow_start |
当节点恢复,不立即加入 |
负载均衡算法:
ip_hash |
对ip进行hash计算 |
---|---|
url_hash |
对url进行hash计算 |
least_conn |
最少连接 |
least_time |
最小的响应时间,计算节点平均响应时间,然后取最快的,分配最高权重 |
例如:以ip_hash的负载均衡算法进行请求分配
http {
upstream myserver{
ip_hash;
server 192.168.197.100:80;
server 192.168.197.110:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://myserver;
}
}
}
- hyperledger v1.0.5 区块链运维入门
- 在TensorBoard中使用t-SNE实现TensorFlow自动编码器的可视化嵌入
- 以太坊智能合约开发入门
- CatBoost:一个自动处理分类(CAT)数据的机器学习库
- Python机器学习的练习八:异常检测和推荐系统
- Blade 模板中有关 section 的那些事
- 分布式计划任务设计与实现
- 怎样在Python的深度学习库Keras中使用度量
- 网络设备配置管理与版本控制
- 使用Python对Instagram进行数据分析
- 解决多标签分类问题(包括案例研究)
- Docker Compose + GPU + TensorFlow = Heart
- Tensorflow生成模型收集: GANs与VAEs
- How to Install Nginx and PHP-FPM on FreeBSD 10
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AkShare-债券数据-收盘收益率曲线
- Vue 项目报错:‘$‘ is not defined ( no-undef )
- SpringBoot 项目开启热部署
- 小程序文件下载并保存文件名打开
- 分享个 CTF 小工具 bruteHASH
- centos配置mutt和msmtp实现邮件发送
- CentOS8 安装 jdk8 / java8的教程(推荐)
- Ubuntu18.04 一键升级Python所有第三方包 及安装python包的方法
- 详解centos7上elastic search安装及填坑记
- Linux利用Sysctl命令调整内核参数
- 在ubuntu16.04上创建matlab的快捷方式(实现方法)
- CentOS 7.6 Telnet服务搭建过程(Openssh升级之战 第一任务备用运输线搭建)
- Ubuntu18.04下安装MySQL(图文教程)
- 基于 ffmpeg+Webassembly 实现视频帧提取
- Ubuntu14.04 opencv2.4.8和opencv3.3.1多版本共存的实现方法