vlambda博客
学习文章列表

Nginx 一文就够啦(0基础入门到中级实操)

一:学习内容

1、nginx基本概念

(1)nginx是什么,做什么事情

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx可以作为静态页面web服务,支持CGI协议的动态语言。能经受高负载的考验,有实验报告表明能支持高达50000个并发链接。


(2)反向代理

(3)正向代理

nginx不仅可以做反向代理,实现负载均衡。还能用作正向代理进行上网功能。把局域网外的internet想象成一个巨大的资源库,则局域网中的客户端要访问internet,则需要通过代理服务器访问,这种代理服务称为正向代理。

简单说:用户不是直访问某个网站的,是通过一个中间的服务器进行访问某个网站。(在咱们游览器中有个配置代理上网的那个功能哦)


(3)负载均衡

【老的模式:客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,在将结果返回给客户端。】

单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中的单个服务器上的情况改为请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。

总结:所有客户端都请求一个服务器,这个服务器在把压力分发给别的服务器,大家一起干活。

(4)动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。

总结:动态的资源(servlet,jsp)放到一个服务器,静态资源(图片,文件,css,js)放到文件系统中。


2:nginx安装、常用命令和配置文件

(1)在liunx系统中安装nginx

1:远程链接linux系统

2:下载nginx

环境用的是:Ubuntu

sudo apt-get install nginx

在输入 sudo apt-get install nginx 查看版本。

注:如果使用centOS需要先安装依赖:

第一步:安装pcre

wget downloads.sourceforge.net

解压文件

./configure 完成后,回到pcre目录下执行make,再执行make install

第二步:安装openssl

第三步:安装zlib

yum -y install make zlib zlib-devel gcc-c++ libtool operssl-devel


注意:防火墙开发相应的端口

(2)nginx常用命令

1、使用nginx命令前提条件,必须进入nginx的目录:

2、查看nginx的版本号

#./nginx -v //查看nginx版本

3、启动nginx

#ps -ef | grep nginx //查看nginx的状态

#./nginx //启动nginx

4、关闭nginx

#./nginx -s stop //关闭nginx

5、重新加载nginx

修改配置文件(nginx.conf),不重启可以重新加载nginx

#./nginx -s reload //重新加载配置文件


(3)nginx配置文件

1、需要找到nginx配置文件的位置


2、配置文件组成

2-1、全局块

从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径,日志存放路径和类型以及配置文件的引入等。

worker_processes 1; #并发处理服务器关键配置,值越大,可以支持的并发处理量也越多,但是会受到邮件、软件等设备的制约。


2-2、events块

主要影响nginx服务器与用户的网络链接,常用的设置包括是否开启多个work process下的网络链接进行序列化,是否允许同时接收多个网络链接,选取哪种事件驱动模型来处理链接请求,每个word process可以同时支持的最大链接数等。

这部分配置对nginx的性能影响较大,在实际中应该灵活配置。

2-3、http块

这算是nginx服务器配置中最频繁的部分、代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

需要注意的:http块也可以包括http全局块,server块。

①htt全局块

配置的指令包括文件引入,MIME—TYPE定义,日志自定义,链接超时时间、链接请求数量上限等。

②server块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件完成一样的,该技术的产生是为了节省互联网服务器硬件成本。

每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。

而每个server块也分为全局server块,以及可以同时包含多个locaton块。

1、全局server块

最常见的配置是本虚拟主机的监听配置和本虚拟主机的名称或IP配置。

2、location 块

一个service块可以配置多个location块。


3:nginx配置实例1-反向代理

1、实现效果

准工作:

①安装tocamt(端口用8080)

*toamcat安装文件放到liunx系统中,解压

*进入tomcat的bin目录中,./startup.sh 启动服务器

*对外开发访问的端口

#firewall-cmd --add-port=8080/tcp --permanent

#firewall-cmd -reload

#firewall-cmd --list-all

测试tomcat是否可以正常显示。

②在Windows(客户端)配置hosts文件让域名指向IP(测试使用)

