前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高性能反向代理器Nginx

高性能反向代理器Nginx

作者头像
Liusy
修改2020-09-01 17:27:59
5190
修改2020-09-01 17:27:59
举报
文章被收录于专栏:Liusy01Liusy01

1、简介

相信大家在平时的CURD工作中也会接触到Nginx,可以说是万年的Nginx+Tomcat搭配。

代理服务器来接受客户端的网络访问连接请求,然后服务器将请求有策略的转发给网络中实际工作的业务服务器,并将从业务服务器处理的结果,返回给网络上发起连接请求的客户端。

2、Nginx安装

1、解压安装包

代码语言:javascript
复制
tar -xvzf nginx-1.18.0.tar.gz

2、进入解压目录,进行安装目录的配置

代码语言:javascript
复制
./configure --prefix=/usr/soft/nginx

安装过程中可能会出现缺少pcre、openssl等依赖的问题,此时需要用到yum去安装这些依赖,安装完依赖之后再次配置安装目录

代码语言:javascript
复制
yum install -y gcc pcre pcre-devel openssl openssl-devel gd gd-deve

3、编译安装

代码语言:javascript
复制
make && make install

4、启动Nginx

进入第二步配置的安装目录,-c 表示指定配置文件,也可以不带,默认使用conf下的文件

代码语言:javascript
复制
./sbin/nginx -c /usr/soft/nginx/conf/nginx.conf

启动之后就可以在浏览器上直接输入服务器ip访问。

5、关闭、重载配置

可用kill命令

代码语言:javascript
复制
kill -QUIT  进程号
kil -TERM  进程号

也可用nginx的脚本

代码语言:javascript
复制
./sbin/nginx -s stop
./sbin/nginx -s quit

重新加载配置文件:

代码语言:javascript
复制
./sbin/nginx -s reload

3、Nginx配置

主要包括三部分:Main、Event、Http

代码语言:javascript
复制
#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

代码语言:javascript
复制
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;
        }
    }

}

出来的日志格式是这样的:

代码语言:javascript
复制
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的日志格式

编写完配置之后,可用如下命令检测配置是否正确:

代码语言:javascript
复制
./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配置

格式:

代码语言:javascript
复制
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;

停止处理并返回指定状态码给客户端。

代码语言:javascript
复制
if ($request_uri ~ *\.sh ){
   return 403;
}

set指令

代码语言:javascript
复制
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路径下。

代码语言:javascript
复制
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的缓存期限

代码语言:javascript
复制
location / {
  root html;
  index index.html index.hml;
}
location ~ \.(jpg)$ {
  root html/images;
  expires 10s;
}

效果:

初次加载:

过期时间内再次加载:

(5)Gzip压缩策略

浏览器请求 -> 告诉服务端当前浏览器可以支持压缩类型->服务端会把内容根据浏览器所支持的压缩策略去进行压缩返回->浏览器拿到数据以后解码; 

常见的压缩方式:gzip、deflate 、sdch

配置项

代码语言:javascript
复制
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压缩标识

例如:

代码语言:javascript
复制
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

以下就是通过反向代理将请求转发到百度

代码语言:javascript
复制
location / {
      proxy_pass http://www.baidu.com;
      #proxy_set_header $Accept-Encoding gzip;
}

也可以转发至私有服务接口中,其中proxy_set_header是设置请求头,可根据业务需要设置请求头。

(7)负载均衡

upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。

Upstream常用参数介绍

代码语言:javascript
复制
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的负载均衡算法进行请求分配

代码语言:javascript
复制
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;
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Liusy01 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Upstream常用参数介绍
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档