Nginx 详解
Nginx 基本概念
Nginx 是什么?
Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是:占有内存少,并发性能强,能承受高负载的考验,可高达 50000 个并发连接数
Nginx 可以做什么事情?
反向代理
正向代理指的是:在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
反向代理指的是:客户端请求反向代理服务器,由反向代理服务器选择目标服务器获取数据后返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器的 IP 地址
负载均衡
客户端发送多个请求到服务器,单个服务器解决不了,我们增加服务器的数量,将请求分发到各个服务器上,将负载分发到不同的服务器上,即负载均衡
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低单个服务器的压力
Nginx 安装、常用命令和配置文件
Linux 安装 Nginx
依赖
#### pcre
#### openssl
#### openssl-devel
#### zlib
#### zlib-devel
#### gcc-c++
#### libtool
# 查看版本
pcre-config --version
安装 Nginx
usr/local/nginx/sbin 下有启动脚本
./nginx 启动
防火墙的设置
# 查看开放的端口号:
firewall-cmd --list-all
# 设置开放的端口号
firewall-cmd --add-service=http -permanent
sudo firewall-cmd --add-port=8001/tcp --permanent
# 重启防火墙
firewall-cmd -reload
Nginx 常用命令
进入 Nginx 的目录
/usr/local/nginx/sbin
# 查看 Nginx 版本号
./nginx -v
# 启动 Nginx
./nginx
# 关闭 Nginx
./nginx -s stop
# 重新加载 Nginx (修改配置文件后重新加载——> Nginx 的热部署)
./nginx -s reload
Nginx 配置文件
# 路径:
/usr/local/nginx/conf/nginx.conf
# 详细信息
## 第一部分:全局块
### worker_processes 指的是 Nginx 可以处理的并发数,数字越大,可以处理的并发数越高
## 第二部分:events块,主要影响 Nginx 服务器与用户的网络连接
### worker_connections 指的是支持的可连接数,灵活配置
## 第三部分:http 块
### http 全局块
#### 指的是:文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等
### server块
#### 全局 server 块
#### location 块
##### 一个 server 块中可以配置多个 location 块
server {
listen 80; # 监听的 80 端口
server_name localhost; # 主机名称
location {
}
}
Nginx 配置实例1:反向代理
# 实现效果:访问 www.123.com,跳转到 tomcat 主页面
# 具体实现:
## linux 安装 tomcat 8080端口
## 启动 Tomcat 进入 tomcat 的 bin 目录,./startup.sh 启动
## 对外开放 8080 端口
firewall-cmd --add-port=8080/tcp ==permanent
firewall-cmd -reload
## 更改 hosts 文件,增加域名跟 IP 的映射
192.168.1.23 www.123.com
## Nginx 配置
server {
listen 80;
server_name 192.168.1.23;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
Nginx 配置实例2:反向代理升级
# 实现效果:根据访问路径跳转到不同端口的服务中
## 访问 http://192.168.1.23:9001/edu/ 直接跳转到 127.0.0.1:8080
## 访问 http://192.168.1.23:9001/vod/ 直接跳转到 127.0.0.1:8081
# 具体实现:
server {
listen 9001;
server_name 192.168.1.23;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}
## 对外开放 9001 8080 8081 端口
## 注意:
### '=' 表示严格匹配;
### '~' 表示包含正则表达式,区分大小写
### '~*' 表示包含正则表达式,不区分大小写
Nginx 配置实例2:负载均衡
# 实现效果:浏览器输入地址:http://192.168.1.23/edu/a.html,负载均衡效果,平均分担到 8080 和 8081 端口中
# 具体实现:
upstream myserver {
server 192.168.1.23:8080;
server 192.168.1.23:8081;
}
server {
listen 80;
server_name 192.168.1.23;
location / {
proxy_pass http://myserver;
}
# Nginx 提供了几种不同的分配方式:
## 轮询(默认)
### 即平均负载
## weight 加权轮询
upstream myserver {
server 192.168.1.23:8080 weight=3;
server 192.168.1.23:8081 weight=1;
}
### 8080 负载三次, 8081 负载一次
## ip_hash
### 每个请求按访问 IP 的 hash 结果分配,这样每个访客会固定访问一个后端服务器,可以解决 session 共享的问题,若是同一个 IP 访问仍会轮训
upstream myserver {
ip_hash;
server 192.168.1.23:8080;
server 192.168.1.23:8081;
}
### 加入 ip_hash 即可自动给每次请求固定访问的服务器
## fair(第三方)
### 按照后端服务器的响应时间来分配请求,响应短的优先分配
upstream myserver {
server 192.168.1.23:8080;
server 192.168.1.23:8081;
fair;
}
Nginx 配置实例3:动静分离
# 指的是:将动态请求跟静态请求分开,可以使用 Nginx 处理静态页面,Tomcat 处理动态页面,目的是为了请求更高效
## 动态请求指的是:比如:需要请求服务端对数据库进行增删改查,直接去 Tomcat 服务端操作
## 静态请求指的是:比如:客户端请求一个 html、css、image,直接访问借助 Nginx 部署的静态资源服务器
## 实现角度分为两种:
### 一是:纯粹把静态文件独立成单独的域名,放在独立的服务器,也是目前主流的方案;
### 二是:将动态跟静态文件混合在一起发布,通过 Nginx 来分开,通过location指定不同的后缀名实现不同的请求转发,通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。
#### 注意:具体的 Expires 指的是:是给一个资源设定一个过期时间,也就是说无须去服务端验证,直接通过浏览器自身确定是否过期即可,鼓不会产生额外的流量,此种方法非常适合不经常变动的资源。(如经常更新的文件,不建议使用 Expires 来缓存)
##### Expires 3d 指的是 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304, 如果修改,则直接从服务器重新下载,返回状态 200
# 具体配置:
server {
listen 80;
server_name 192.168.1.23;
location /www/ {
root /data/;
}
location /image/ {
root /data/;
autoindex on; # 列出当前文件夹中的内容;
}
}
# 测试:
## http://192.168.1.23/image/o1.jpg
## http://192.168.1.23/www/a.html
Nginx 配置高可用集群
借助 Nginx 转发请求到服务器集群中,服务器集群中有某个服务器宕机后会有相应的补救措施,但当 Nginx 宕机后,就会导致请求不到相应的资源,此时即要配置高可用
# 两台服务器中都要安装 Nginx 跟 Keepalived 做主备高可用
# 修改 Keepalived 的配置文件:
## /etc/keepalived/keepzlived.conf
## 启动 keepalived
systemctl start keepalived.service
### 主服务器中的 keepalived 配置
#### 全局定义
global_defs {
...
...
smtp_server 192.168.1.23
smtp_connect_timeout 30
router_id LVS_DEVEL # 可以写 IP (是代表唯一的值)
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" # 监测 Nginx 服务器是否存活的脚本路径
interval 2 # 监测脚本的执行间隔
weight 2
}
#### 虚拟 IP 的相关配置
vrrp_instance VI_1 {
state MASTERT # 主还是备
interface ens33 # 网卡
virtual_router_id 913 # 主备机的 virtual_router_id 须相同
priority 100 # 主备机设置不同的优先级,主机大
...
...
virtual_ipaddress {
192.168.1.26 # 虚拟 IP 地址
}
}
### 备服务器中的 keepalived 配置
#### 全局定义
global_defs {
...
...
smtp_server 192.168.1.24
smtp_connect_timeout 30
router_id LVS_DEVEL(127.0.0.1) # 可以写 IP (是代表唯一的值)
}
#### 监测脚本配置
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" # 监测 Nginx 服务器是否存活的脚本路径
interval 2 # 监测脚本的执行间隔 2 秒
weight 2 # 权重
}
#### 虚拟 IP 的相关配置
vrrp_instance VI_1 {
state BACKUP # 主还是备
interface ens33 # 网卡
virtual_router_id 913 # 主备机的 virtual_router_id 须相同
priority 90 # 主备机设置不同的优先级,主机大
advert_int 1 # 每隔多长时间发送心跳监测 1 秒
authentication {
auth_type PASS # 认证方式是:密码
auth_pass 6666 # 密码是:6666
}
virtual_ipaddress {
192.168.1.26 # 虚拟 IP 地址(可以绑定多个)
}
}
nginx_check.sh 监测脚本
#!/bin/bash
A=`ps -C nginx -no-header | wc -l`
if [ $A -eq 0 ];then
/usr/lcoal/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx -no-header | wc -l` -eq 0 ];then
killall keepalived
fi
fi
抟扶摇而上者九万里