Nginx
第一章 介绍
是什么:Nginx ("engine x") 是一个高性能的 HTTP 和反向代理 WEB 服务器。 能干什么:反向代理、负载均衡、动静分离 牛逼之处:高性能,高负载。有报告表明能支持高达 50,000 个并发连接数 详细说明:https://lnmp.org/nginx.html
官方资料
官网:https://nginx.org/ 文档:https://nginx.org/en/docs/
第二章 核心功能
正向代理
如果我们要访问 www.google.com 但是直接访问不到,则需要通过代理服 务器来访问,这种代理服务就称为正向代理。
反向代理
客户端将请求发送到代理服务器,由代理服务器去选择目标服务器获取数据后,返回给客户端,这种代理方式为反向代理。 反向代理:屏蔽内网服务器信息,负载均衡访问。
1. 项目设计者, 不希望客户端直接访问目标 Web 服务器(比如目标 Web 服务器是集群, 如 果直接访问就会提供多个公网 IP), 而是希望提供一个统一的访问 IP, 这个是理解反向代理的前提,即为什么要反向代理
2. 反向代理帮助的对象是目标 Web 服务器
3. 当客户端请求达到反向代理服务后,由反向代理服务来决定如何访问目标 Web 服务器 (或者是哪个 Web 服务器), 这个过程对客户端是透明的
4. 反向代理服务会暴露公共的 IP, 只要能上网,就可以访问,但是对于反向代理服务器管理的/代理的 Web 服务器通常是在局域网内,不能直接访问,只能通过反向代理来访问
5. 我们可以将 反向代理服务+反向代理服务代理的 Web 服务器 视为一个整体
6. 反向代理会屏蔽 内网服务器(也就是他代理的服务)信息, 并实现负载均衡访问
负载均衡
当客户端向反向代理服务器(比如 Nginx)发出请求,如果 Nginx 代理了多个 WEB 服务器(集群),Nginx 会将请求/负载分发到不同的服务器,也就是负载均衡。
动静分离
为了加快网站的解析速度,可以把动态资源和静态资源由不同的服务器来 解析,降低单个服务器的压力。
第三章 Nginx 下载&安装&启动
下载
下载地址:https://nginx.org/en/download.html 版本:nginx-1.20.2.tar.gz
安装
安装Linux,并且配置好网络
安装步骤
- 搭建 gcc 环境
yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
执行上面指令的时候, 可能会报 Centos Another app is currently holding the yum lock..错误, 是因为 yum 不时会自动升级, 占用了端口或文件, 解决方案
(1)可以重启 Linux, 立即执行该指令
(2)或者等一会再执行
(3)或者参考 https://www.cnblogs.com/lzxianren/p/4254059.html
- 将 nginx-1.20.2.tar.gz 上传到 Linux /opt 目录
切换到/opt 目录, 解压 nginx-1.20.2.tar.gz
tar -zxvf nginx-1.20.2.tar.gz
- 将解压后的文件放到指定位置
mv nginx-1.20.2 /usr/local/nginx
- 进入文件目录
cd /usr/local/nginx
- 配置 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 --conf-path=/usr/local/nginx/nginx.conf
- 补全 nginx 配置目录
mkdir /var/temp/nginx -p
- 编译并安装
make && make install
- 测试配置与 nginx 是否正常,当出现 successful 即可
./sbin/nginx -t
======================
nginx: the configuration file /usr/local/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/nginx.conf test is successful
- 启动 nginx
./sbin/nginx -c nginx.conf
- 查看进程/或端口(默认端口是 80)
ps -ef | grep nginx
启动 Nginx 可能的错误和解决方案
解决 nginx 启动报错 nginx: [emerg] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)
验证是否安装成功
nginx 默认监听端口 80,出现 Welcome to nginx!该页面就是搞定了。
配置防火墙
让 Windows 访问 Nginx 默认情况下 Windows 是不能访问 Nginx , 因为防火墙是关闭 80 端口的
查看开放的端口号
firewall-cmd --list-all
设置开放的端口号
#firewall-cmd --add-service=http --permanent #增加了一个 http 服务,理解
firewall-cmd --add-port=80/tcp --permanent
重启防火墙
firewall-cmd --reload
然后Windows下访问测试
第四章 Nginx 命令行参数
地址
https://nginx.org/en/docs/switches.html
启动 /usr/local/nginx/sbin/nginx -c nginx.conf
停止 /usr/local/nginx/sbin/nginx -s stop
重新加载(不需要重启) /usr/local/nginx/sbin/nginx -s reload
查看版本 /usr/local/nginx/sbin/nginx -v
查看版本、配置参数 /usr/local/nginx/sbin/nginx -V
第五章 nginx.conf 配置文件
基本说明
Nginx 的配置文件位置
文件位置
- 安装目录\conf\nginx.conf
- 安装目录\nginx.conf
使用 /usr/local/nginx/sbin/nginx 启动 Nginx ,默认用的是 安装目录 \nginx.conf 配置文件
作用
完成对 Nginx 的各种配置,包括端口,并发数,重写规则等
组成
全局块、events 块、http 块
nginx.conf 详细文档
https://blog.csdn.net/liuchang19950703/article/details/110792007
#Nginx用户及组:用户 组。window下不指定
#user nobody;
#工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。
worker_processes 1;
#错误日志:存放路径。
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid(进程标识符):存放路径
pid /usr/local/nginx/logs/nginx.pid;
#一个进程能打开的文件描述符最大值,理论上该值因该是最多能打开的文件数除以进程数。
#但是由于nginx负载并不是完全均衡的,所以这个值最好等于最多能打开的文件数。
#LINUX系统可以执行 sysctl -a | grep fs.file 可以看到linux文件描述符。
worker_rlimit_nofile 65535;
events {
#使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 1024;
#客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,
#一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
#client_header_buffer_size 4k;
}
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#日志格式设置
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径
#记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息
#access_log logs/host.access.log main;
#access_log logs/host.access.404.log log404;
#服务器名字的hash表大小
server_names_hash_bucket_size 128;
#客户端请求头缓冲大小。
#nginx默认会用client_header_buffer_size这个buffer来读取header值,
#如果header过大,它会使用large_client_header_buffers来读取。
#如果设置过小HTTP头/Cookie过大 会报400 错误 nginx 400 bad request
#如果超过buffer,就会报HTTP 414错误(URI Too Long)
#nginx接受最长的HTTP头部大小必须比其中一个buffer大
#否则就会报400的HTTP错误(Bad Request)
#client_header_buffer_size 32k;
#large_client_header_buffers 4 32k;
#隐藏ngnix版本号
#server_tokens off;
#忽略不合法的请求头
#ignore_invalid_headers on;
#让 nginx 在处理自己内部重定向时不默认使用 server_name设置中的第一个域名
#server_name_in_redirect off;
#客户端请求体的大小
#client_body_buffer_size 8m;
#开启文件传输,一般应用都应设置为on;若是有下载的应用,则可以设置成off来平衡网络I/O和磁盘的I/O来降低系统负载
sendfile on;
#告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。
#tcp_nopush on;
#tcp_nodelay off 会增加通信的延时,但是会提高带宽利用率。在高延时、数据量大的通信场景中应该会有不错的效果
#tcp_nodelay on,会增加小包的数量,但是可以提高响应速度。在及时性高的通信场景中应该会有不错的效果
tcp_nodelay on;
#长连接超时时间,单位是秒
keepalive_timeout 65;
#gzip模块设置,使用 gzip 压缩可以降低网站带宽消耗,同时提升访问速度。
#gzip on; #开启gzip
#gzip_min_length 1k; #最小压缩大小
#gzip_buffers 4 16k; #压缩缓冲区
#gzip_http_version 1.0; #压缩版本
#gzip_comp_level 2; #压缩等级
#gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss;#压缩类型
#负载均衡
#max_fails为允许请求失败的次数,默认为1
#weight为轮询权重,根据不同的权重分配可以用来平衡服务器的访问率。
# upstream myServer{
# server 192.168.247.129:8080 max_fails=3 weight=2;
# server 192.168.247.129:8081 max_fails=3 weight=4;
# }
#server {
# listen 80;
#
# #IP/域名可以有多个,用空格隔开
# server_name 192.168.247.129;
# #server_name www.test.com;
#
# #charset koi8-r;
#
# #access_log logs/host.access.log main;
#
# #反向代理配置,
# #将所有请求为www.test.com的请求全部转发到upstream中定义的目标服务器中。
# location / {
#
# #此处配置的域名必须与upstream的域名一致,才能转发。
# proxy_pass http://myServer;
# #proxy_pass http://192.168.247.129:8080;
#
# proxy_connect_timeout 20; #nginx跟后端服务器连接超时时间(代理连接超时)
#
# #client_max_body_size 10m; #允许客户端请求的最大单文件字节数
# #client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
# #proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时)
# #proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时)
# #proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
# #proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
# #proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
# #proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
#
# root html;
#
# #定义首页索引文件的名称
# index index.html index.htm;
# }
#
# #动静分离 静态资源走linux 动态资源走tomcat
# # 注意 /source/image/下面寻找资源
# location /image/ {
# root /source/;
# autoindex on;
# }
#
#
# # 出现50x错误时,使用/50x.html页返回给客户端
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# root html;
# }
#}
#下面是配置生产环境中既支持HTTP又支持HTTPS,保证用户在浏览器中输入HTTP也能正常访问
# SSL证书 配置
ssl_certificate cert/yphtoy.com.pem; #加密证书路径
ssl_certificate_key cert/yphtoy.com.key; #加密私钥路径
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #加密协议
ssl_session_cache shared:SSL:1m; #加密访问缓存设置,可以大大提高访问速度
ssl_session_timeout 10m; #加密访问缓存过期时间
ssl_ciphers HIGH:!aNULL:!MD5; #加密算法
ssl_prefer_server_ciphers on; #是否由服务器决定采用哪种加密算法
# 负载均衡
upstream api_upstream
{
server 127.0.0.1:8080 max_fails=3 weight=1;
server 127.0.0.1:8081 max_fails=3 weight=1;
}
#api 接口(兼容HTTP)
server{
listen 80;
server_name api.test.com;
# 301重定向跳转到HTTPS接口
return 301 https://$server_name$request_uri;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#api 接口(兼容HTTPS)
server{
listen 443 ssl;
server_name api.test.com;
location / {
root html;
index index.html index.htm;
proxy_pass http://api_upstream;
#语法: proxy_cookie_path oldpath replacepath;
#oldpath就是你要替换的路径 replacepath 就是要替换的值
#作用:同一个web服务器下面多个应用之间能获取到cookie
proxy_cookie_path /api/ /;
#服务端接收的请求头Cooke值不变
proxy_set_header Cookie $http_cookie;
}
}
#管理后台端(兼容HTTP)
server{
listen 80;
server_name manage.test.com;
# 301重定向跳转到HTTPS接口
return 301 https://$server_name/$request_uri;
error_page 500 502 503 504 /50x.html;
location = /50x.html{
root html
}
}
#管理后台端(兼容HTTPS)
server{
listen 443 ssl;
server_name manage.test.com;
location / {
root /home/test/web/dist
index /index.html;
#语法:try_files 【$uri】 【 $uri/】 【参数】
#当用户请求https://manage.test.com/login时,
#一.如果配置了上面的默认index,会依次请求
#1./home/test/web/dist/login 查找有没有login这个文件,没有的话
#2./home/test/web/dist/index.html 有就直接返回
#二.如果没有配置了上面的默认index或者配置了没有找到对应的资源,会依次请求
#1./home/test/web/dist/login 查找有没有login这个文件,没有的话
#2./home/test/web/dist/login/ 查找有没有login这个目录,没有的话
#3.请求https://manage.test.com/index.html nginx内部做了一个子请求
#三.总的来说,index的优先级比try_files高,请求会先去找index配置,这里最后一个参数必须存在
try_files $uri $uri/ /index.html;
#解决跨域问题
#允许跨域请求地址(*表示全部,但是无法满足带cookie请求,因为cookie只能在当前域请求)
add_header Access-Control-Allow-Origin $http_origin;
#允许接收cookie和发送cookie
add_header Access-Control-Allow-Credentials 'true';
#允许请求的方法
add_header Access-Control-Allow-Methods 'GET,POST,DELETE,PUT,OPTIONS';
#允许请求头(Content-Type:请求数据/媒体类型 x-requested-with:判断请求是异步还是同步 自定义header 比如 token)
add_header Access-Control-Allow-Headers $http_access_control_request_headers;
#浏览器缓存请求头信息,1800秒内,只会有1次请求,不会出现"OPTIONS"预请求,节约资源
#add_header Access-Control-Max-Age '1800';
if ($request_method = 'OPTIONS') {
return 204;
}
#服务端HttpServletRequest可以获得用户的真实ip
proxy_set_header X-Real-IP $remote_addr;
#服务端HttpServletRequest可以获得用户的真实ip和经过的每一层代理服务器的ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#服务端接收的请求头Host值不变
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
}
}
}
nginx.conf 讲解

