1、Nginx简介
1.1、什么是Nginx
Nginx 是高性能的 HTTP 和反向代理的服务器,特点是占有内存少,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。
1.2、正向代理
正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需通过代理服务器来访问,这种代理服务就称为正向代理。
1.3、反向代理
反向代理:以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。。
-
正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端
-
反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端
1.4、负载均衡
增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
1.5、动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
2、Nginx安装
2.1、安装
-
安装pcro
- 下载安装包:wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
- 解压: tar -xvf pcre-8.37.tar.gz
- 执行:./configure make make install
-
安装 openssl 、zlib 、 gcc 依赖
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
-
安装 nginx
- 解压:tar -xvf nginx-1.12.2.tar.gz
- ./configure
- make && make install
2.2、启动
直接访问虚拟机IP地址:192.168.5.130
-
访问不成功原因:防火墙不允许80端口的访问
查看开放的端口号:firewall-cmd --list-all
设置开放的端口号:sudo firewall-cmd --add-port=80/tcp --permanent
重启防火墙:firewall-cmd --reload
3、Nginx常用的命令和配置文件
3.1、常用的命令
在/usr/local/nginx/sbin 目录下
- 启动命令:./nginx
- 查看版本号:./nginx -v
- 关闭命令:./nginx -s stop
- 重新加载:./nginx -s reload
3.2、配置文件
去掉多余注释
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
nginx配置文件由三部分组成:
-
全局快:配置服务器整体运行的配置指令
比如 worker_processes 1;处理并发数的配置
-
events块 :影响 Nginx 服务器与用户的网络连接
比如 worker_connections 1024;支持的最大连接数为 1024
-
http块:http 块也可以包括 http 全局块、server 块
-
http 全局块
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
-
server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
1、全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
2、location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
3.3、Nginx 配置实例—反向代理1
- 实现效果:使用 nginx 反向代理,访问 www .123 .com 直接跳转到 127.0.0.1:8080
-
启动tomcat,在 windows 系统中通过浏览器访问 tomcat 服务器
-
配置反向代理
- 结果
3.4、Nginx 配置实例—反向代理2
- 实现效果:使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中
nginx 监听端口为 9001,
访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8080
访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8081
-
准备工作:准备两个tomcat服务器,一个8080端口,一个8081端口
-
在webapps目录下创建文件夹并测试页面
-
修改nginx的配置文件
-
运行结果,通过目录转发到不同的tomcat服务器
location指令说明:用于匹配 URL,语法如下:
location [ = | ~ | ~* | ^~ ] uri {
}
-
= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
-
~:用于表示 uri 包含正则表达式,并且区分大小写。
-
~*:用于表示 uri 包含正则表达式,并且不区分大小写。
-
^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。
3.5、Nginx 配置实例—负载均衡
- 实现效果:浏览器地址栏输入地址 http://192.168.17.129/edu/a.html ,负载均衡效果,平均到 8080和 8081 端口中
-
准备工作:准备两台 tomcat 服务器,一台 8080 ,一台 8081;在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建页面 a.html用于测试
-
修改nginx配置文件:
-
运行结果:轮询访问两个服务器,负载均衡
-
nginx 分配服务器策略
-
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,能自动剔除掉。
-
weight:weight 代表权重默认为 1,权重越高被分配的客户端越多。
upstream myserver{ server 192.168.5.130:8080 weight=10; server 192.168.5.130:8081 weight=10; }
-
ip_hash:每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
upstream myserver{ ip_hash; server 192.168.5.130:8080; server 192.168.5.130:8081; }
-
fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver{ server 192.168.5.130:8080; server 192.168.5.130:8081; fair; }
-
3.6、Nginx 配置实例—动静分离
3.6.1、概念
- Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:
- 纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案
- 动态跟静态文件混合在一起发布,通过 nginx 来分开
- 通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以设置浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。例如,设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。
3.6.2、实现
-
准备工作: 在 liunx 系统中准备静态资源,用于进行访问
-
修改nginx配置文件
-
运行结果:
注意:如果nginx是在docker容器里,那么静态资源也要在容器里才能访问得到。
过程中遇到的错误
1、docker创建的tomcat容器并启动,但是却无法访问
原因:使用命令 docker exec -it 53724a20a48c /bin/bash 进入容器内部,会发现两个webapps
解决方法:将目录下webapps.dist文件里的内容复制到webapps,然后将webapps.dist删除。
root@19360cba0f39:/usr/local/tomcat# cp -r webapps.dist/* ./webapps
root@19360cba0f39:/usr/local/tomcat# rm -rf webapps.dist
2、使用docker创建tomcat和nginx进行反向代理时出现nginx 404
原因:bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。端口映射哪个端口就只能监听端口, 127.0.0.1是容器的内部,而容器内部8080端口没有任何服务,所以就无法访问。
解决方法1:创建容器时更改网络模式为host模式,如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
解决方法2:更改代理服务器的IP地址为tomcat容器的虚拟IP地址,比如tomcat它的虚拟容器IP是127.17.0.3,proxy_pass 就要配置成http://127.17.0.3:8080