Nginx

Nginx

Nginx

什么是Nginx

Nginx是一个高性能的HTTP服务器和反向代理web服务器,主要功能就是反向代理,通过配置文件可以实现负载均衡和集群,静态资源虚拟化

什么是反向代理

正向代理:客户端 ---> 代理服务器 ---> 目标服务器 ---> 内容返回
反向代理:用户请求目标服务器,由代理服务器决定将请求分发到哪个节点的IP上
区别:正向代理是向目标服务器隐藏真实的客户端,反向代理是向客户端隐藏真实的服务器

Nginx的进程模型

当Nginx启动后会自动有一个master进程和一个worker进程,master进程是主进程,worker是工作进程,工作进程是为主进程进行服务的,当主进程接收到信号之后,会将信号发送给工作进程,由工作进程去完成各种请求,当worker进程异常退出或关闭时,master进程会重新foke出一个新的工作进程来进行工作,工作进程的数量可以通过nginx.conf文件进行配置,每个woker进程可以连接多个客户端,连接数量也可以通过nginx.conf这个文件进行配置,在envents这个节点中进行配置,默认的每个woker进程连接最大值是1024,这个数值是可以手动修改的,你可以设置为10240。

Nginx处理web请求机制

每个woker进程可以连接多个客户端,客户端发来的请求是有顺序的,woker进程也是顺序执行请求,当其中某个客户端如果陷入了阻塞时,那么woker进程会立即处理下一个客户端的请求,而不会一直等待阻塞的客户端,这种类似于IO多路复用模型

Nginx显示默认首页解析过程

当我们在本地部署了Nginx之后,打开浏览器输入localhost之后就能直接访问到nginx的首页,这是因为如果我们不做任何配置,直接在浏览器中输入地址并且不加端口号,那么默认请求的就是80端口,而在nginx.conf文件中就有一个server节点是监听的80端口:

    server {
        #监听的端口号
        listen       80;

        #访问的路径,如果是部署在虚拟机上或者是外网上,那么就输入虚拟机的IP地址或者外网的域名,
        #如果你是在本地部署的,那么直接输入localhost
        server_name  localhost; 

        #这个端口默认访问的路径,location斜杠后面的内容会拼接到root设置的目录后面
        #在这段配置中最终的访问路径就是html/,这个路径是可以自定义的
        location / { 
            root   html;
            index  index.html index.htm; #默认的显示页面
        }  
    }

自定义路径设置:

server {
    listen       80;
    server_name  localhost; 
    location /img { 
        root   /home;
    }  
}
假设nginx部署在虚拟机,ip为192.168.1.7
访问方式:192.168.1.7/img/xxx.png

使用别名:

server {
    listen       80;
    server_name  localhost; 
    location /static { 
        alias   /home/img;
    }  
}
访问方式:192.168.1.7/static/xxx.png

location匹配规则

  1. 默认匹配规则

    server {
        listen       80;
    server_name localhost;
    location / {
    root /home;
    }
    }
  2. 精准匹配

    server {
        listen       80;
    server_name localhost;
    location = /img/face1.png {
    root /home;
    }
    }
    如果使用精准匹配的话,那么只能访问到face1.png这张图片,同一目录下的其它图片是访问不到的,文件夹同理
  3. 正则表达式匹配

    server {
        listen       80;
    server_name localhost;
    location ~* .(GIT|png|jpg|jpeg) {
    root /home;
    }
    }
    正则表达式的匹配规则是以~开头的,*代表不区分大小写,匹配规则为只能访问home目录下设置好的图片
    格式,不是以上设置的图片格式或其它文件,将无法访问

Nginx常用命令

nginx的命令都是需要在sbin目录下执行才有效的

./nginx -s -stop : 快速关闭,不管当前是否还有用户请求在执行,都会直接进行关闭(不推荐)

./nginx -s -quit : 当用户的请求还在执行时不会进行关闭,直到用户的请求处理完成之后,在此期间,不会接受新用户的请求

./nginx -t : 用来检测配置文件的语法是否正确,设置是否正确的

./nginx -s reload : 重新加载或重新启动nginx服务,通常是在修改了nginx的配置文件之后使用

./nginx -v : 显示当前Nginx的版本

DNS域名解析

我们日常在浏览器中输入各种域名去访问各种网站,例如:www.baidu.com
为什么输入域名之后就可以访问到对应的网站,我们来看看中间隐藏的部分

  1. 用户打开浏览器输入域名
  2. 然后会跳转到DNS服务器中查找这个域名所对应的IP地址
  3. 找到了IP地址就可以访问该网站的资源了,相反就不可以

