本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1.概念
1.1 什么是nginx
NGINX是一个免费的,开源的高性能HTTP服务器和反向代理,以及IMAP / POP3代理服务器。NGINX以其高性能,稳定性,丰富的功能集,简单的配置和低资源消耗而闻名。
2. 特性
2.1反向代理
有反向代理,就有正向代理,正向代理的典型例子就是vpn工具,例如 当访问谷歌的时候,发出的请求www.google.com的这个请求,会被vpn正向代理到代理服务器,再有代理服务器发送到谷歌服务器 如图示
反向代理如图示:
以上面正向代理的例子来说,如果www.google.com这个服务端有一个代理服务器地址是www.googleproxy.com 那么我们如果想要请求www.google.com其实应该访问的是www.googleproxy.com
理解:
正向代理和反向代理中的正向和反向针对的是客户端来说,正向代理指的是代理服务器配置在每一个客户端上,而反向代理针对客户端来说是只有一个的
对比
- 正向代理访问的地址就是真正的服务端地址,反向代理访问的是代理服务器的地址,即反向代理隐藏了真正服务器的地址
- 正向代理服务器每个客户端都有,反向代理是客户端只访问一个(此处不讨论代理服务器集群情况)
2.2 负载均衡
还是这个图为例,当服务端为多节点时,nginx可以提供负载均衡的功能,可以将客户端的请求根据某种规则分发到各个服务端节点上,减轻单节点的压力,nginx的上限与服务器性能有关系
2.3 动静分离
为了提高网站访问速度,可以将静态资源(html,js,img等) 放在单独的静态资源服务器中,而动态资源(jsp,servlet等)放在动态资源服务器中,提高服务器解析速度
2.4 热部署
nginx几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级
2.安装使用
window下直接下载解压
源码编译安装
下载nginx-1.18.0.tar.gz后,上传至linux,再安装以下三个依赖
- 安装gcc
yum install gcc -y
- 安装 pcre-devel
yum install pcre-devel -y
- 安装zlib
yum install zlib-devel -y
编译
make && make install
启动
/usr/local/nginx/sbin/nginx
查询是否启动成功
ps -ef | grep nginx
也可以直接访问 ip地址查看是否跳转到nginx欢迎页面(nginx默认配置监听http 80端口)
如果使用linux系统,需要开放80端口,linux默认防火墙没有开放80端口
查看防火墙开放端口
firewall-cmd --list-ports
增加开放端口 注意80/tcp前不要有空格
firewall-cmd --zone=public --add-port=80/tcp --permanent
关闭开放端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent
开放/关闭端口后,需重启生效
firewall-cmd --reload
2.1 常用命令
2.1.1 windows
#启动
start nginx
#停止
nginx -s stop
#重启
nginx -s reload
2.1.2 linux
配置环境变量 或者进入/usr/local/nginx/sbin/ 目录执行命令
#查看版本
./nginx -v
#启动
./nginx
#停止
./nginx -s stop
#重载
./nginx -s reload
3.配置文件
3.1 配置文件的组成
3.1.1 全局块
配置nginx服务器整体允许的指令,主要包括配置允许Nginx服务器的用户(组),允许生成的 woker process数,进程pid存放路径,日志存放路径和类型以及配置文件的引入等
worker_processes 1; 配置nginx的并发数,越大并发越高(收到服务器硬件限制)
3.1.2 event块
主要配置nginx服务器与用户的网络连接
events {
worker_connections 1024;
}
指定每个work_connections的最大连接数 指定为1024
3.1.3 http块
http块是nginx中配置最频繁的地方,主要功能配置也是在这里配置,如反向代理,负载均衡等功能都是在http块中配置
http块主要还分为两块 http全局块和server块
3.1.3.1 http全局块
包括文件引入,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"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
3.1.3.2 server块
每一个server可以看作是一个虚拟主机
每个server块分为server全局块和location
3.1.3.2.1 server全局块
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
3.1.3.2.2 location
location / {
root html;
index index.html index.htm;
}
根据正则表达式判断转发的路径
3.2 反向代理配置
3.2.1 反向代理配置1 实现转发
实现效果,访问www.123.com/ 转发到linux服务器上的tomcat欢迎页面
3.2.1.1 安装tomcat
- 上传至虚拟机
tar -zvxf apache-tomcat-8.5.58.tar.gz
- 进入解压目录启动
cd bin
./startup.sh
- 开放防火墙8080端口
firewall-cmd --add-port=8080/tcp --permannet
firewall-cmd --reload
3.2.1.2 配置域名映射
将www.123.com映射到192.168.164.210:80 上
修改C:\Windows\System32\drivers\etc\hosts文件
增加一行
192.168.164.210 www.123.com
3.2.1.3 修改nginx配置
当完成第二部就可以通过www.123.com:80访问到nginx的欢迎页面了
所以需要配置nginx,将访问www.123.com的请求反向代理到tomcat的8080端口上
修改nginx.conf配置
server {
listen 80;
server_name 192.168.164.210;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://127.0.0.1:8080/;
root html;
index index.html index.htm;
}
主要是修改server_name,location中增加proxy_pass 表示将192.168.164.210:80端口的请求都转发到127.0.0.1:8080上,也就是tomcat上
3.2.2 反向代理配置2 实现uri动态转发
实现效果:
访问http://192.168.164.210:9001/edu/转发到8081端口
访问http://192.168.164.210:9001/vod/转发到8080端口
3.2.2.1 准备工作
配置两个tomcat,修改端口,一个端口是8080 一个端口是8081
新增一个页面,放到两个tomcat下的webapps目录下(区分是否转发成功)
3.2.2.2 配置nginx
server{
listen 9001;
server_name 192.168.164.210;
location ~ /vod/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /edu/ {
proxy_pass http://127.0.0.1:8081;
}
}
~ 表示使用正则表达式
遇到的一个错误
当使用了正则表达式之后,proxy_pass 里不能再出现uri
3.3 负载均衡配置
3.3.1 简单demo
实现目标: 将http://192.168.164.210:9001/edu/a.html 转发到 8080 和 8081 两台tomcat处理
http块增加如下
upstream myserver{
server 192.168.164.210:8080;
server 192.168.164.210:8081;
}
server块中的location块修改proxy_pass 转发到 上面的upstream
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
3.3.2 负载均衡策略
3.3.2.1 轮询
默认策略 一个服务器访问一次
3.3.2.2 权重
upstream myserver{
server 192.168.164.210:8080 weight=10;
server 192.168.164.210:8081 weight=20;
}
转发到8080的请求会比转发到8081的少一杯
计算方式是 10 / (10+20)
3.3.2.3 ip_hash
会根据ip来决定下一次转发到的服务器
如果第一次转发到8080,那么当前ip客户端之后的所有请求都会分发的8080处理;
3.3.2.4 fair
第三方模块 需要安装
根据服务器的响应时间来选择,响应时间越短,越容易被转发
3.3.2.5 url_hash
第三方模块 需要安装
根据访问的url来决定下一次转发到的服务器
如果第一次转发到8080,那么之后这个请求会被一直转发到8080
3.4 动静分离配置
动静分离指的是将动态请求和静态请求分离开,通过nginx将动态请求转发到动态请求服务器上(例如tomcat) 将静态请求转发到静态资源服务器上
主要的实现方式有两种
- 将静态资源部署到单独的静态资源服务器上,通过nginx转发到对应的服务器
- 将静态资源与动态资源混合发布,通过nginx区分不同的请求,再进行转发
3.4.1 配置demo
server {
listen 80;
server_name 192.168.164.210;
charset utf-8;
#access_log logs/host.access.log main;
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
location /www/ {
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
autoindex on;
index index.html index.htm;
}
主要就是修改了location块下,root目录,将对应location的请求转发到对应的目录下
autoindex 开启一个列表
3.4.2 autoinde中文乱码问题
修改server块 charset 为utf-8
4.集群
建立主备服务器
使用keepalived 虚拟ip 完成主备服务器
5.原理
模型是 master + worker
当请求进入,首先先到master.再由master分发给worker