热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

高性能反向代理器Nginx

1、简介相信大家在平时的CURD工作中也会接触到Nginx,可以说是万年的Nginx+T

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, 增加

                                  ·修改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;
                                              }
                                                  }
                                              }









                                              推荐阅读
                                              • 第四讲ApacheLAMP服务器基本配置Apache的编译安装从Apache的官方网站下载源码包:http:httpd.apache.orgdownload.cgi今 ... [详细]
                                              • Nginx使用AWStats日志分析的步骤及注意事项
                                                本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
                                              • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
                                              • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
                                              • 一句话解决高并发的核心原则
                                                本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
                                              • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
                                                本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
                                              • tcpdump 4.5.1 crash 深入分析
                                                tcpdump 4.5.1 crash 深入分析 ... [详细]
                                              • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
                                                nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
                                              • nginx+多个tomcat
                                                学习nginx的时候遇到的问题:nginx怎么部署两台tomcat?upstream在网上找的资源,我在nginx配置文件(nginx.conf)中添加了两个server。结果只显 ... [详细]
                                              • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
                                              • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
                                              • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
                                              • svnWebUI:一款现代化的svn服务端管理软件
                                                svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
                                              • 深入解析Linux下的I/O多路转接epoll技术
                                                本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
                                              • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
                                              author-avatar
                                              bj韩式尕伙
                                              这个家伙很懒,什么也没留下!
                                              PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
                                              Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有