Nginx(简介)
1.Nginx入门
内容简介 :
1、Nginx简介
- 介绍Nginx的应用场景和具体可以做什么
- 介绍什么是反向代理
- 介绍什么是正向代理
- 介绍什么是动静分离
2、Nginx安装
3、Nginx的常用命令和配置文件
- 介绍Nginx启动,关闭,重新加载命令
- 介绍Nginx的配置文件
4、nginx配置实例-反向代理
5、nginx配置实例-负载均衡
6、nginx配置实例-动静分离
7、nginx原理
1.1 Nginx 简介
Nginx是一个HTTP服务器,擅长处理静态资源文件(html,css,js,img),并且处理高并发能力比较强(50000个),tomcat是web服务器, 可以处理几百个(500-600)而tomcat擅长处理动态资源 。 中国大陆使用 nginx 网站用户有:百度、京东、新浪、网 易、腾讯、淘宝等。
Nginx 官网: http://nginx.org/
1.2Nginx优势
和其他web服务器(tomcat, Apache)相比有以下几个有点 :
- 高并发
- 热部署
- 快
- 低功耗
- 可反向代理、负载均衡、处理静态资源文件
1.3 Nginx安装
1.3.1 安装nginx所需要的预处理环境
-
gcc
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,需要安装 gcc:
yum install gcc-c++
-
PCRE
PCRE(Perl Compatible Regular Expressions)是一个 Perl 库,包括 perl 兼容的正则表达式库。 nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库。
yum install -y pcre pcre-devel
注:cre-devel 是使用 pcre 开发的一个二次开发库。nginx 也需要此库
-
zlib
zlib 库提供了很多种压缩和解压缩的方式,nginx 使用 zlib 对 http 包的内容进行 gzip,所以需要在 linux 上安装 zlib 库。
yum install -y zlib zlib-devel
-
openssl
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。 nginx 不仅支持 http 协议,还支持 https(即在 ssl 协议上传输 http),所以需要在 linux 安装 openssl 库。
yum install -y openssl openssl-devel
1.3.2 安装nginx步骤
将 nginx 压缩包拷贝至 linux 服务器,解压 nginx 压缩包。
-
解压并进入nginx安装目录
tar -zxvf nginx-1.12.2.tar.gz -C /opt/install
cd nginx-1.12.2
-
生成makefile文件
./configure --help 查询详细参数(参考本教程附录部分:nginx 编译参数) 参数设置如下:提示先创建该目录:mkdir -p /var/temp/nginx
/configure \ prefix=/usr/local/nginx \ pid-path=/var/run/nginx/nginx.pid \ lock-path=/var/lock/nginx.lock \ error-log-path=/var/log/nginx/error.log \ http-log-path=/var/log/nginx/access.log \ with-http_gzip_static_module \ http-client-body-temp-path=/var/temp/nginx/client \ http-proxy-temp-path=/var/temp/nginx/proxy \ http-fastcgi-temp-path=/var/temp/nginx/fastcgi \ http-uwsgi-temp-path=/var/temp/nginx/uwsgi \ http-scgi-temp-path=/var/temp/nginx/scgi
-
编译并安装
make
make install
-
复制nginx命令为全局命令
将 nginx 命令复制为全局命令之后,就可以在任意地方使用了。
cp /usr/local/nginx/sbin/nginx /usr/local/bin/
-
在Windows上测试nginx
192.168.52.5 (虚拟机的IP)
-
注意打开nginx的端口号
查看开放的端口号 Firewall-cmd --list-all 设置开放的的端口号 firewall-cmd -add-port=80/tcp --permanent 重启防火墙 Firewall-cmd -reload
-
1.4 Nginx常用命令
在cd /usr/local/nginx/sbin/ 目录下执行 :
-
启动
./nginx
-
停止
./nginx -s stop
此方式相当于先查出 nginx 进程 id 再使用 kill 命令强制杀掉进程。
-
停止(2)
./nginx -s quit (推荐使用)
此方式停止步骤是待Nginx进程处理任务完毕后进行停止
-
重新加载命令
./nginx -s reload
-
查看版本
./nginx -v
-
查看进程
ps -ef | grep nginx
1.5 配置文件nginx.conf
-
全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
配置 :
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
-
events块
配置 :
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。
上述例子就表示每个 work process 支持的最大连接数为 1024.
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
-
http块
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括http全局块、server 块。
1 http 全局块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
2 service 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
1、全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
2、location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串
(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
2 Nginx虚拟主机
2.1 基于端口号的虚拟主机
-
复制一份server , 指定端口号为 :81
server { listen 80; server_name www.teacher.com; #charset koi8-r; #access_log logs/host.access.log main; location ~ /edu/ { root html-1; #指定的是 nginx 安装目录下的某个文件夹的名字 index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
-
在nginx的安装目录下创建一个html-1文件夹,并设置index.html页面
-
重启nginx : ./nginx -s reload
-
防火墙释放81 端口号
- firewall-cmd --add-port=81/tcp --permanent # 释放端口号
- firewall-cmd --reload # 重新加载
-
在浏览器测试 :http://虚拟机 ip:80 , http:// 虚拟机 ip :81
2.2 基于域名的虚拟主机
-
配置nginx.conf 文件 ,指定不同的server的域名
server { listen 80; server_name www.tea.com; #charset koi8-r; #access_log logs/host.access.log main; location ~ /edu/ { root html; #指定的是 nginx 安装目录下的某个文件夹的名字 index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 80; server_name www.stu.com; #charset koi8-r; #access_log logs/host.access.log main; location ~ /vod/ { root html-1; #指定的是 nginx 安装目录下的某个文件夹的名字 index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
-
重新加载nginx的配置文件
-
配置Windows 的C:\Windows\System32\drivers\etc 配置如下内容
-
测试
3 Nginx配置实现
3.1 正向代理
Nginx不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。
正向代理:如果把局域网想象成一个巨大资源库,则局域网汇中的客户要访问Internet,则需要通过代理服务器来访问,这种情况称为正向代理.
简单理解:正向代理代理的是客户端。
3.2 反向代理
反向代理 : 其实客户端代理是无感知的,因为客户端不需要配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器 ,暴露的是代理服务器地址,隐藏真实的服务器地址的IP信息。
简单理解 : 反向代理代理的是服务器,可以帮助我们接收来自客户端发来的请求,帮助服务器请求转发,负载均衡等。
3.2.1反向代理 案例一
效果实现:使用nginx反向代理,访问www.teacher.com直接跳到192.168.52.4:8080
步骤一 :启动tomcat , 在浏览器输入192.168.52.4:8080 出现画面:
步骤二 : 修改本地的host (路径 :C:\Windows\System32\drivers\etc)
步骤三 : 修改nginx.conf 文件
步骤四 : 上传并重新加载 (比如位置 :cd /usr/local/nginx/sbin ./nginx -s reload)
3.2.2 反向代理案例二
目标效果 :
使用nginx的反向代理,根据访问的路径跳转不同的端口的服务器
比如 :
http://www.teacher.com/edu/a.html 跳转端口号为8080
http://www.teacher.com/vod/a.html 跳转端口号为8081
步骤一 :准备tomcat
准备两个tomcat,一个端口为8080,一个为8081,并准备好跳转页面
注意修改 :
1.修改第二个 tomcat 的三个端口号(8005、8080、8009)
2.将/etc/profile 中的 tomcat 环境变量配置去掉,并刷新该文件、重启虚拟机
3.在防火墙中放开新 tomcat 的访问端口号
步骤二 :修改nginx.conf 的配置文件
步骤三 :测试
1 先在端口号为 8080的 tomcat 的 webapps目录里创建一个目录为 edu 的目录,在里面创 建a.html,写明 8080
2 再在端口号为 8081的 tomcat 的 webapps目录里创建一个目录为 vod 的目录,在里面创建a.html,写明 8081
3 测试 :
http://www.teacher.com/vod/a.html
http://www.teacher.com/edu/a.html
效果演示结果:
3.2.3 location 指令的说明
语法 :
1、= 用于不含正则表达式,要求请求的字符集与uri严格匹配,若匹配成功就停止搜索,,继续向下进行处理该请求
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~ *:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识
3.4 负载均衡
3.4.1 什么是负载均衡 :
将负载(访问请求)进行平衡,分摊到各个服务器进行执行。解决高性能,单个单点故障(高可用),扩展性(水平伸缩的)解决方案 。
操作步骤 :
步骤一 :准备两个 Tomcat,并在每个 tomcat 下的 ROOT 目录下分别添加有区分的 a.html
步骤二 :在 nginx.conf 中进行配置
步骤三 :测试 请求 192.168.52.4.80
3.4.2 nginx分配服务器策略
随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是**将负载分摊到不同的服务单元,**既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx就是其中的一个,在linux下有Nginx、LVS、Haproxy等等服务可以提供负载均衡服务,而且Nginx提供了几种分配方式(策略):
3.4.2.1 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
3.4.2.2weight
weight代表权,重默认为1,权重越高被分配的客户端越多
<!-- 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 -->
upstream myserver {
server 192.168.52.4:8080 weight=1;
server 192.168.52.4:8081 weight=3;
}
3.4.2.3 iphash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
理解 :用于用户第一次请求的服务器编号是002号,那么用户再次登录访问的还是002号服务器。
upstream myserver {
ip_hash;
server 192.168.52.4:8080;
server 192.168.52.4:8081;
}
3.4.2.4 fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream myserver {
server 192.168.52.4:8080;
server 192.168.52.4:8081;
fair;
}
3.4.2.5 其他参数
upstream myserver {
server 192.168.52.4:8080 down;
server 192.168.52.4:8081;
server 192.168.52.4:8082 weight=3;
}
1 : down
表示当前的server暂时不参与负载
2 :weight
默认是1 ,weight越大,负载的权重越大
3 :其他所有的backup机器在down或者忙的时候, 请求backup机器。
3.5 动静分离
由于 nginx 擅长处理静态资源,而 tomcat 擅长处理动态资源,所以为了加快网站的解析速度,可以把动 态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx 处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种:
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。
通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。
具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。
此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。
步骤:
步骤一 :
在tomcat的webapps的目录下index.jsp添加引用
步骤二 :
在tomcat 的 /opt/install/tomcat7/webapps/ROOT (依照安装tomcat的位置而定)下面引入图片
步骤三 :
在nginx.conf 的配置文件中配置信息 ,并在nginx的/sbin
步骤四 :输入ip地址进行测试 结果如下
配置如下:再访问静态资源会访问,nginx下面的资源