|
|
|
|
公众号矩阵

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

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

作者:浅羽Eric来源:浅羽的IT小屋|2020-11-06 10:01

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这个服务器的目的

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

「Nginx能干什么呢:」

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

2、Nginx的安装

「Nginx安装步骤:」

  1. 第一步:下载我们的nginx 这里以1.6.2版本为例 
  2.  
  3. 第二步:共享安装文件到我们的linux上面 
  4.  
  5. 第三步:将文件拷贝到/usr/local下面 
  6.  
  7. 第四步:安装 tar -zxvf xxxx.tar.gz 
  8.  
  9. 第五步:下载所需要的依赖库 yum install pcre  yum install pcre-devel  yum install zlib   yum install zlib-devel 
  10.  
  11. 第六步:进行config的配置 
  12. cd nginx-1.6.2 && ./configure --prefix=/usr/local/nginx 
  13.  
  14. 第七步:安装 
  15.  
  16. make && make install  
  17.  
  18. 第八步:启动nginx 
  19.  
  20. /usr/local/nginx/sbin/nginx 
  21.  
  22. 关闭: .... -s stop -s reload  
  23.  
  24. 查看端口是否有问题 
  25.  
  26. netstat -tunpl |grep 80 
  27.  
  28. 浏览器进行验证没问题就可以 

3、Nginx的配置文件的解析

