1、入门
1.1、什么是Nginx?
- 高性能的HTTP和反向代理的web服务器
- 支持热部署,数个月不间断运行
- 占有内存少,并发能力强
- 专为性能优化而开发非常注重效率,能经受高负载的考验
- 有报告表明能支持高达5w的并发数
1.2、反向代理
正向代理:
- Nginx不仅可以做反向代理实现负载均衡,还能做正向代理进行上网等功能。
- 如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器,这种代理服务称为正向代理
反向代理:
- 客户端对代理无感知的,因为客户端不需要任何配置就可以访问
- 我们只需将请求发送到反向代理服务器,由ta去选择目标服务器获取数据后,返回给客户端
- 此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理的地址,隐藏真实服务器的IP
1.3、负载均衡
有多个真实服务器,请求会先经过代理服务器,然后由某种算法合理分配到其中的一个。
1.4、动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器解析,降低当服务器的压力
2、使用
2.1、安装
环境要求:
- pcre-8.37.tar.gz
- openssl-1.0.1t.tar.gz
- zlib-1.2.8.tar.gz
- nginx-1.11.1.tar.gz
Nginx中文官网:https://www.nginx.cn/install
Docker安装nginx
随便启动一个nginx实例,复制出配置
docker run -p 80:80 --name nginx -d nginx:1.10
将容器内的配置文件拷贝到当前目录
docker container cp nginx:/etc/nginx .
修改文件名称
mv nginx conf
将conf移动到/mydata/nginx
终止原容器
docker stop nginx
docker rm ContainerId
进入/mydata/nginx/html/
vim fenci.txt
自定义词汇
vim /mydata/elasticsearch/plugins/config/ik/config/IKanalyzer.cfg.xml
扩展字典地址修改为http://ip/es/fenci.txt
创建新的nginx
docker run -p 80:80 \
--name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10
2.2、常用命令
- 查看版本号:
./nginx -v
- 停止服务:
./nginx -s stop
- 开启服务:
./nginx
- 查看是否开启:
ps -ef | grep nginx
- 重加载服务:./nginx -s reload
2.3、nginx.conf
- nginx的配置文件
- 分为三部分:
- 全局
- events块
- http块
全局块
- 主要设置一些影响nginx整体运行的指令
- 主要包括:
- 用户组
- 允许生成的workere process数
- 进程PID存放路径
- 日志路径和类型
- 配置文件的引入等
- worker_processes
- 值越大,能处理的并发量越多
- 会受到硬件和软件等设备的约束
events块:
- 主要配置Nginx与用户的网络连接的指令
- 主要包括:
- 是否开启对多
- work process下的网络连接进行序列化
- 是否允许同时接收多个网络连接
- 选取哪种事件驱动模型来处理连接请求
- 每个work proess可以同时支持的最大连接数
- worker_connnections:每个work process支持的最大连接数
http块:
-
包括
http全局
块和server
块 -
http全局块指令:
- 文件引入
- MIME-TYPE定义
- 日志自定义
- 连接超时时间
- 单链接请求数上限等
-
server块:
- 与虚拟主机密切相关
- 虚拟主机从用户角度看,与一台独立硬件主机完全一样,该技术的产生是为了节省互联网服务器硬件成本
- http块可包括多个server块,而每个server块据相当于一个虚拟主机
- 每个server块分为
全局server块
以及多个location块
- 全局server块:
- 本主机的监听配置和名称或IP配置
- location块
- 主要作用是基于Nginx服务器接收到的请求字符串(例如server_name/uri-string),对虚拟主机名称(也能使IP别名)之外的字符串(例如/uri-string)进行匹配
- 对特定的请求进行处理
- 地址定向
- 数据缓存
- 应答控制
- 第三方模块的配置
2.4、反向代理
假设有三个域名:
- www.test1.com
- www.test2.com
- www.test3.com
nginx.conf配置:
server{
listen 80;
server_name www.test1.com;
location / {
root html;
proxy_pass http://ip:端口1; #转发到此端口1
index index.html index.htm;
}
}
server{
listen 80;
server_name www.test2.com;
location / {
root html;
proxy_pass http://ip:端口2; #转发到此端口2
index index.html index.htm;
}
}
server{
listen 80;
server_name www.test3.com;
location / {
root html;
proxy_pass http://ip:端口3; #转发到端口3
index index.html index.htm;
}
}
2.5、负载均衡
nginx.conf:
server{
listen 80;
server_name ip;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
}
分配策略:
-
轮询(默认):
-
每个请求按照时间顺序逐一分配到不同的服务器,若服务器down掉,自动剔除
-
upstram myserver{ server ip:8080; server ip:8081; }
-
-
weight:
-
权重,默认为1,权重越高被分配的请求越多
-
指定轮询几率,用于性能不均的情况
-
upstram myserver{ server ip:8080 weight=5; server ip:8081 weight=10; }
-
-
ip_hash:
-
每个请求按访问ip的hash分配
-
每个客户固定访问一个服务器
-
可以解决session共享问题
-
upstram myserver{ ip_hash; server ip:8081; server ip:8081; }
-
-
fair(第三方):
-
按后端服务器的响应时间来分配
-
时间短的优先分配
-
upstream myserver{ server ip:8080; server ip:8081; fair; }
-
2.7、动静分离
动静分离有两种方式:
-
一种是动静放在不同服务器,也是目前主流的方案
-
第二种是动静混合,通过nginx分开,指定location不同的后缀实现不同的转发。设置expires参数,可以使浏览器缓存过期时间。也就是说无需服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外流量。此方法适合经常变动的资源。值为3d表示缓存3天,每次发送请求对比该文件的最后更新时间,若无变化则不会抓取,返回304,若修改,直接重新下载,返回200;
有两个文件
/data/image/a.jpg
/data/www/b.html
nginx.conf配置:
server{
listen 80;
server_name ip;
location /www/ {
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
autoindex on;# 它的作用为当访问这个路径时,显示文件
}
}
2.8、高可用集群
-
需要两台nginx服务器
112.124.32.136
121.40.40.202
-
需要keepalived
#ubantu sudo apt install keepalived -y
-
需要虚拟ip