全局块
说明
- 从配置文件开始到 events 块之间的内容
- 主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径 和类型以及配置文件的引入等
简单分析
1、这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持 的并发处理量也越多,但是会受到硬件、软件等设备的制约 2、配置举例
worker_processes 1;
events 块
说明
- events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接
- 常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同 时支持的最大连接数等
简单分析
1、上述例子就表示每个 work process 支持的最大连接数为 1024, 这部分的配置对 Nginx 的性能影响较大,在实际中应根据实际情况配置 2、配置举例
events {
worker_connections 1024;
}
http 块
说明
- 这是 Nginx 服务器配置中最复杂的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里
- http 块也可以包括 http 全局块、server 块
http 全局块
1、http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单连接请求数上限等 2、配置举例
http {
include mime.types;
default_type application/octet-stream;
#开启文件传输 sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
}
server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全 一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块。
(1)全局 server 块 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。 (2)location 块 一个 server 块可以配置多个 location 块
小结 : 这块的主要作用是基于 Nginx 服务器接收到的请求字符串( 例 如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名) 之外的字符串(例如 前面 的 /uri-string)进行匹配,对特定的请求进行处理。比如地址定向、数据缓存和应答控制 等功能,还有许多第三方模块的配置也在这里进行。
第六章 反向代理-快速入门
需求说明/图解
(1)在浏览器输入 www.lzw.com(windows), 可以访问到 tomcat (2)使用 Nginx 反向代理功能, 完成需求
反向代理配置-思路分析/图解
思路分析示意图
实现步骤
- 安装 JDK,8以上;安装tomcat
- 修改 C:\Windows\System32\drivers\etc\hosts 配置虚拟主机名
192.168.10.8 www.lzw.com
- 修改 安装目录\nginx.conf
image-20221107093905900.png
重启 或者 重新加载 Nginx
小技巧
如何查看 nginx.conf 的配置错误
- nginx -t #检测默认配置文件

