Nginx 特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求。
一、Nginx简介
1.1 Nginx应用场景
- HTTP服务器:Nginx 本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用 Nginx 来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。
- FTP 服务器:FTP 服务器,通常会提供一个上传的功能,其他应用如果需要静态资源就从该静态服务器中获取。
- 反向代理:反向代理 (Reverse Proxy) 方式是指以代理服务器来接受 inter*** 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 inter*** 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
- 负载均衡:负载均衡也是 Nginx 常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如 Web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
1.2 Nginx优点
- 高并发支持:单机能够支持 10W + 的并发连接 (取决于内存大小,极限能够到百万),那么在实际生产中也是非常能接近这个数字的,这主要得益于 nginx 在 linux 环境下使用了 epollIO 多路复用模型。
- 内存消耗低:在同类型 web 服务中,nginx 比 apache 占用的内存资源更少,在一般情况下 10K 非活跃的 HTTP Keep-Alive 连接在 nginx 中仅消耗 2.5M 内存。
- 高扩展性:低耦合的模块设计,并且有丰富的第三方模块支持。
- 高可靠性:经过十几年各种复杂场景和各大公司的生产环境验证,并且 nginx 的架构是由 master 进程和 worker 进程组成的,如果 worker 进程出现问题,那么 master 进程可以快速开启一个新的 worker 进程提供服务。
1.3 正向代理与反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受inter***上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给inter***上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;
正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。
综上所述:正向代理代理对象是客户端,反向代理代理对象是服务端。
二、Nginx环境搭建
免费开源版的官方网站:
http://nginx.org
2.1 下载安装
2.1.1 安装前的库
// g***编译器是否安装
检查是否安装:yum list installed | grep g***
执行安装:yum install g*** -y
// openssl库是否安装
检查是否安装:yum list installed | grep openssl
执行安装:yum install openssl openssl-devel -y
// pcre库是否安装
检查是否安装:yum list installed | grep pcre
执行安装:yum install pcre pcre-devel -y
// zlib库是否安装
检查是否安装:yum list installed | grep zlib
执行安装:yum install zlib zlib-devel -y
2.1.2 正式安装
2.2 启动
2.2.1 普通启动
切换到nginx安装目录的sbin目录下,执行:./nginx
2.2.2 配置文件启动
./nginx -c /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
其中-c是指定配置文件,而且配置文件路径必须指定绝对路径
2.2.3 检查nginx是否启动
ps -ef | grep nginx
nginx 体系结构由 master 进程和其 worker 进程组成;
master 进程读取配置文件,并维护 worker 进程,而 worker 进程则对请求进行实际处理;
2.3 关闭
2.3.1 优雅关闭Nginx
找出nginx的进程号:ps -ef | grep nginx
执行命令:kill -QUIT 主pid
2.3.2 快速关闭
找出nginx的进程号:ps -ef | grep nginx
kill -TERM 主pid
- 其中pid是主进程号的pid(master process),其他为子进程pid(worker process);
- 这种关闭方式不管请求是否处理完成,直接关闭,比较暴力,称之为快速的关闭;
2.3.3 查看nginx版本
Linux上查看nginx版本:/usr/local/nginx/sbin/nginx -V
-v (小写的v)显示 nginx 的版本
-V (大写的V)显示 nginx 的版本、编译器版本和配置参数
2.4 Nginx核心配置文件
2.4.1 基本配置
配置 worker 进程运行用户 nobody 也是一个 linux 用户,一般用于启动程序,没有密码
user nobody;
配置工作进程数目,根据硬件调整,通常等于 CPU 数量或者 2 倍于 CPU 数量 最好说是 6,取中间值
worker_processes 1;
配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是 error
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid; # 配置进程 pid 文件
2.4.2 events配置
配置工作模式和连接数
events {worker_connections 1024; # 配置每个 worker 进程连接数上限,nginx 支持的总连接数就等于
worker_processes * worker_connections
取值上限是 65535
}
2.4.3 Http配置
配置 http 服务器,利用它的反向代理功能提供负载均衡支持
http {
#配置 nginx 支持哪些多媒体类型,可以在 conf/mime.types 查看支持哪些多媒体类型
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"';
#配置 a***ess.log 日志及存放路径,并使用上面定义的 main 日志格式
#a***ess_log logs/a***ess.log main;
sendfile on; # 开启高效文件传输模式
#tcp_nopush on; # 防止网络阻塞
#keepalive_timeout 0;
keepalive_timeout 65; # 长连接超时时间,单位是秒
#gzip on; # 开启 gzip 压缩输出
}
2.4.4 server配置
# 配置虚拟主机
server {
listen 80; # 配置监听端口
server_name localhost; # 配置服务名 两个主机不能服务号和端口号完全一致
#charset koi8-r; # 配置字符集
#a***ess_log logs/host.a***ess.log main; # 配置本虚拟主机的访问日志
#默认的匹配斜杠 / 的请求,当访问路径中有斜杠 /,会被该 location 匹配到并进行处理
location / {
# root 是配置服务器的默认网站根目录位置,默认为 nginx 安装主目录下的 html 目录
root html;
# 配置首页文件的名称
index index.html index.htm;
}
#error_page 404 /404.html; # 配置 404 页面
#redirect server error pages to the static page /50x.html
#error_page 500 502 503 504 /50x.html; # 配置 50x 错误页面
#精确匹配
location = /50x.html {
root html;
}
}
三、nginx的主要应用
3.1 静态网站部署
通过 http://192.168.235.128:80/ 访问
# 修改nginx.conf配置文件
location / {
root /opt/static/ace;
index index.html index.htm;
}
通过 http://192.168.235.128:80/ace/ 访问
# 修改nginx.conf配置文件
location / {
root html;
index index.html index.htm;
}
# 接收/ace请求,去opt/static下找资源
location /ace {
root /opt/static;
index index.html index.htm;
}
3.2.1 location配置路径详解
ip + port 等于 root
1. location匹配规则:
nginx服务器首先在server块的多个location块中搜索是否有标准的uri和请求字符串匹配。如果有多个标准uri可以匹配,就匹配其中匹配度最高的一个location。
nginx在使用location块中,正则uri和请求字符串,进行匹配。如果正则匹配成功,则结束匹配,并使用这个location处理请求;如果正则匹配失败,则使用标准uri中,匹配度最高的location。
四、负载均衡
负载均衡通常是指将请求"均匀"分摊到集群中多个服务器节点上执行,这里的均匀是指在一个比较大的统计范围内是基本均匀的,并不是完全均匀。
4.1 Nginx负载均衡
Nginx通过在 nginx.conf 文件进行配置即可实现负载均衡;
4.1.1 http模块配置
upstream www.myweb.*** {
server 127.0.0.1:9100 weight=3;
server 127.0.0.1:9200 weight=1;
}
其中weight=1表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问机会越多; 但是权重并不代表紧着9100接收,而是采用less_conn的方式进行接收;
upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器;
4.1.2 server模块中添加location,并配置proxy_pass
location /myweb{
proxy_pass http://www.myweb.***
}
// 其中 www.myweb.*** 字符串要和 upstream 后面的字符串相等
// proxy_pass 后面的 URL 就是 “真正处理请求的服务器地址”
4.1.3 重启nginx
ps -ef | grep nginx
// 查看进程
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t
// 检查配置文件的格式等问题
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
// 重启nginx
./nginx -s reload
4.2 常用负载均衡策略
4.2.1 轮询(默认)
轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得 每个url 定向到同一个后端服务器 ,主要应用于后端服务器为缓存时的场景下。如果后端服务器down掉,将自动剔除;
按照请求的先后顺序,依次将请求分配到不同的后端服务器,是 Nginx 默认的负载均衡策略。
不具备会话保持能力,同一客户端的不同请求可能被分配到不同服务器。
upstream backserver {
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
4.2.2 权重
每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况;
upstream backserver {
server 192.168.0.14 weight=5;
server 192.168.0.15 weight=2;
}
4.2.3 ip_hash
ip_hash也叫IP绑定,每个请求按访问 ip 的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题;
4.2.4 最少连接
web请求会被转发到连接数最少的服务器上
4.2.5 负载均衡的其他配置
一般在项目上线的时候,可以分配部署不同的服务器上,然后对Nginx重新reload。
reload不会影响用户的访问,或者可以给一个提示页面,系统正在升级...
五、静态代理
把所有静态资源的访问改为访问nginx,而不是访问tomcat,这种方式叫静态代理。
因为nginx更擅长于静态资源的处理,性能更好,效率更高。
将静态资源比如图片、css、html、js等交给nginx处理,而不是由tomcat处理。
5.2 Nginx静态代理实现方式
5.2.1 nginx.conf的location中配置静态资源后缀
当访问静态资源,则从linux服务器 /opt/static 目录下获取:
5.2.2 nginx.conf的location中配置静态资源所在目录
当访问静态资源,则从linux服务器 /opt/static 目录下获取:
将静态资源放入 /opt/static 目录下,然后用户访问时由nginx返回这些静态资源;
6. 动静分离
Nginx的负载均衡和静态代理结合在一起,可以实现动静分离。
动态资源,如jsp由tomcat或其他web服务器完成;
静态资源,如图片、css、js等由nginx服务器完成;
它们各司其职,专注于做自己擅长的事情;
动静分离充分利用了它们各自的优势,从而达到更高效合理的架构。
一个nginx负责负载均衡,两个nginx负责静态代理。
Nginx在一台Linux上安装一份,可以启动多个Nginx,每个Nginx的配置文件不一样即可;
7. 虚拟主机
虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。
Nginx提供虚拟主机的功能,就是为了不需要安装多个Nginx,就可以运行多个域名不同的网站。
Nginx下,一个server标签就是一个虚拟主机。nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可;
例如:www.meituan.*** 切换城市,可以看到不同的城市地址不一样(二级域名)
比如一个公司有多个二级域名,没有必要为每个二级域名都提供一台Nginx服务器,就可以使用虚拟主机技术,在一台nginx服务器上,模拟多个虚拟服务器。
7.1 配置虚拟主机方式
7.1.1 基于端口的虚拟主机
基于端口的虚拟主机配置,使用端口来区分;
浏览器使用 同一个域名+端口 或 同一个ip地址+端口访问;
7.1.2 基于域名的虚拟主机
7.2 配置虚拟主机流程
通过 Nginx 配置虚拟主机,实现不同域名(beijing.myweb.***、nanjing.myweb.***、tianjin.myweb.***)分别转发到对应端口的 Tomcat 服务器,达成域名与后端服务的绑定访问。
流程逻辑总结
- 先部署后端 Tomcat,确保每个站点独立可访问;
- 配置 Nginx 的
upstream,定义域名与 Tomcat 端口的映射; - 配置虚拟主机(
server节点),让 Nginx 根据域名转发请求到对应的upstream; - 通过本地
hosts文件解析域名到 Nginx 服务器 IP; - 重启 Nginx 后,通过域名访问验证转发效果。