③修改nginxconf文件

在server下location下增加 proxy_pass 127.0.0.1:8080 (加载root html;下面)


----------------------------------------

1、实现效果

使用nginx反向代理,根据访问的路径跳转到b不同端口的服务中nginx监听端口为9001,

如:

访问127.0.0.1:9001/edu/ 直接跳转到127.0.0.1:8080

访问127.0.0.1:9001/vod/ 直接跳转到127.0.0.1:8081

2、准备工作:

(1)准备两个tomcat服务器,一个8080端口,一个8081端口,并做好测试文件。

3、nginx配置文件修改

在http块中添加server{}

server{

listen 9001;

location ~ /edu/ {

proxy_pass http://localhost:8001;

}

location~ /vod/{

proxy_pass http://localhost:8002;

}

}


4、location指令说明

该指令用于匹配URL。

语法如下:

location [ = | ~ | ~* | ^~] uri{

}

(1)= 用于不含正则表达式的uri前,要求字符串与uri严格匹配,如果匹配不成功,就停止继续向下搜索并立即处理该请求。

(2)~ 用于表示uri包含正则表达式,并且区分d大小写。

(3)~*用于表示uri包含正则表达式,并且不区分大小写

(4)^~ 用于不含正则表达式的uri前,在nginx服务器找到标识uri和请求字符串匹配高度的location后,立即用次location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。

注意:如果uri包含正则表达式,则必须要用~或者~*表示。


4:nginx配置实例2-负载均衡

(2)准备工作

1、2台服务器,一台8080,一天8081

2、在2个tomcat的webapps目录中,创建名称edu文件夹,在edu文件夹创建a.html,用于测试。

(3)配置负载均衡

http{

........

upstream myserver{

ip_hash;

server IP:8080 weigth=1;

server IP:8081 weigth=1;

}


server{

location / {

proxy_pass myserver

proxy_connect_tiemout 10;

}

}

}


随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即使将负载分摊到不同的服务器单元,既保证服务的可用性,又保证相应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很多功能,但是价格不菲,这使得负载均衡软件大受欢迎,nginx就是其中一个,在linux下有nginx、LVS、Haproxy等等服务可以提供负载均衡服务,而且nginx提供了几种分配方式(策略):

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight

weight代表权重,默认为1,权重越高被分配的客户端越多。

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

upstream server_p00l{

server IP weight=10;

server Ip weight=10;

}

3、ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。例如:

upstream server_pool{

ip_hash;

server IP:端口;

server IP:端口;

}

4、fair(第三方)

按后端服务器的响应时间来分配请求,响应时段短的优先分配。

upstream server_pool{

server IP:port;

server IP:port;

fair;

}


5:nginx配置实例3-动静分离

简单的来说就是把动态和静态请求分开,不能理解成为只是单纯的动态页面和静态页面物理分离。严格来说是动态请求和静态请求分开,可以理解成用nginx处理静态页面,tomcat处理动态页面。动静分离从目前实现角度来讲大致分成2种,

一种是纯粹把静态文件独立成当个独立的域名,放在独立的服务器上,也是目前主流推崇的方案;(主流方案)

另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。

通过location指定不同的后缀名实现不同的请求。通过expires参数设置,可以使用浏览器缓存过期时间,减少对服务器之前的请求和流量。具体expires定义:是给一个资源设定一个过期时间,也就是说无需去服务器端验证,直接通过浏览器自身确认是否过期即可,所有不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不见使用expires来缓存),我这里设置3d,表示在这3天内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200.


1、准备工作

(1)在linux系统中准备静态资源,用于访问

/data/www文件夹、data/image文件夹

2、具体配置

(1)在nginx配置文件

location /www/ {

root /data/;

index index.html index.htm;

}

location /image/ {

root /data/;

autoindex on;

}

3、测试

ip/imagee/ #ip是nginx的ip

ip/www/a.html #ip是nginx的ip


6:nginx配置高可用集群

1、高可用

(1)需要两台nginx服务器