- nginx -t -c 配置文件 #指定检测配置文件

注意事项和细节
Nginx 对外提供访问入口,充当反向代理服务器,Tomcat 的端口就无需对外暴露-测试一把
开启和关闭防火墙的端口
- 以 8080 端口为例,关闭 8080 端口
firewall-cmd --remove-port=8080/tcp --permanent
firewall-cmd --reload
- 以 8080 端口为例,开放 8080 端口
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
- 查看防火墙状态
firewall-cmd --list-all
第七章 反向代理配置-Location实例
需求说明
效果示意图
反向代理配置-思路分析/图解

Location 语法规则
Location规则
语法规则: location [=||*|^~] /uri/ {… } 首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
符号 | 含义 |
---|---|
= | = 开头表示精确匹配 |
^~ | ^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格) |
~ | ~ 开头表示区分大小写的正则匹配 |
~* | ~* 开头表示不区分大小写的正则匹配 |
!和!* | !和!*分别为区分大小写不匹配及不区分大小写不匹配的正则 |
/ | 用户所使用的代理(一般为浏览器) |
$http_x_forwarded_for | 可以记录客户端IP,通过代理服务器来记录客户端的ip地址 |
$http_referer | 可以记录用户是从哪个链接访问过来的 |
匹配规则示例:
location = / {
\#规则A
}
location = /login {
\#规则B
}
location ^~ /static/ {
\#规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
\#规则D
}
location ~* \.(gif|jpg|png|js|css)$ {
\#规则E
}
location !~ \.xhtml$ {
\#规则F
}
location !~* \.xhtml$ {
\#规则G
}
location / {
\#规则H
}
那么产生的效果如下:
- 访问根目录/,比如http://localhost/将匹配规则A
- 访问 http://localhost/login 将匹配规则B,http://localhost/register则匹配规则H
- 访问 http://localhost/static/a.html 将匹配规则C
- 访问 http://localhost/a.gif,http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而http://localhost/static/c.png则优先匹配到规则C
- 访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。
- 访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
- 访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(PHP),tomcat(jsp),nginx作为反向代理服务器存在。
实际常用规则
直接匹配网站根目录,通过域名访问网站首页比较频繁,使用这个会加速处理。 这里是直接转发给后端应用服务器了,也可以是一个静态首页 第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
\# 请求/static/a.txt 将被映射到实际目录文件:/webroot/res/static/a.txt
root /webroot/res/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|html|ico)${
root /webroot/res/;
}
第三个规则就是通用规则,用来转发动态请求到后端应用服务器 非静态文件请求就默认是动态请求,自己根据实际把握 毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
proxy_pass http://tomcat:8080/
}
Location解析过程
1、 先判断精准命中,如果命中,立即返回结果并结束解析过程。 2、 判断普通命中,如果有多个命中,“记录”下来“最长”的命中结果(记录但不结束,最长的为准)[一会还要梳理]。 3、 继续判断正则表达式的解析结果,按配置里的正则表达式顺序为准,由上至下开始匹配,一旦匹配成功1个,立即返回结果,并结束解析过程。 4、 普通命中顺序无所谓,是因为按命中的长短来确定。正则命中,顺序有所谓,因为是从前往后命中的。
解读nginx 的 location 解析过程
参考:https://blog.huati365.com/89af5ae5a56d1b96 location指令语法nginx的location指令配置语法如下: 说明: =:表示精准匹配:表示正则匹配(区分大小写)*:表示正则匹配(不区分大小写)~:表示普通匹配完成后不使用正则匹配(可以看完下面匹配顺序之后再来理解)uri之前不包含=、~、~*、~时为普通匹配location指令可以嵌套,所以可以出现在server指令内部和location指令内部。 location匹配规则nginx为了找到匹配请求的location,搜索匹配规则如下: 判断是否精准匹配,如果匹配,直接返回结果并结束搜索匹配过程。判断是否普通匹配,如果匹配,看是否包含^~前缀,包含则返回,否则记录匹配结果,(如果匹配到过个location时返回或记录最长匹配的那个)判断是否正则匹配,按配置文件里的正则表达式的顺序,由上到下开始匹配,一旦匹配成功,直接返回结果,并结束搜索匹配过程。如果正则匹配没有匹配到结果,则返回步骤2记录的匹配结果。 注: 多个普通匹配的location时,和location的顺序无关,总是匹配所有的location,然后取匹配最长的location作为结果多个正则匹配的location时,和顺序有关,从上到下依次匹配,一旦匹配成功便结束,直接返回结果。
实现步骤
修改 C:\Windows\System32\drivers\etc\hosts 配置虚拟主机名

