Nginx(简介)教程
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的端口号
```java
查看开放的端口号
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 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。
上述例子就表示每个 work process 支持的最大连接数为 1024.
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
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下面的资源