全面解析|搞懂Nginx这一篇就够了

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
日志服务 SLS,月写入数据量 50GB 1个月
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: Nginx是一个http服务器,是一个使用c语言开发的高性能的http服务器及反向代理服务器。Nginx是一款高性能的http服务器/反向代理服务器及电子邮件(IMAP/POP3)代...

 image.gif

image.gif

前言

Nginx是一个http服务器,是一个使用c语言开发的高性能的http服务器及反向代理服务器。Nginx是一款高性能的http服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试Nginx能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。本文将为大家详细介绍关于Nginx的原理以及在应用场景下的相关解析。

1. Nginx的概念?

「什么是Nginx呢:」

    • Nginx是一个基于HTTP的反向代理服务器,也是一个基IMAP/POP3/SMTP服务邮件服务器
    • 反向代理服务器:现在我们A需要访问的目标B服务器的10.7.182.100,我要访问这个B服务器上的资源,现在如果使用了Nginx之后,我可以通过Nginx服务器从而达到访问10.7.182.100这个服务器的目的

    image.gif

      • IMAP/POP/SMTP:这三个是邮件的传输协议
      • 邮件服务器:发送邮件    接收邮件
      • Web服务器:本身是一个Web服务器的软件,类似于Tomcat这种Web服务的软件

      「Nginx能干什么呢:」

        • 可以作为Web服务器
        • 可以作为邮件服务器
        • 可以作为反向代理的服务器
        • 动静分离(就是将动态资源和静态资源分隔开)
        • 可以实现负载均衡

        2、Nginx的安装

        「Nginx安装步骤:」

        第一步:下载我们的nginx 这里以1.6.2版本为例
        第二步:共享安装文件到我们的linux上面
        第三步:将文件拷贝到/usr/local下面
        第四步:安装 tar -zxvf xxxx.tar.gz
        第五步:下载所需要的依赖库 yum install pcre  yum install pcre-devel  yum install zlib   yum install zlib-devel
        第六步:进行config的配置
        cd nginx-1.6.2 && ./configure --prefix=/usr/local/nginx
        第七步:安装
        make && make install 
        第八步:启动nginx
        /usr/local/nginx/sbin/nginx
        关闭: .... -s stop -s reload 
        查看端口是否有问题
        netstat -tunpl |grep 80
        浏览器进行验证没问题就可以

        image.gif

        3、Nginx的配置文件的解析

        「配置文件:」

        #user  nobody;
        #工作的线程(4核8线程那么下面就设置成8 物理硬件有关)
        worker_processes  1;
        #全局的错误日志存放的地方
        #error_log  logs/error.log;
        #全局错误日志存放的地方 后面的notice表示的是输出错误日志的格式
        #error_log  logs/error.log  notice;
        #error_log  logs/error.log  info;
        #nginx进程号存放的地方
        #pid        logs/nginx.pid;
        #最大的连接数(这个也跟硬件是有关系的)
        events {
            worker_connections  1024;
        }
        #下面就是跟HTTP请求有关系的了
        http {
            #表示的是当前服务器支持的类型
            include       mime.types;
            #默认传输的数据类型是流 
            default_type  application/octet-stream;
            #声明了一种日志格式 这种日志格式的名字叫做  main
            log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                              '$status $body_bytes_sent "$http_referer" '
                              '"$http_user_agent" "$http_x_forwarded_for"';
            #表示的是每一次请求的日志记录 格式就是上面的main格式
            access_log  logs/access.log  main;
            #是否可以发送文件
            sendfile        on;
            #tcp_nopush     on;
            #这个是双活的超时的时间
            #keepalive_timeout  0;
            keepalive_timeout  65;
            #是否打开文件的压缩
            #gzip  on;
            #虚拟一个主机
           #负载均衡的配置
           upstream qianyu {
              ip_hash;
              server 10.7.182.110:8080;
              server 10.7.182.87:8080;
           }
            #server {
              # listen     90;
              # server_name localhost; 
              # location / {
              #    root qianyu;
              #    index qianyu.html;
              # }
              #做一个反向代理
              #表示的是 如果你访问的后缀是 .jpg结尾的话那么 就访问下面的另外的服务器
               # location ~ \.jpg$ {
               #     proxy_pass   http://10.7.182.110:8080;
               # }
              #下面要演示一个负载均衡的例子
               #location ~ \.jpg$ {
               #    proxy_pass   http://qianyu;
               #}
            #}
           #虚拟一个动静分离的机器
           server {
             listen     9999;
             server_name localhost;
             #表示的是动态资源访问的机器
              location / {
                    proxy_pass   http://10.7.182.54:8080;
              }
            #表示的是非  css和js文件访问的地址
            location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
                {
                    root /usr/local/webapp;
                    expires 30d;
                }
              #表示的是css和js的访问地址
              location ~ .*\.(js|css)?$
               {
                 root /usr/local/webapp;
                 expires 1h;
               }
          }
            #虚拟了服务器
            server {
                #端口是  80
                listen       80;
                #这个表示的是虚拟服务器默认访问的是本机
                server_name  localhost;
                #这个是虚拟服务器的编码
                #charset koi8-r;
                #当前服务器的日志的存储的地方
                #access_log  logs/host.access.log  main;
                #做了一个地址的映射
                location / {
                    root   html;
                    index  index.html index.htm;
                }
                #如果报404的时候访问的页面
                #error_page  404              /404.html;
                # redirect server error pages to the static page /50x.html
                #报错50开头的是 就访问50x.html
                error_page   500 502 503 504  /50x.html;
                #下面对50x.html又做了一个映射  就访问根目录下的html中的  50x.html
                location = /50x.html {
                    root   html;
                }
                # proxy the PHP scripts to Apache listening on 127.0.0.1:80
                #
                #location ~ \.php$ {
                #    proxy_pass   http://127.0.0.1;
                #}
                # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
                #
                #location ~ \.php$ {
                #    root           html;
                #    fastcgi_pass   127.0.0.1:9000;
                #    fastcgi_index  index.php;
                #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
                #    include        fastcgi_params;
                #}
                # deny access to .htaccess files, if Apache's document root
                # concurs with nginx's one
                #
                #location ~ /\.ht {
                #    deny  all;
                #}
            }
            # another virtual host using mix of IP-, name-, and port-based configuration
            #
            #server {
            #    listen       8000;
            #    listen       somename:8080;
            #    server_name  somename  alias  another.alias;
            #    location / {
            #        root   html;
            #        index  index.html index.htm;
            #    }
            #}
            # HTTPS server
            #
            #server {
            #    listen       443 ssl;
            #    server_name  localhost;
            #    ssl_certificate      cert.pem;
            #    ssl_certificate_key  cert.key;
            #    ssl_session_cache    shared:SSL:1m;
            #    ssl_session_timeout  5m;
            #    ssl_ciphers  HIGH:!aNULL:!MD5;
            #    ssl_prefer_server_ciphers  on;
            #    location / {
            #        root   html;
            #        index  index.html index.htm;
            #    }
            #}
        }

        image.gif

        4、实现Nginx下的反向代理

        「做一个反向代理:」

          • 表示的是如果你访问的后缀是 .jpg结尾的话,那么就访问下面的另外的服务器
          location ~ \.jpg$ {
                      proxy_pass   http://10.7.182.110:8080;
                  }

          image.gif

          ‍5、实现Nginx下的负载均衡

          「第一种策略:默认是轮循的策略:」

          配置upstream
             upstream qianyu {
                server 10.7.182.110:8080;
                server 10.7.182.87:8080;
             }
             配置负载均衡
             location ~ \.jpg$ {
                     proxy_pass   http://qianyu;
             }

          image.gif

          「第二种策略:权重(weight):」

          #负载均衡的配置
            upstream qianyu {
               server 10.7.182.110:8080 weight=2;
               server 10.7.182.87:8080 weight=1;
            }
           配置负载均衡
               location ~ \.jpg$ {
                     proxy_pass   http://qianyu;
               }

          image.gif

          「第三种策略:IPHash的使用:」

          #负载均衡的配置
             upstream qianyu {
                ip_hash;
                server 10.7.182.110:8080;
                server 10.7.182.87:8080;
             }
          配置负载均衡
              location ~ \.jpg$ {
                     proxy_pass   http://qianyu;
              }

          image.gif

          6、实现Nginx下的动静分离

          「动静分离:」

            • 简单的来说就是将动态资源和静态资源给分隔开
            • 静态资源放到Nginx服务器上
            • 动态资源放到Tomcat服务器上
            Jpg   html   css    png   gif    ....静态资源  ---->放到Nginx服务器上
            .action结尾的都是动态的资源     ------------------------->放到Tomcat的服务器上

            image.gif

            「动静分离的实现:」

              • 在/usr/local目录下创建webapp文件夹
              • 在webapp目录下创建css、html、js、img文件夹
              • 编写HTML的内容并将html文件放到webapp目录下
              <!DOCTYPE html>
              <html>
               <head>
                <meta charset="utf-8" />
                <title></title>
                <link rel="stylesheet" type="text/css" href="/css/main.css"/>
                <script src="/js/main.js" type="text/javascript" charset="utf-8"></script>
               </head>
               <body>
                <img src="/img/bbb.jpg"/>
                <br />
                <a href="/Dynamic_Resource/qianyu.action">点击我访问动态资源</a>
               </body>
              </html>

              image.gif

                • 将图片放到img目录下,将css放到css目录下,将js文件放到js的目录下
                • 编写动态资源的这个工程
                package com.qy.servlet;
                import java.io.IOException;
                import java.io.PrintWriter;
                import javax.servlet.ServletException;
                import javax.servlet.http.HttpServlet;
                import javax.servlet.http.HttpServletRequest;
                import javax.servlet.http.HttpServletResponse;
                public class qianyuServlet extends HttpServlet {
                 public void doGet(HttpServletRequest request, HttpServletResponse response)
                   throws ServletException, IOException {
                            this.doPost(request, response);
                 }
                 public void doPost(HttpServletRequest request, HttpServletResponse response)
                   throws ServletException, IOException {
                  response.setContentType("text/html;charset=utf-8");
                  PrintWriter writer=response.getWriter();
                  writer.write("this is dynamic resource test");
                  writer.flush();
                  writer.close(); 
                 }
                }

                image.gif

                  • 编写配置文件    /conf/nginx.xml文件
                  #虚拟一个动静分离的机器
                     server {
                       listen     9999;
                       server_name localhost;
                       #表示的是动态资源访问的机器
                        location / {
                              proxy_pass   http://10.7.182.54:8080;
                        }
                      #表示的是非  css和js文件访问的地址
                      location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
                          {
                              root /usr/local/webapp;
                              expires 30d;
                          }
                        #表示的是css和js的访问地址
                        location ~ .*\.(js|css)?$
                    {
                           root /usr/local/webapp;
                           expires 1h;
                         }
                    }

                  image.gif

                    • 测试

                    7、虚拟主机

                    「虚拟主机配置:」

                    server {
                           listen     90;
                           server_name localhost;
                           location / {
                              root qianyu;
                              index qianyu.html;
                           }
                          #做一个反向代理
                          #表示的是 如果你访问的后缀是 .jpg结尾的话那么 就访问下面的另外的服务器
                            location ~ \.jpg$ {
                                proxy_pass   http://10.7.182.110:8080;
                            }
                    }

                    image.gif

                    结语

                    本篇关于Nginx的介绍就先到这里结束了,后续会出更多关于Nginx系列更多文章,谢谢大家支持!

                    image.gif

                    点个赞,证明你还爱我

                    相关文章
                    |
                    6月前
                    |
                    缓存 JavaScript 安全
                    深度解析Nginx正向代理的原理与实现
                    深度解析Nginx正向代理的原理与实现
                    226 8
                    |
                    5月前
                    |
                    缓存 负载均衡 应用服务中间件
                    深入解析Nginx配置文件
                    Nginx是一个高性能HTTP服务器和反向代理,其配置文件`nginx.conf`包含全局、事件、HTTP、Server和Location块。全局块设置如用户和工作进程数,事件块设定连接数,HTTP块涉及MIME类型、日志和包含其他配置。Server块定义虚拟主机,Location块处理URI匹配。Nginx常用于反向代理和负载均衡,如`proxy_pass`指令转发请求至后端服务器组。理解这些配置有助于服务器优化和测试。
                    |
                    1月前
                    |
                    应用服务中间件 测试技术 nginx
                    Nginx入门 -- 解析Nginx中的基本概念:Keepalive
                    Nginx入门 -- 解析Nginx中的基本概念:Keepalive
                    105 0
                    |
                    2月前
                    |
                    开发框架 安全 应用服务中间件
                    【文件上传绕过】——解析漏洞_IIS7.0 | IIS7.5 | Nginx的解析漏洞
                    【文件上传绕过】——解析漏洞_IIS7.0 | IIS7.5 | Nginx的解析漏洞
                    145 9
                    |
                    4月前
                    |
                    缓存 负载均衡 应用服务中间件
                    nginx.conf 配置解析及常用配置
                    nginx.conf 配置解析及常用配置
                    108 6
                    |
                    3月前
                    |
                    Ubuntu 应用服务中间件 nginx
                    Docker 解析:如何将 Nginx 容器化并用作代理
                    Docker 解析:如何将 Nginx 容器化并用作代理
                    205 0
                    |
                    3月前
                    |
                    域名解析 缓存 负载均衡
                    深度解析Nginx正向代理的原理与实现
                    Nginx虽然主要被用作反向代理,但也可以通过一些特殊配置用作正向代理。虽然不是它的主流用途,但它仍能以其高性能和高稳定性为用户提供代理服务。不过,出于安全性和匿名性的考虑,在使用它作为正向代理时须谨慎配置,并根据实际需求做出调整。
                    116 0
                    |
                    8天前
                    |
                    监控 Java 应用服务中间件
                    高级java面试---spring.factories文件的解析源码API机制
                    【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
                    28 2
                    |
                    1月前
                    |
                    缓存 Java 程序员
                    Map - LinkedHashSet&Map源码解析
                    Map - LinkedHashSet&Map源码解析
                    68 0
                    |
                    1月前
                    |
                    算法 Java 容器
                    Map - HashSet & HashMap 源码解析
                    Map - HashSet & HashMap 源码解析
                    57 0

                    推荐镜像

                    更多
                    下一篇
                    无影云桌面