修改 安装目录\nginx.conf

server {
listen 10000;
server_name 192.168.10.8;
location ~ /product/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /member/ {
proxy_pass http://192.168.10.1:8080;
}
}
在 Linux 的 Tomcat 创建 webapps\product\hi.html

<h1>hi.html product linux tomcat service </h1>
在 windows 的 Tomcat 创建 webapps\member\hi.html

<h1>hi.html member windows tomcat service </h1>
linux 防火墙打开 10000 端口
保证 linux 可以访问 Windows Tomcat 【即:可以访问 Windows 的 8080 端口, 可暂时关闭 windows 防火墙,测完恢复】
完成测试
确保启动 Linux 下的 Tomcat
netstat -anp | more
确保启动 Windows 下的 Tomcat
打开D:\Environment\apache-tomcat-8.0.50\bin\startup.bat
重启 或者 重新加载 Nginx
./sbin/nginx -s reload windows 浏览器输入[注意带上端口]: http://www.lzwmall.com:10000/product/hi.htmlhttp://www.lzwmall.com:10000/member/hi.html
第八章 负载均衡-配置实例
需求说明
负载均衡配置-思路分析/图解

负载均衡配置规则
- 负载均衡就是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快
- linux 下有 Nginx、LVS、Haproxy 等等服务可以提供负载均衡服务, Nginx 提供了几种分配方式(策略):
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除
weight
weight 代表权,重默认为 1,权重越高被分配的客户端越多
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如
upstream lzwservers{
server 192.168.10.8:8080 weight=1;
server 192.168.10.8:8081 weight=2;
}
ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决session 的问题。例如
upstream lzwservers{
ip_hash;
server 192.168.10.8:8081;
server 192.168.10.8:8080;
}
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream lzwservers{
server 192.168.10.8:8081;
server 192.168.10.8:8080;
fair;
}
实现步骤
修改hosts映射
C:\Windows\System32\drivers\etc\hosts 配置虚拟主机名
192.168.10.8 www.lzwcrm.com