从上面的步骤我们不难看出,最终我们还是通过IP来访问各种网站了,只不过其中有一系列的步骤对用户是透明的,那既然都是通过IP来访问,为什么还需要有域名?
因为IP是一大串的数字,实在不好记忆,而且IP地址因为各种原因还可能导致变更,而域名是不会变得,又相对好记忆,所以现在都是使用的域名

那假设我们并没有自己的云服务器和备案过的域名,又想通过域名的方式来访问本地的资源或者虚拟机上的资源,我们可以通过修改hosts文件来对我们的IP进行一个域名的绑定,只不过这个域名只能在自己本地使用,外网是无法进行访问的。

前面我们说的,在浏览器中输入域名之后是会去DNS服务器中查找的,但其实在这之前,浏览器会先去我们本地的hosts文件中查找,如果没有的话,再去的DNS服务器

在mac OS系统中,我们可以通过命令行打开hosts文件:
vim /etc/hosts 就可以看到如下:

127.0.0.1       localhost

127.0.0.1是我们本地的IP,绑定了localhost,所以我们在浏览器中输入localhost就可以访问本地的资源,假设我们在本地部署了nginx服务,那么启动之后通过浏览器输入localhost就可以打开nginx的首页,如果我们不想用localhost来访问,而是通过我们自定义的域名来访问,那我们可以这样做:

127.0.0.1       www.baidu.com

这样在浏览器中输入www.baidu.com就不会访问到百度的页面了,而是到了nginx的首页

Nginx中解决跨域问题

server {
    listen     80;
    server_name        localhost;

    #允许跨域请求的域,*代表所有
    add_header 'Access-Control-Allow-Origin' $http_origin;
    #允许带上cookie请求
    add_header 'Access-Control-Allow-Credentials' 'true';
    #允许请求的方法,比如 GET/POST/PUT/DELETE
    add_header 'Access-Control-Allow-Methods' *;
    #允许请求的header
    add_header 'Access-Control-Allow-Headers' *;


     location / {

        if ($request_method = 'OPTIONS') {
          add_header Access-Control-Allow-Origin $http_origin;
          add_header Access-Control-Allow-Credentials true;
          add_header Access-Control-Allow-Methods $http_access_control_request_method;
          add_header Access-Control-Allow-Headers $http_access_control_request_headers;
          add_header Access-Control-Max-Age 3600;
          add_header Content-Length 0;
          return 200;
       }

 }

Nginx配置反向代理及集群

反向代理配置

//1.在nginx.conf文件中配置upstream上游服务,在这个指令块中写上你需要代理的服务的IP加端口号,
  //这里代理的是tomcat服务器

upstream tomcats {
    server 192.168.1.7:8088;
}

//2.在server指令块中
server {
    listen     80;
    server_name        www.lcz.com;

    location / {
        proxy_pass      http://tomcats;
    }
 }

 我们来解释一下这段配置的含义,假设,我们在虚拟机上搭建一台Nginx服务器中,并为这台虚拟机的IP绑定了
 一个自定义的域名:www.lcz.com,并监听的是80端口,所以,我们在浏览器中输入www.lcz.com就可以直接
 访问到Nginx了,到了Nginx之后会就查看location的路径匹配了,这个时候会发现,location中有个指令:
 proxy_pass,这个指令就是反向代理的意思,然后发现它配置了一个http://tomcats的东西

 最后会去配置文件中找有没有名为tomcats的upstream指令块,找到之后发现upstream指令块中配置了一个
 server指令,这个指令指向了一个部署了tomcat的服务器IP,就会将请求转发到这个部署了tomcat的
 服务器上,这就实现了反向代理的功能

 反向代理:发送请求到目标服务器,由代理服务器决定将请求落在哪个目标服务器的节点上

集群配置

在upstream指令块中配置多个server指令,就组成了一个集群,根据负载均衡的不同策略,
决定将请求落在哪台服务器上

upstream tomcats {
    server 192.168.1.7:8088;
    server 192.168.1.8:8088;
}

server {
    listen     80;
    server_name        www.lcz.com;

    location / {
        proxy_pass      http://tomcats;
    }
}

负载均衡策略

  1. 轮询

    Nginx的负载均衡策略默认的就是使用轮询,轮询就是将请求平均的分配给不同的tomcat
    假设我们现在有两台tomcat,分别是tomcat1和tomcat2,那么在使用轮询的策略时,当用户发起第一
    次请求时会落在tomcat1,第二次就tomcat2,第三次就tomcat1,依次类推
  2. 权重

    权重越高的tomcat被落到的请求也就越多,在默认的轮询策略中,所有的tomcat的权重都1,所以请求
    是平均分发的
    upstream tomcats {
    server 192.168.1.7:8088 weight=1;
    server 192.168.1.8:8088 weight=2;
    }