• Nginx入门-安装/反向代理/负载均衡/防盗链/URLRewrite/动静分离/高可用


    目录

    一、简介

    二、安装

    三、基本原理

    四、基本配置-nginx.conf

    五、反向代理与负载均衡

    六、动静分离

    七、URLRewrite

    八、防盗链

     九、高可用配置


    一、简介

            Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,同时也提供了 IMAP/POP3/SMTP服务。因它的稳定性、丰富的功能集、简单的配置文件低系统资源消耗而闻名。

    二、安装

            安装环境:CentOS7.4

            1.官网下载安装压缩包,如:nginx-1.22.0.tar.gz

            2.解压

    tar -zxvf nginx-1.22.0.tar.gz

            3.进入解压后的目录,执行下列命令,会显示缺少哪些组件

    ./configure 

            4.一般来说会缺少下面的组件,依次安装即可

    1. yum install -y gcc
    2. yum install -y pcre pcre-devel
    3. yum install -y zlib zlib-devel

            5.安装完毕后再次执行第3步,不再报错,然后分别执行下面命令

    1. make
    2. make install

            6.nginx会安装在下面目录

    /usr/local/nginx/

            7.防火墙设置

    1. systemctl stop firewalld.service #关闭
    2. systemctl disable firewalld.service #禁止开机启动

            8.创建系统服务

    1. vi /usr/lib/systemd/system/nginx.service #键入此命令,粘贴下面内容进去
    2. [Unit]
    3. Description=nginx - web server
    4. After=network.target remote-fs.target nss-lookup.target
    5. [Service]
    6. Type=forking
    7. PIDFile=/usr/local/nginx/logs/nginx.pid
    8. ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
    9. ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    10. ExecReload=/usr/local/nginx/sbin/nginx -s reload
    11. ExecStop=/usr/local/nginx/sbin/nginx -s stop
    12. ExecQuit=/usr/local/nginx/sbin/nginx -s quit
    13. PrivateTmp=true
    14. [Install]
    15. WantedBy=multi-user.target
    systemctl daemon-reload   # 重新加载系统服务
    

            9.有关nginx的指令

    1. ./nginx #启动
    2. ./nginx -s stop #快速停止
    3. ./nginx -s quit #优雅关闭,在退出前完成已经接受的连接请求
    4. ./nginx -s reload #重新加载配置
    5. systemctl start nginx.service #启动服务
    6. systemctl enable nginx.service #开机启动
    7. systemctl status nginx #查看状态
    8. systemctl reload nginx #重新加载配置

    三、基本原理

     

            Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程。其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端请求。 

    四、基本配置-nginx.conf

            进入Nginx的主目录我们可以看到若干文件夹,其中几个比较重要:

            conf 用来存放配置文件相关

            html 用来存放静态文件的默认目录 html、css等

            sbin nginx的主程序

            我们一般就是配置conf/nginx.conf 的内容,其最小配置如下:

    1.worker_processes       默认为1,表示开启一个业务进程

    2.worker_connections        单个业务进程可接受连接数 include

    3.mime.types        引入http mime类型 default_type application/octet-stream

    4.default_type        如果mime类型没匹配上,默认使用二进制流的方式传输。

    5.sendfile         使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。

    (若不开启,则请求响应都经过nginx;若开启,则响应时直接返回给客户端不经过nginx)

    6.server        每个server都是一个虚拟主机vhost。虚拟主机技术可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响

            关于server-name的匹配规则:

                    分先后顺序,写在前面的匹配上就不会继续往下匹配了;

            1.完整匹配-可以在同一servername中匹配多个域名

    server_name vod.wz.com wwwa.wz.com;

             2.通配符匹配

    server_name *.wz.com
    

             3.通配符结束匹配

    server_name vod.*;
    

            4.正则匹配

    server_name ~^[0-9]+\.mmban\.com$;
    
    1. worker_processes 1;
    2. events {
    3. worker_connections 1024;
    4. }
    5. http {
    6. include mime.types;
    7. default_type application/octet-stream;
    8. sendfile on;
    9. keepalive_timeout 65;
    10. server {
    11. listen 80; #监听端口号
    12. server_name localhost; #主机名
    13. location / { #匹配路径
    14. root html; #文件根目录
    15. index index.html index.htm; #默认页名称
    16. }
    17. error_page 500 502 503 504 /50x.html; #报错编码对应页面
    18. location = /50x.html {
    19. root html; #报错编码对应页面的位置
    20. }
    21. }
    22. }

    五、反向代理与负载均衡

            1.什么是正向代理

            如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

            我觉得我们程序员搭梯子应该都算是正向代理的吧...(打游戏的加速器应该也算)

            2.什么是反向代理

            我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。当然这些我们用户都是无感知的,对于我们而言看起来都一样。

             正向代理与反向代理的区别通俗点说就是:

                    正向代理中代理服务器在客户端这边;反向代理中代理服务器在服务端

             3.如何配置

                    在 server->location/->proxy_pass 属性配置

            例如:

    1. location / {
    2. proxy_pass http://www.atguigu.com;
    3. root html;
    4. index index.html index.htm;
    5. }

            这时在浏览器输入本机ip,进入了 www.atguigu.com,而地址栏仍显示为本机ip

             4.如何配置负载均衡

                    首先为 proxy_pass 设置别名,然后在http{ }下增加一个属性upstream,配置目标地址,以及负载均衡策略:

    1. ... ...
    2. http{
    3. ... ...
    4. upstream myIPs{
    5. server 192.168.44.102:80;
    6. server 192.168.43.103:80;
    7. server 192.168.43.104:80;
    8. }
    9. server{
    10. location / {
    11. proxy_pass http://myIPs;
    12. ... ...
    13. }
    14. ... ...
    15. }
    16. }
    17. ... ...

            5.负载均衡策略

            5.1轮询        

                     默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求

            5.2 weight(权重)         

                    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

    1. upstream httpd {
    2. server 127.0.0.1:8050 weight=10 down;
    3. server 127.0.0.1:8060 weight=1;
    4. server 127.0.0.1:8060 weight=1 backup;
    5. }

                    down:表示当前的server暂时不参与负载

                    weight:默认为1.weight越大,负载的权重就越大。

                    backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。

            5.6 ip_hash 根据客户端的ip地址转发同一台服务器,可以保持回话。

            5.7 least_conn 最少连接访问

            5.8 url_hash 根据用户访问的url定向转发请求

            5.9 fair 根据后端服务器响应时间转发请求

    六、动静分离

            Nginx动静分离,简单来说,就是动态请求静态请求分开,也可以理解成使用Nginx处理静态页面Tomcat 处理动态页面。比如 js、css 文件、图片资源就可以算作静态资源,我们可以直接交给Nginx管理。动静分离从目前实现角度来讲大致分为两种。

            动静分离说白了,就是将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码速度降低后台应用服务器请求。后台应用服务器只负责动态数据请求

            优势:分担负载,减轻web服务器的压力,适用于大负载。静态资源放置cdn,同时还可以通过配置缓存到客户浏览器中,这样极大减轻web服务器的压力。

            劣势:网络环境不佳时,ajax回应很慢,导致页面出现空白,出错处理会不好看。不利于网站SEO(搜索引擎优化),增加了开发复杂度。

            如何使用?

                    增加location属性:把cssjsimages文件夹都放在nginxindex文件夹内。下面几个location优先级高于第一个

    1. location / {
    2. proxy_pass http://192.168.80.128:80;
    3. root html;
    4. index index.html index.htm;
    5. }
    6. location /css {
    7. root html;
    8. index index.html index.htm;
    9. }
    10. location /images {
    11. root html;
    12. index index.html index.htm;
    13. }
    14. location /js {
    15. root html;
    16. index index.html index.htm;
    17. }

            采用正则表达式进行匹配

    /         通用匹配,任何请求都会匹配到。

    =        精准匹配,不是以指定模式开头

    ~        正则匹配,区分大小写

    ~*      正则匹配,不区分大小写

    ^~      非正则匹配,匹配以指定模式开头的location

            location匹配顺序 :

    • 多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配
    • 普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
    • 当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
    • 所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)

            我们可以把上面几个location合为一个:

    1. location ~*/(css|img|js) {
    2. root index;
    3. index index.html index.htm;
    4. }

            aliasroot

                    root用来设置根目录(有点像相对路径),而alias在接受请求的时候在路径上不会加上location有点像绝对路径

    1. location /css {
    2. alias /usr/local/nginx/index/css;
    3. index index.html index.htm;
    4. }

    七、URLRewrite

            URL重写是指将一个URL请求重新写成网站可以处理的另一个URL的过程。这样说可能不是很好理解,举个例子来说明一下,在开发中可能经常遇到这样的需求,比如通过浏览器请求的http://localhost:8080/getUser?id=1,但是需要通过SEO优化等等原因,需要把请求的地址重写为http://localhost:8080/getUser/1这样的URL,从而符合需求或者更好的被网站阅读。

            rewritelocation的功能有点相像,都能实现跳转,主要区别在于rewrite常用于同一域名内更改获取资源的路径,而location是对一类路径控制访问反向代理,可以proxy_pass到其他服务器。rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容, 重定向replacement,结尾是flag标记。

            1.关键字:其中关键字error_log不能改变

            2.正则:perl兼容正则表达式语句进行规则匹配

            3.替代内容:将正则匹配的内容替换成replacement

            f4.lag标记:rewrite支持的flag标记

            rewrite参数的标签段位置server、location、 if

            flag标记说明:

                    last #本条规则匹配完成后,继续向下匹配新的location URI规则

                    break #本条规则匹配完成即终止,不再匹配后面的任何规则

                    redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址

                    permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

             set关键字:

            所有的 Nginx变量在 Nginx 配置文件中引用时都须带上 $ 前缀

            在 Nginx 配置中,变量只能存放一种类型的值,有且也只存在一种类型,那就是字符串类型。使用Set可以自定义参数

    1. set $variable value;
    2. set $变量名 变量值

            举例:

    1. ... ...
    2. 访问主机ip本来应该进入http://www.wz.com 重写为 http://www.wz.com/wz666
    3. location / {
    4. set $name wz666;
    5. rewrite ^(.*)$ http://www.wz.com/$name;
    6. proxy_pass http://www.wz.com;
    7. }
    8. ... ...

    八、防盗链

            防盗链简单来说就是存在我们服务中的一些资源,只有我们规定的合法的一类人才能去访问,其他人不能访问。

            HTTP RefererHeader的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,例如防止未经允许的网站盗链图片、文件等。因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况。

            在location中添加,格式:

    valid_referers none | blocked | server_names | strings ....;

            none, 检测 Referer 头域不存在的情况。

            blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 “http://” 或 “https://” 开头。

            server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。

            例如:

    1. valid_referers 192.168.80.128;
    2. if ($invalid_referer) {
    3. return 403;
    4. }
    5. #如果请求不是来自这个地址,就返回403错误

     九、高可用配置

            高可用,就是设置多台服务器备用,一旦主服务器出故障了,能立即切换到备用服务器

            我们用Keepalived插件可以实现此功能!

            配置过程:

            1.安装

    yum install keepalived
    

            2.修改配置文件

    1. cd /etc/keepalived/
    2. vim keepalived.conf
    1. #机器1
    2. ! Configuration File for keepalived
    3. global_defs {
    4. router_id r1 #自行设置,可不同
    5. }
    6. vrrp_instance vi_name{ #自行设置,要相同
    7. state MASTER #身份
    8. interface ens33
    9. virtual_router_id 51
    10. priority 100
    11. advert_int 1
    12. authentication {
    13. auth_type PASS
    14. auth_pass 1111
    15. }
    16. virtual_ipaddress {
    17. 192.168.44.200 #虚拟IP
    18. }
    19. }
    20. #机器2
    21. ! Configuration File for keepalived
    22. global_defs {
    23. router_id r2 #自行设置,可不同
    24. }
    25. vrrp_instance vi_name{ #自行设置,要相同
    26. state BACKUP #身份
    27. interface ens33
    28. virtual_router_id 51
    29. priority 50
    30. advert_int 1
    31. authentication {
    32. auth_type PASS
    33. auth_pass 1111
    34. }
    35. virtual_ipaddress {
    36. 192.168.44.200 #虚拟IP
    37. }
    38. }

            3.启动服务

    systemctl start keepalived
    

  • 相关阅读:
    中文乱码问题解决
    Excel 数据透视表小技巧之 03 将3行转位3列,行列转换基于多重合并计算区域 (教程含数据和解决方案)
    网络安全(黑客)—小白自学
    郑州灵活用工平台的市场价值大吗?
    【译】代码更快、更好,借助 GitHub Copilot 的新功能:斜杠命令和上下文变量
    SQLi-Labs系列之GET型盲注
    [02] BLEMotion-Kit 基于QMI8658传感器使用加速度计进行倾斜检测
    全志R128驱动OLED屏幕步骤教程
    利用Excel制作库房管理系统
    人类或小鼠染色体长度文件获取 hg19 mm10.chrom.sizes
  • 原文地址:https://blog.csdn.net/weixin_62427168/article/details/126620865