修改 安装目录\nginx.conf
upstream lzwservers {
server 192.168.10.8:8080;
server 192.168.10.8:8081;
}
server {
listen 80;
#server_name localhost;
server_name 192.168.10.8;
#charset koi8-r;
#access_log logs/host.access.log main;
location /search/ {
root html;
#proxy_pass http://127.0.0.1:8080;
proxy_pass http://lzwservers;
index index.html index.htm;
}

在 Linux 的 Tomcat8080 创建 webapps\search\look.html
cd /opt/tomcat/apache-tomcat-8.5.59/webapps/serach
[root@nginx serach]# ls
[root@nginx serach]# vi look.html
'''文件中内容
<h1>search.. tomcat 8080 service</h1>
'''
[root@nginx tomcat]# pwd
/opt/tomcat
[root@nginx tomcat]# cp -rf ./apache-tomcat-8.5.59 ./apache-tomcat-8.5.59new
[root@nginx serach]# pwd
/opt/tomcat/apache-tomcat-8.5.59new/webapps/serach
[root@nginx serach]# vi look.html
'''文件中内容
<h1>search.. tomcat 8081 service</h1>
'''
在 Linux 下重新安装一份 Tomcat, 并将端口修改成 8081
仔细!!!(不同版本的 tomcat 修改的端口还不一样,修改3个端口)
[root@nginx apache-tomcat-8.5.59new]# cd conf/
[root@nginx conf]# pwd
/opt/tomcat/apache-tomcat-8.5.59new/conf
[root@nginx conf]# ls
Catalina context.xml logging.properties tomcat-users.xsd
catalina.policy jaspic-providers.xml server.xml web.xml
catalina.properties jaspic-providers.xsd tomcat-users.xml
[root@nginx conf]# vim server.xml
linux 防火墙打开 80 端口, 保证外网可以访问
[root@nginx conf]# firewall-cmd --list-all
完成测试
启动 Linux 下两个 Tomcat
1、查看启动的端口, 确保有 8080 和 8081 端口在监听(如果 tomcat 没有监听对应端口, 说明启动失败了, 可以尝试先执行 shutdown.sh 再执行 startup.sh 解决)
[root@nginx bin]# pwd
/opt/tomcat/apache-tomcat-8.5.59/bin
[root@nginx bin]# ./startup.sh
[root@nginx bin]# pwd
/opt/tomcat/apache-tomcat-8.5.59new/bin
[root@nginx bin]# ./startup.sh
[root@nginx bin]# netstat -an | more
2、在 linux 下可以正常访问到两个页面 前面文件夹写成了 serach,改成serach
启动或者重新加载 Nginx
[root@nginx nginx]# ./sbin/nginx -s reload
[root@nginx nginx]# netstat -anp | more
注意事项和避免的坑
- nginx.conf 的 upstream 不能带下划线, 否则会失败, 但是语法检测不到

- 如果你的浏览器是无痕上网, 负载均衡可能失效, 因为 Nginx 无法采集到相关信息
- 如果某 tomcat 没有监听对应端口, 说明启动失败了, 可以尝试先执行shutdown.sh 再执行 startup.sh 解决
几个小实现-多测试
文档: Nginx 的 upstream 配置技巧 https://zhuanlan.zhihu.com/p/409693332 Nginx 是一个反向代理软件,大部分的网站都采用 Nginx 作为网站/平台的服务器软件。Nginx 除了可以直接作为 web 服务器使用外,更多的情况是通过反向代理将请求转发给上游服务器 配置上游服务器可以使用 upstream 进行设置,通过 upstream 可以实现服务的负载均衡规则,可以提高服务器的高可用性。
第九章 动静分离-应用实例
什么是动静分离
- Nginx 动静分离简单来说就是把动态跟静态请求分开,可以理解成使用 Nginx 处理静态页面/资源,Tomcat 处理动态页面/资源。
- 动静分离可以减轻 Tomcat 压力,静态请求由 Nginx 处理,提供系统整体性能.

需求说明

动静配置-思路分析/图解

先使用传统方式实现
创建tomcat\webapps\search\cal.jsp [为了测试方便, 在tomcat2也对应创建一份]
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<img src="image/cal.jpg"/>
<h1>JSP, 计算器 8080</h1>
<%
int i = 20;
int j = 70;
int res = i + j;
out.println(i + " + " + j + " = " + res);
%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<img src="image/cal.jpg"/>
<h1>JSP, 计算器 8081</h1>
<%
int i = 20;
int j = 70;
int res = i + j;
out.println(i + " + " + j + " = " + res);
%>
</body>
</html>
[root@nginx search]# pwd
/opt/tomcat/apache-tomcat-8.5.59/webapps/search
[root@nginx search]# vim cal.jsp
[root@nginx search]# mkdir image
[root@nginx search]# ls
cal.jsp image look.html
拷贝 cal.jpg 到 tomcat\webapps\search\image 目录, [为了测试方便, 在tomcat2 也对应创建一份] 浏览器访问 http://www.lzwcrm.com/search/cal.jsp就可以看到正确界面
动静分离优化步骤
修改 安装目录\nginx.conf
location /search/image/ {
root /usr/local/nginx/html;
}
/usr/local/nginx/html可以写成 html
创建 /usr/local/nginx/html/search/image 目录
因为图片路径其实是 ip/search/image
将 Linux 的两个 Tomcat\webapps\search\image 目录删除
在/usr/local/nginx/html/search/image 目录下放入图片
[root@nginx image]# pwd
/usr/local/nginx/html/search/image
[root@nginx image]# ls
cal.jpg
linux 防火墙打开 80 端口, 保证外网可以访问 启动 或者 重新加载 nginx
[root@nginx nginx]# ./sbin/nginx -s reload
完成测试
浏览器访问 http://www.lzwcrm.com/search/cal.jsp
- 这时图片就是从 Nginx 直接返回的
- 而请求 cal.jsp 才转发到对应 tomcat 完成