目录
Nginx 安装 与 启动
- 参考文章
- 安装依赖包
apt-get install gcc
apt-get install libpcre3 libpcre3-dev
apt-get install zlib1g zlib1g-dev
# Ubuntu14.04的仓库中没有发现openssl-dev,由下面openssl和libssl-dev替代
#apt-get install openssl openssl-dev
sudo apt-get install openssl
sudo apt-get install libssl-dev
- 进入 Nginx 的存放目录
# 执行 configure
./configure
# 编译 and 安装
make && make install
- 进入目录 /usr/local/nginx/sbin/ 启动服务
1、查看 nginx 版本号
./nginx -v
2、启动 nginx
./nginx
3、停止 nginx
./nginx -s stop
4、重新加载 nginx 修改配置文件后,不想重启就用这个
./nginx -s reload
- 通过在浏览器访问
Nginx所在服务器IP:80
可以知道是否安装和启动成功,Nginx 默认的访问端口就是 80
Nginx 配置文件
- 配置文件位置:/usr/local/nginx/conf/ —> nginx.conf
Nginx 配置文件结构解读
- 第一部分:全局块
- 从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令
- 主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等
- worker_processes:这是 Nginx 服务器并发处理服务的关键配置,worker processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约
- 第二部分:events 块
- events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接
- 常用的设置包括是否开启对多 work process 下的网络连接进行序列化、是否允许同时接收多个网络连接、选取哪种事件驱动模型来处理连接请求、每个 word process 可以同时支持的最大连接数等
- 第三部分:http 块
- 这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里
- http 全局块:就是http 块开头到 server 块之间的部分
- http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等
- server 块:每个 http 块中可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机
- 每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块
- 全局 server 块,就是 server 块开头到 locaton 块之间的部分
- 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置
- locaton 块:一个 server 块中可以配置多个 location 块
- 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理
- 地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行
Nginx 理论承受并发连接数
- Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负
载的考验,有报告表明能支持高达 50,000 个并发连接数
Nginx 实现反向代理
正向代理
反向代理
反向代理的配置
- 新增一个 server 块
# 一个 http 块 中 server 块可以有多个
server {
# 客户端访问的端口
listen 8000;
# 客户端访问时输入的 IP 或 域名对应的 IP
server_name 部署Nginx的服务器IP;
# ~ 开头,表示用正则表达式匹配。这里表示,只要客户端访问的路径中带有 /ede/ 就转发
location ~ /ede/ {
proxy_pass http://实际请求的目的ip(网关或应用部署的服务器ip):端口号[/其它匹配路径...];
}
# 一个 server 块中 可以有多 location 块
location ~ /edu/ {
proxy_pass http://实际请求的目的ip(网关或应用部署的服务器ip):端口号[/其它匹配路径...];
}
}
- location 后如果是单独的
/
则表示任意路径匹配
Nginx 实现 负载均衡
负载均衡的策略
- 反向代理 + 负载均衡
upstream myserver{
ip_hash;
server 实际请求的目的ip(网关或应用部署的服务器ip):端口号;
server 实际请求的目的ip(网关或应用部署的服务器ip):端口号;
....
}
# 一个 http 块 中 server 块可以有多个
server {
# 客户端访问的端口
listen 8000;
# 客户端访问时输入的 IP 或 域名对应的 IP
server_name 部署Nginx的服务器IP;
# ~ 开头,表示用正则表达式匹配。这里表示,只要客户端访问的路径中带有 /ede/ 就转发
location ~ /ede/ {
proxy_pass http://myserver[/其它匹配路径...];
proxy_connect_timeout 10;
}
# 一个 server 块中 可以有多 location 块
location ~ /edu/ {
proxy_pass http://myserver[/其它匹配路径...];
proxy_connect_timeout 10;
}
}
Nginx 实现动静分离
常见的动静分离方式
- 动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面
Nginx 实现高可用
-
Nginx 实现高可用,主要通过 VIP(virtual IP) + KeepAlived
-
在 Nginx 所在服务器,安装 keepAlived
apt install keepalived
# 进入 apt install keepalived 查看有没有生成 keepalived.conf
cd /etc/keepalived
# 没有就手动创建一个
vim keepalived.conf
- 内容如下,有备注的地方需要注意以下,其他都照搬就行
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 本服务器的 IP
smtp_connect_timeout 30
# 主机的名字,gedit /etc/hosts 查看,可以直接通过修改文件内容: 127.0.0.1 hahah 指定主机名字为 hahah
# 通过 LVS_DEVEL 能访问到主机
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" # 脚本内容下面提供
interval 2 # 检测脚本执行的间隔,2s
weight 2 # 设置当前服务器的权重,当脚本内容成立,权重降低
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上为 BACKUP,主服务器是 MASTER
interface ens33 # 网卡,通过 ifconfig 查看
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同,只要相同,值不重要
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 心跳检查 检查当前服务器是否还健在 间隔 1s
authentication {
# 校验权限的方式:密码
# 密码为1111
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟IP,可以为当前服务器绑定多个
}
}
- 检测脚本,注意
/usr/local/nginx/sbin/nginx
这是 nginx 可执行文件的路径
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
Nginx 工作原理
- 每个 worker 进程,都是独立的进程,不需要加锁,所以省掉了锁带来的开销
- 互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的
worker 进程 - 可以使用
nginx –s reload
热部署,利用 nginx 进行热部署操作
需要设置多少个 worker
- Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下
- 每个 worker 的线程可以把一个 cpu 的性能发挥到极致,所以 worker 数和服务器的 cpu数相等是最为适宜的
最大并发数
- 连接数 worker_connection 表示每个 worker 进程所能建立连接的最大值
- 一个 nginx 能建立的最大连接数,应该是 worker_connections * worker_processes
- 如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问(假设静态资源放在Nginx所在服务器)最大并发数是: worker_connections * worker_processes /2
- 如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4