「配置文件:」

  1. #user  nobody; 
  2. #工作的线程(4核8线程那么下面就设置成8 物理硬件有关) 
  3. worker_processes  1; 
  4.  
  5. #全局的错误日志存放的地方 
  6. #error_log  logs/error.log; 
  7.  
  8. #全局错误日志存放的地方 后面的notice表示的是输出错误日志的格式 
  9. #error_log  logs/error.log  notice; 
  10. #error_log  logs/error.log  info; 
  11.  
  12. #nginx进程号存放的地方 
  13. #pid        logs/nginx.pid; 
  14.  
  15.  
  16. #最大的连接数(这个也跟硬件是有关系的) 
  17. events { 
  18.     worker_connections  1024; 
  19.  
  20.  
  21. #下面就是跟HTTP请求有关系的了 
  22. http { 
  23.     #表示的是当前服务器支持的类型 
  24.     include       mime.types; 
  25.     #默认传输的数据类型是流  
  26.     default_type  application/octet-stream; 
  27.  
  28.     #声明了一种日志格式 这种日志格式的名字叫做  main 
  29.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' 
  30.                       '$status $body_bytes_sent "$http_referer" ' 
  31.                       '"$http_user_agent" "$http_x_forwarded_for"'
  32.  
  33.     #表示的是每一次请求的日志记录 格式就是上面的main格式 
  34.     access_log  logs/access.log  main; 
  35.      
  36.     #是否可以发送文件 
  37.     sendfile        on
  38.     #tcp_nopush     on
  39.  
  40.     #这个是双活的超时的时间 
  41.     #keepalive_timeout  0; 
  42.     keepalive_timeout  65; 
  43.  
  44.     #是否打开文件的压缩 
  45.     #gzip  on
  46.  
  47.     #虚拟一个主机 
  48.     
  49.    #负载均衡的配置 
  50.    upstream qianyu { 
  51.       ip_hash; 
  52.       server 10.7.182.110:8080; 
  53.       server 10.7.182.87:8080; 
  54.    } 
  55.  
  56.     #server { 
  57.       # listen     90; 
  58.       # server_name localhost;  
  59.       # location / { 
  60.       #    root qianyu; 
  61.       #    index qianyu.html; 
  62.       # } 
  63.       #做一个反向代理 
  64.       #表示的是 如果你访问的后缀是 .jpg结尾的话那么 就访问下面的另外的服务器 
  65.        # location ~ \.jpg$ { 
  66.        #     proxy_pass   http://10.7.182.110:8080; 
  67.        # } 
  68.  
  69.       #下面要演示一个负载均衡的例子 
  70.        #location ~ \.jpg$ { 
  71.        #    proxy_pass   http://qianyu; 
  72.        #} 
  73.     #} 
  74.  
  75.    #虚拟一个动静分离的机器 
  76.    server { 
  77.      listen     9999; 
  78.      server_name localhost; 
  79.       
  80.      #表示的是动态资源访问的机器 
  81.  
  82.       location / { 
  83.             proxy_pass   http://10.7.182.54:8080; 
  84.       } 
  85.       
  86.   
  87.     #表示的是非  css和js文件访问的地址 
  88.     location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ 
  89.         { 
  90.             root /usr/local/webapp; 
  91.             expires 30d; 
  92.         } 
  93.       #表示的是css和js的访问地址 
  94.       location ~ .*\.(js|css)?$ 
  95.        { 
  96.          root /usr/local/webapp; 
  97.          expires 1h; 
  98.        } 
  99.  
  100.   } 
  101.  
  102.     #虚拟了服务器 
  103.     server { 
  104.         #端口是  80 
  105.         listen       80; 
  106.         #这个表示的是虚拟服务器默认访问的是本机 
  107.         server_name  localhost; 
  108.         #这个是虚拟服务器的编码 
  109.         #charset koi8-r; 
  110.         #当前服务器的日志的存储的地方 
  111.         #access_log  logs/host.access.log  main; 
  112.  
  113.         #做了一个地址的映射 
  114.         location / { 
  115.             root   html; 
  116.             index  index.html index.htm; 
  117.         } 
  118.          
  119.         #如果报404的时候访问的页面 
  120.         #error_page  404              /404.html; 
  121.  
  122.         # redirect server error pages to the static page /50x.html 
  123.         #报错50开头的是 就访问50x.html 
  124.         error_page   500 502 503 504  /50x.html; 
  125.         #下面对50x.html又做了一个映射  就访问根目录下的html中的  50x.html 
  126.         location = /50x.html { 
  127.             root   html; 
  128.         } 
  129.  
  130.         # proxy the PHP scripts to Apache listening on 127.0.0.1:80 
  131.         # 
  132.         #location ~ \.php$ { 
  133.         #    proxy_pass   http://127.0.0.1; 
  134.         #} 
  135.  
  136.         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
  137.         # 
  138.         #location ~ \.php$ { 
  139.         #    root           html; 
  140.         #    fastcgi_pass   127.0.0.1:9000; 
  141.         #    fastcgi_index  index.php; 
  142.         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name; 
  143.         #    include        fastcgi_params; 
  144.         #} 
  145.  
  146.         # deny access to .htaccess files, if Apache's document root 
  147.         # concurs with nginx's one 
  148.         # 
  149.         #location ~ /\.ht { 
  150.         #    deny  all
  151.         #} 
  152.     } 
  153.  
  154.  
  155.     # another virtual host using mix of IP-, name-, and port-based configuration 
  156.     # 
  157.     #server { 
  158.     #    listen       8000; 
  159.     #    listen       somename:8080; 
  160.     #    server_name  somename  alias  another.alias; 
  161.  
  162.     #    location / { 
  163.     #        root   html; 
  164.     #        index  index.html index.htm; 
  165.     #    } 
  166.     #} 
  167.  
  168.  
  169.     # HTTPS server 
  170.     # 
  171.     #server { 
  172.     #    listen       443 ssl; 
  173.     #    server_name  localhost; 
  174.  
  175.     #    ssl_certificate      cert.pem; 
  176.     #    ssl_certificate_key  cert.key
  177.  
  178.     #    ssl_session_cache    shared:SSL:1m; 
  179.     #    ssl_session_timeout  5m; 
  180.  
  181.     #    ssl_ciphers  HIGH:!aNULL:!MD5; 
  182.     #    ssl_prefer_server_ciphers  on
  183.  
  184.     #    location / { 
  185.     #        root   html; 
  186.     #        index  index.html index.htm; 
  187.     #    } 
  188.     #} 
  189.  

4、实现Nginx下的反向代理

「做一个反向代理:」

表示的是如果你访问的后缀是 .jpg结尾的话,那么就访问下面的另外的服务器

  1. location ~ \.jpg$ { 
  2.             proxy_pass   http://10.7.182.110:8080; 
  3.         } 

5、实现Nginx下的负载均衡

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

  1. 配置upstream 
  2.    upstream qianyu { 
  3.       server 10.7.182.110:8080; 
  4.       server 10.7.182.87:8080; 
  5.    } 
  6.    配置负载均衡 
  7.    location ~ \.jpg$ { 
  8.            proxy_pass   http://qianyu; 
  9.    } 

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

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

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

  1.  #负载均衡的配置 
  2.    upstream qianyu { 
  3.       ip_hash; 
  4.       server 10.7.182.110:8080; 
  5.       server 10.7.182.87:8080; 
  6.    } 
  7. 配置负载均衡 
  8.     location ~ \.jpg$ { 
  9.            proxy_pass   http://qianyu; 
  10.     } 

6、实现Nginx下的动静分离

「动静分离:」

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

「动静分离的实现:」

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

  • 将图片放到img目录下,将css放到css目录下,将js文件放到js的目录下
  • 编写动态资源的这个工程
  1. package com.qy.servlet; 
  2.  
  3. import java.io.IOException; 
  4. import java.io.PrintWriter; 
  5.  
  6. import javax.servlet.ServletException; 
  7. import javax.servlet.http.HttpServlet; 
  8. import javax.servlet.http.HttpServletRequest; 
  9. import javax.servlet.http.HttpServletResponse; 
  10.  
  11. public class qianyuServlet extends HttpServlet { 
  12.  
  13.  public void doGet(HttpServletRequest request, HttpServletResponse response) 
  14.    throws ServletException, IOException { 
  15.             this.doPost(request, response); 
  16.  } 
  17.  
  18.  public void doPost(HttpServletRequest request, HttpServletResponse response) 
  19.    throws ServletException, IOException { 
  20.  
  21.   response.setContentType("text/html;charset=utf-8"); 
  22.   PrintWriter writer=response.getWriter(); 
  23.   writer.write("this is dynamic resource test"); 
  24.   writer.flush(); 
  25.   writer.close();  
  26.  } 
  • 编写配置文件 /conf/nginx.xml文件
  1. #虚拟一个动静分离的机器 
  2.    server { 
  3.      listen     9999; 
  4.      server_name localhost; 
  5.  
  6.      #表示的是动态资源访问的机器 
  7.  
  8.       location / { 
  9.             proxy_pass   http://10.7.182.54:8080; 
  10.       } 
  11.     #表示的是非  css和js文件访问的地址 
  12.     location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ 
  13.         { 
  14.             root /usr/local/webapp; 
  15.             expires 30d; 
  16.         } 
  17.       #表示的是css和js的访问地址 
  18.       location ~ .*\.(js|css)?$ 
  19.   { 
  20.          root /usr/local/webapp; 
  21.          expires 1h; 
  • 测试

7、虚拟主机

「虚拟主机配置:」

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

结语

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

【编辑推荐】

  1. Python虽好,但请不要盲目将它用于每一个项目!
  2. 红帽开放混合云 助力企业成为数字原生企业
  3. 分析鸿蒙系统helloworld程序是如何被调用,SYS_RUN做什么事情
  4. 5G为何突然间就“不火”了?
  5. 新方向、新功能:Python3.9 完整版面世了
【责任编辑:姜华 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

云原生架构实践

云原生架构实践

新技术引领移动互联网进入急速赛道
共3章 | KaliArch

27人订阅学习

数据中心和VPDN网络建设案例

数据中心和VPDN网络建设案例

漫画+案例
共20章 | 捷哥CCIE

189人订阅学习

搭建数据中心实验Lab

搭建数据中心实验Lab

实验平台Datacenter
共5章 | ITGO(老曾)

119人订阅学习

视频课程+更多

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微