Nginx 03篇——Nginx配置实例
- 1. 关于Nginx 的安装和简单配置
- 1.1 简单安装
- 1.2 简单配置
- 1.3 防火墙问题
- 2. Nginx配置实例实例1——反向代理
- 2.1 Nginx安装之后默认配置访问
- 2.2 修改配置——反向代理
- 2.2.1 非域名情况
- 2.2.2 域名情况(模拟)
- 2.2.2 域名情况(真域名)
- 2.3 总结
- 3. Nginx配置实例实例2——反向代理2(代理多地址)
- 3.1 想要实现的效果:
- 3.2 准备两个 tomcat 服务器
- 3.2 修改配置文件
- 3.3 地址栏访问
- 4. Nginx配置实例实例3——负载均衡
- 4.1 Nginx负载均衡实例
- 4.1.1 负载均衡简单说明
- 4.1.2 准备工作
- 4.1.3 配置nginx
- 4.1.3.1 负载均衡核心配置
- 4.1.3.2 配置注意问题
- 4.1.4 看效果
- 4.2 Nginx负载均衡分配策略
- 5. Nginx配置实例实例4——动静分离
- 5.1 准备静态资源
- 5.2 配置文件
- 5.3 看效果
1. 关于Nginx 的安装和简单配置
1.1 简单安装
- 关于Nginx的安装可以看下面的文章Nginx 01篇——Nginx详细安装步骤以及Nginx各种启动方式.
1.2 简单配置
- 关于Nginx 的简单配置可以看下面的文章:Nginx 02篇——Nginx基本配置与参数说明篇.
1.3 防火墙问题
- 下面可能会遇到防火墙端口开放问题,如需要处理防火墙问题的,可以看下面的文章:linux下查看防火墙状态、关闭防火墙、开放关闭端口等.
2. Nginx配置实例实例1——反向代理
2.1 Nginx安装之后默认配置访问
- http块中的server块的默认配置如下:
- 访问:地址栏直接输入IP即可
2.2 修改配置——反向代理
- 接下来我们模拟一个最简单的反向代理实例,首先把本机上的
tomcat
启动
没有tomcat的可以通过下面方式下载一个:
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.71/bin/apache-tomcat-9.0.71.tar.gz
- 如果需要安装jdk请看下面的文章:
linux下安装JDK1.8
2.2.1 非域名情况
- 反向代理要实现的效果是:
当地址栏访问http://ip
,访问到的真实地址是Tomcat的主页面http://ip:8080
。
即:此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。 - 配置如下:
在 location 块内添加如下配置:
proxy_pass http://127.0.0.1:8080;
- 效果如下:
下面效果实现了:当地址栏访问http://ip
(默认端口80),访问到的真实地址是Tomcat的主页面http://ip:8080
,如下:
2.2.2 域名情况(模拟)
- 反向代理要实现的效果是:
当地址栏访问http://域名
,访问到的真实地址是Tomcat的主页面http://ip:8080
。 - 如果有域名当然可以直接用,如果没有域名可以简单模拟一下,配置本地的hosts文件即可
- mac——可以用浏览器插件(
Livehosts
)或者sudo vim /etc/hosts
,能 ping 通域名 - 如果正常情况下,上面配置完之后,地址栏输入
susu.con.cn
就可以实现我们想要的效果了,但是,我这里出现了点问题,可能大家也会遇到,如果遇到不能正常访问的,请先移步到解决一下问题:
关于 mac 本地配置域名能 ping 通,但是浏览器不能访问的问题(而其他电脑操作可访问). - windows——直接修改本地的hosts文件,添加下面的信息即可:
susu.con.cn 服务器IP
- 效果如下:
2.2.2 域名情况(真域名)
- 如果有服务器的话,可以弄一个域名玩一下,有的域名也挺便宜的
- 配置如下:
server {
listen 80;
# server_name ip;
server_name 域名; # 客户端在地址栏访问的域名地址
location / {
root html;
proxy_pass http://127.0.0.1:8080; # 真实访问的服务器地址
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
- 效果如下:
2.3 总结
- nginx 反向代理主要通过
proxy_pass
来配置,将你的项目的开发地址填写到proxy_pass
后面:
location / {
root html;
proxy_pass http://127.0.0.1:8080; # 被代理的真实地址
index index.html index.htm;
}
3. Nginx配置实例实例2——反向代理2(代理多地址)
- 下面用到的端口如果没有开放记得开放端口:
云服务器上开放端口,如下: - 关于防火墙的问题(当然你可以直接把防火墙关闭),如下:
linux下查看防火墙状态、关闭防火墙、开放关闭端口等.
3.1 想要实现的效果:
- 当服务器上部署两个不同的项目或者多个项目的时候,客户端访问入口的端口一样的情况下,可通过前缀配置location ,参考下面的配置
3.2 准备两个 tomcat 服务器
- 上面准备一个8080端口的tomcat9,再准备一个8082端口的tomcat8,不多说如下:
- 在两个服务器下分别准备两个静态文件
- 确保静态文件可以访问,不演示了,自己试试
http://IP:8080/t9/tom9.html
http://IP:8082/t8/tom8.html
3.2 修改配置文件
- 修改配置文件如下:
server {
listen 9003;
# listen somename:8080;
server_name XXX; #IP
location ~ /t8/ {
proxy_pass http://127.0.0.1:8082;
}
location ~ /t9/ {
# root html;
proxy_pass http://127.0.0.1:8080;
# index index.html index.htm;
}
}
- 修改完记得加载,重新加载之前可以检查一下配置文件是否有误
- 检查命令:
./nginx -t
- 重新加载命令:
./nginx -s reload
3.3 地址栏访问
- 如下:
4. Nginx配置实例实例3——负载均衡
4.1 Nginx负载均衡实例
4.1.1 负载均衡简单说明
- 负载均衡是将请求分配到不同的服务单元,既可以是同一台服务器的不同进程,也可以是不同服务器,这样既保证服务的高可用性,又保证高并发情况下的响应速度,能够给用户更好的体验。
4.1.2 准备工作
- 首先先说一下情况,我这边是将同一个应用程序(比如:继续用tomcat)分别部署到两台或者多台服务器上,如下:
所以,我这里准备了两台服务器,分别部署了tomcat9 - 分别为两台服务器开放
8089
端口
由于我这里,8080端口有占用,所以开放8089
端口 - 静态页面 hello.html
分别在下面路径下写静态页面(根据自己的安装路径来)
/home/susu/soft/install/apache-tomcat-9.0.71/webapps/tomact/hello.html
- 启动并检查两台服务运行的tomcat 以及确保静态页面可以访问,如下效果即可:
4.1.3 配置nginx
4.1.3.1 负载均衡核心配置
- 配置如下:
- 配置代码如下:
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 配置负载均衡
upstream tomactServer {
server A服务器IP:8089;
server B服务器IP:8089;
}
server {
listen 9005;
server_name nginx服务器IP;
location /{
proxy_pass http://tomactServer;
}
}
4.1.3.2 配置注意问题
- upstream 后起的服务名参不能有下划线(比如tomact_server不可以,可以用tomact Server),否则报错
如下,错误:
类型 异常报告
消息 The character [_] is never valid in a domain name.
描述 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。
例外情况
java.lang.IllegalArgumentException: The character [_] is never valid in a domain name.
org.apache.tomcat.util.http.parser.HttpParser$DomainParseState.next(HttpParser.java:1029)
org.apache.tomcat.util.http.parser.HttpParser.readHostDomainName(HttpParser.java:912)
org.apache.tomcat.util.http.parser.Host.parse(Host.java:71)
org.apache.tomcat.util.http.parser.Host.parse(Host.java:45)
org.apache.coyote.AbstractProcessor.parseHost(AbstractProcessor.java:298)
org.apache.coyote.http11.Http11Processor.prepareRequest(Http11Processor.java:793)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:375)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:748)
- 淡定
4.1.4 看效果
- 地址栏访问:
http://nginx服务IP:9005/tomact/hello.html
- 每次刷新访问到的真实tomcat服务地址是A、B交替着
- 即实现了下图所要的效果:
4.2 Nginx负载均衡分配策略
- 轮询(默认)
- 默认不配置的话就是轮询策略,比如我们上面的实例,没有配置策略是按轮询策略走的。
- 轮询策略,就是每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
- weight (权重策略)
- weight 代表权重,默认值为1,权重越高背分配的客户端越多。
比如,下面的配置:
# 配置负载均衡
upstream tomactServer {
server A服务器IP:8089 weight=10;
server B服务器IP:8089 weight=20;
}
- ip_hash (IP绑定)
- 每个请求按访问IP的hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
即:如果某用户的客户端第一次访问到的服务器是A服务器,那个他后续访问的都是A服务器。
upstream tomactServer {
ip_hash;
server A服务器IP:8089;
server B服务器IP:8089;
}
- fair(第三方模块的fair)
- 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
即:可以根据页面大小、加载时间的长短,很智能地进行负载均衡
upstream tomactServer {
server A服务器IP:8089;
server B服务器IP:8089;
fair;
}
5. Nginx配置实例实例4——动静分离
- 什么是动静分离?
动静分离指的是将动态请求和静态请求分隔开,然后分别路由到相应的后端服务器。
通常用户的请求中,一部分需要后台程序处理,例如查询数据库或者进行一些数据运算,这类请求我们称之为动态请求;
还有一部分不需要后台程序处理,如请求 html、css、js、图片等静态资源,这类请求我们称之为静态请求。Nginx 实现动静分离的基础是它可以根据配置对不同的请求做不同的转发,动静分离有利于提高整个服务器系统的性能。 - 为什么要动静分离?
拿tomcat 来说,我们当然知道它既可以处理动态资源也可以处理静态资源,但是单节点的tomcat本身处理请求的资源是有限的,如果项目中的动态请求和静态资源都由tomcat来处理的话,可能会遇到tomcat的性能瓶颈问题,所以这样处理不是很合理。所以我们需要用像nginx这样更好的服务器来处理静态资源,这样处理静态资源的能力比Tomcat强很多,同时也能减轻tomcat的处理压力,从而提高整个服务器系统的性能。
5.1 准备静态资源
- 静态资源的位置需要注意,如果用root 用户启动的,尽量放在根目录下就行了,否则可能会因为启动用户和nginx工作用户不一致导致403问题(Nginx 403 forbidden)。
当然你可以参考下面的文章解决:Nginx 403 forbidden 错误的原因及解决方法. - 所以,我这里直接就放根目录下了:
/nginx_test/nginx_web/html/hello_world.html
/nginx_test/nginx_web/images/dog.jpeg
5.2 配置文件
- 配置文件配置如下:
server {
listen 9006;
server_name nginx服务器IP地址;
location /html/ {
root /nginx_test/nginx_web/;
}
location /images/ {
root /nginx_test/nginx_web/;
autoindex on; #nginx开启目录浏览下载功能
}
}
5.3 看效果
- 访问静态页面和静态图片如下:
autoindex on;
代表:nginx开启目录浏览下载功能,效果如下: