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

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

[[350783]]

 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安装步骤:」

第一步:下载我们的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 
 
浏览器进行验证没问题就可以 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.

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; 
    #    } 
    #} 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.

4、实现Nginx下的反向代理

「做一个反向代理:」

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

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

5、实现Nginx下的负载均衡

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

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

「第二种策略:权重(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; 
     } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

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

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

6、实现Nginx下的动静分离

「动静分离:」 

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

「动静分离的实现:」

 

  • 在/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> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 将图片放到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();  
 } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 编写配置文件 /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; 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 测试

7、虚拟主机

「虚拟主机配置:」

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

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

结语

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

 

责任编辑:姜华 来源: 浅羽的IT小屋
相关推荐

2019-08-13 15:36:57

限流算法令牌桶

2020-08-03 10:00:11

前端登录服务器

2023-04-24 08:00:00

ES集群容器

2020-02-18 16:20:03

Redis ANSI C语言日志型

2022-06-20 09:01:23

Git插件项目

2020-05-14 16:35:21

Kubernetes网络策略DNS

2023-02-10 09:04:27

2022-08-01 11:33:09

用户分析标签策略

2021-04-08 07:37:39

队列数据结构算法

2023-09-11 08:13:03

分布式跟踪工具

2018-11-12 08:07:04

Nginx优化并发

2018-05-22 08:24:50

PythonPyMongoMongoDB

2021-05-14 23:31:50

大数据计算机开发

2020-07-03 08:21:57

Java集合框架

2024-04-08 10:01:33

2024-09-23 08:00:00

消息队列MQ分布式系统

2023-10-17 08:15:28

API前后端分离

2019-05-14 09:31:16

架构整洁软件编程范式

2017-03-11 22:19:09

深度学习

2021-03-03 14:55:10

开发MySQL代码
点赞
收藏

51CTO技术栈公众号