Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的IP地址。
增加服务器物理配置来解决问题的办法(纵向解决问题)的办法行不通了,
那么横向增加服务器的数量呢?
集群的概念产生,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,
将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。
http://nginx.org/官网下载
windows下解压即可
建议使用Stable version稳定版
解压
使用cmd在目录下运行
输入nginx.exe运行
浏览器
http://localhost/默认访问80端口
测试是否开启成功
出现Welcome to nginx!即成功!
Linux安装
1 使用远程连接工具连接linux操作系统
Xshell
2 需要的相关素材(依赖)
pcre
openssl
zlib
使用wget或者yum命令!
安装素材。
安装pcre依赖
把安装压缩文件放到linux系统中
解压压缩文件
进入解压之后的目录,
执行./configure
使用make && make install
编译并安装
安装之后可以使用命令查看版本号
pcre-config --version
安装其它依赖,
yum
一键安装
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
安装nginx
解压文件
tar -xvf nginx.tar.gz
执行
./configure
执行
make && make install
安装成功后
自动安装在usr/local下
cd nginx/
cd sbin
执行./nginx
ps -ef | grep nginx
查看进程
查看开放的端口号
firewall-cmd --list-all
设置开放的端口号
firewall-cmd --add-service=http -permanent
firewall -cmd --add-port=80/tcp --permanent
重启防火墙
firewall-cmd --reload
使用nginx操作命令前提条件:
必须进入nginx目录里
/usr/local/nginx/sbin
查看nginx的版本号
./nginx -v
启动nginx
./nginx
ps -ef | grep nginx
关闭nginx
./nginx -s stop
重新加载nginx
./nginx -s reload
nginx-1.20.1\conf\nginx.conf文件
三部分组成
第一部分-全局块
从配置文件开始到events块之间的内容,主要设置一些影响nginx服务器整体运行的配置指令
比如:worker_processes 1;
worker_processes值越大,可以支持的并发处理量也越多。
第二部分-events块
events块涉及的指令主要影响Nginx服务器与用户的网络连接
比如:worker_connections 1024;
支持的最大连接数
第三部分-http块
是Nginx服务器配置中最频繁的部分
http块也可以包括http全局块、server块
实现效果:
打开浏览器,输入地址,跳转liunx系统tomcat主页面中
准备工作:
./startup.sh启动tomcat服务器
对外开放访问的端口
设置开放的端口号
firewall-cmd --add-service=http -permanent
firewall -cmd --add-port=80/tcp --permanent
重启防火墙
firewall-cmd --reload
查看开放的端口号
firewall-cmd --list-all
具体实现
在windows系统中通过浏览器访问tomcat服务器
配置windows系统的host文件进行域名和ip的对应关系的配置
第二步:
在nginx进行请求转发的配置(反向代理配置)
找到nginx的配置文件
server {
listen 80;
server_name localhost;
server_name 改为 ip地址!
location / {
root html;
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
最终测试!
实现效果:
使用nginx反向代理,根据访问的路径跳转到不同端口的服务中
nginx监听端口为9001
访问http://127.0.0.1:9091/edu/
跳转到127.0.0.1:8081
访问http://127.0.0.1:9091/vod/
跳转到127.0.0.1:8082
准备工作:
具体配置
找到nginx配置文件,进行反向代理的配置
server {
listen 9001;
server_name localhost;
localhost改为ip地址
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
开放对外访问的端口号
location指令说明:
该指令用于匹配URL
语法如下:
lacation [= | ~ | ~* | ^~] uri {
}
注意:
如果uri包含正则表达式,则必须要有~ 或者 ~*标识
实现效果:
负载均衡效果,平均8080,8081端口中
http{
...
upstream myserver {
ip_hash;
server xxx.xx.xx.xx:8080 weight=1;
server xxx.xx.xx.xx:8180 weight=1;
}
server{
listen 80;
server_name localhost;
#localhost改为ip地址
location / {
...
proxy_pass http://myserver;
proxy_connect_timeout 10;
}
}
}
一、 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
二、weight
weight代表权重,默认为1,权重越高被分配的客户端越多
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream myserver_pool {
server xxx.xx.xx.xx:8080 weight=10;
server xxx.xx.xx.xx:8180 weight=5;
}
三、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
upstream myserver_pool {
ip_hash;
server xxx.xx.xx.xx:8080 weight=10;
server xxx.xx.xx.xx:8180 weight=5;
}
四、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream myserver_pool {
server xxx.xx.xx.xx:8080 weight=10;
server xxx.xx.xx.xx:8180 weight=5;
fair
}
什么是动静分离?
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏 览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源 设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一 个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304, 如果有修改,则直接从服务器重新下载,返回状态码 200。
server {
listen 80;
server_name localhost;
#localhost改为ip地址
静态资源路径/data/www/
root—>根目录
location /www/ {
root /data/;
index index.html index.htm;
}
/data/image/图片
location /image/ {
root /data/;
autoindex on;
}
autoindex on
列出访问目录
添加监听端口、访问名字
重点添加location
准备工作
需要两台nginx服务器
需要keepalived
需要虚拟ip
在两台服务器上安装keepalived
使用yum命令进行安装
yum install keepalived -y
检查是否安装成功
rpm -q -a keepalived
安装之后,在 etc 里面生成目录 keepalived,有文件 keepalived.conf
完成高可用配置(主从配置)
(1)修改/etc/keepalived/keepalivec.conf 配置文件
global_defs {#全局定义
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL #唯一值
#访问到主机,服务器名字,在HOST文件里面加名字
#127.0.0.1 LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
#检测的脚本
interval 2 #(检测脚本执行的间隔2s)
weight 2#权重 检测成功执行
}
vrrp_instance VI_1 {#虚拟ip配置
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
#设置主服务器还是备份服务器
interface ens33 //网卡名称
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
#每隔多长时间发送心跳
authentication {
auth_type PASS
auth_pass 1111
}
#权限校验方式,密码 1111
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟地址
}
}
ifconfig
查看网卡名称
(2)在/usr/local/src 添加检测脚本
nginx_check.sh
!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
#nginx启动路径
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
#从服务器替代主服务器
fi
fi
(3)把两台服务器上 nginx 和 keepalived 启动 启动 nginx:./nginx
启动 keepalived:systemctl start keepalived.service
一个master和多个worker有好处
(1)可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作
(2)每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的, 继续进行争抢,实现请求过程,不会造成服务中断,降低风险
master-workers 的机制的好处
首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,
同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会
影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的
worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当
前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险
设置多少个 woker 合适
worker 数和服务器的 cpu 数相等是最为适宜的
需要设置多少个 worker
Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进
程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话
下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu
数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
#设置 worker 数量。
worker_processes 4
#work 绑定 cpu(4 work 绑定 4cpu)。
worker_cpu_affinity 0001 0010 0100 1000
#work 绑定 cpu (4 work 绑定 8cpu 中的 4 个) 。
worker_cpu_affinity 0000001 00000010 00000100 00001000
连接数 worker_connection
这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接
数,应该是 worker_connections * worker_processes。当然,这里说的是最大连接数,对于
HTTP 请 求 本 地 资 源 来 说 , 能 够 支 持 的 最 大 并 发 数 量 是 worker_connections * worker_processes,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections*worker_processes /2,而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服
务的连接,会占用两个连接。
连接数 worker_connection 第一个:发送请求,占用了 woker 的几个连接数?
答案:2 或者 4 个
第二个:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的 最大并发数是多少?
普通的静态访问最大并发数是: worker_connections * worker_processes /2,
而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4