(2)需要keepalived

(3)需要虚拟IP

2、准备工作

(1)需要两台服务器192.168.1.129和192.168.1.131

(2)在两台服务器安装nginx

(3)在两台服务器安装keepalived

使用yum命令或apt-get install直接安装

(4)修改keepalive.conf

global_defs{

notification_email{

[email protected]

[email protected]

[email protected]

}

notification_email_from [email protected]

smtp_server 192.168.1.129

smtp_connect_timeout 30

router_id LVS_DEVEl //LVS_DEVEl 服务器名字(hosts文件查看(127.0.0.1 LVS_DEVEl))

}

vrrp_script chk_http_port{

script "/usr/local/src/nginx_check.sh" //检测脚本

interval 2 //(检测脚本执行的间隔)

weight 2 //权重

}

vrrp_instance VI_1{

state BACKUP //备份服务器上将master改成backup

interface ens33 #网卡

virtual_router_id 51 //主,备的vireual_router_id必须相同

priority 100 //主、备机取不同的优先级别,主机值较大,备份机值较小(一般主机100,本机比100小就可以)

advert_int 1 //心跳时间

authentication{

auth_type PASS

auth_pass 1111

}

virtual_ipaddress{

}


}



在/usr/local/src 添加检测加入 nginx_check.sh

#!/bin.bash

A=`ps -C nginx -no-header |wc -1`

if[ $A -eq 0];then

/usr/local/nginx/sbin/nginx

sleep 2

if[`ps -C nginx --no-header |wc -1` -eq 0];then

killall keepalived

if

fi

先启动把nginx在启动leeplived。

启动nginx:./nginx

启动keepalived:systemctl start keepalived.servce


测试:

(2)把主服务器(192.168.1.129)nginx和keep alive的停止,在输入192.168.1.50

inet 192.168.1.50/32 scope global ens33



7:nginx原理

master$worker

worker如何工作


master-workers的机制的好处:

首先,对于每个worker进行来说,独立的进程,不需要加锁。所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以互相之间不会影响,一个进程退出后,其他进程还在工作,服务器不会中断,master进程很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上述的请求失败,不过不影响到所有请求,所以降低了风险。

需要设hi多个worker

nginx同redis类似都采用了IO多路复用机制,每个worker都是一个独立进程,但每个进程里只有一个主线程,通过异步阻塞的方式来处理请求,即使是千万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数量相当是最为适宜的.设少了会浪费cpu,设置多了会造成cpu频繁切换上下文来带的损耗。

#设置worker数量

worker processes 4  //work绑定cpu(4个work绑定4cpu)

worker cpu affinity 001 0010 0100 1000

//work 绑定cpu(4work绑定8cpu中的4个)

worker_cpu_affinity 0000001 0000010 0000100 0001000

连接数worker_connection

这个值是表示每个worker进程所能建立链接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。当然,这里说的是最大链接数,对于http请求本地资源来源,能够支持的最大并发数量worker_connection * worker_processe,如果是支持http1.1的游览器访问暂用2个链接,所以普通的静态访问最大并发数是:worker_connection *worker_processes / 2,而如果是http作为反向代理来说,最大并发数应该是worker_connections * worker_processes / 4。因为作为反向代理服务器,每个并发会建立与客户端的链接和与后端服务器的链接,会占用2个链接。

(1)可以i使用ningx -s reload 热部署

(2)每个worker是独立的进程,如果有其中的恶搞worker出现问题,其他woker独立的,继续进行争抢,实现请求过程,不会造成服务中断。

(3)设置多少个worker合适:

如果是4核的cpu 就设置 4个worker,8核的设置8个worker

(cpu的数量和worker数量要相当)

(4)连接数worker_connection

1、发送请求,需要占用2个或4个worker的链接数量

(单独的静态资源是2个,需要请求动态4个)

2、普通的静态最大并发数是:

worker_connection *worker_processes / 2

3、http作为反向代理,最大并发数

worker_connection *worker_processes / 4