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到后端服务器的负载均衡。
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;
}
}
}