Nginx学习
Nginx学习
官网地址:http://nginx.org/
什么是nginx?
1. *Nginx* (engine x) 是一个高性能的[HTTP](https://baike.baidu.com/item/HTTP)和[反向代理](https://baike.baidu.com/item/反向代理/7793488)web服务器,特点是<font color=#FF0000>**占有内存少,并发能力强**</font>。
2. nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表名能支持高达50000个并发连接数。
nginx一般用来干啥?
- 反向代理
- 负载均衡
- 动静分离
nginx安装
安装前置依赖
yum -y install make gcc-c++ openssl openssl-devel pcre pcre-devel zlib zlib-devel
nginx安装
cd /usr/local/ #切换到指定目录
mkdir nginx #创建nginx文件夹并上传下载好的nginx包
./configure #使用nginx默认配置
make && make install #编译安装
#出现错误,可能是没有logs文件夹,在nginx下创建logs文件夹
mkdir logs
nginx启动
#切换到nignx安装的sbin目录
/usr/local/nginx/sbin
#指定配置文件进行启动
./nginx -c /usr/local/nginx/conf/nginx.conf
#查看进程确定启动
ps -ef|grep nginx
#访问
http://192.168.2.27 出现welcome to nginx
防火墙操作
firewall-cmd --list-all #查看开放的端口号
#开启http
firewall-cmd --add-service=http --permanent
#添加端口,格式为:端口/通讯协议 --permanent #永久生效,没有此参数重启后失效
firewall-cmd --add-port=80/tcp --permanent
#重新加载防火墙
firewall-cmd --reload
nginx配置文件详解
nginx配置文件由三部分组成
全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,只要包括配置运行nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径,日志存放路径和类型以及配置文件的引入等。
#nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理量越多,但是会受到软硬件的制约
worker_processes 1;
#配置错误日志的存放路径
error_log logs/error.log;
events块
events块涉及的指令主要影响nginx服务器与用户的网络连接。
#表示支持的最大连接数为1024,这部分对nginx的性能影响较大,在实际中需要进行灵活配置
worker_connections 1024;
http块
http块是nginx配置中最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里,它分为http全局块和sever块
- http全局块
http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
-
server块
server块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机完全是一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个http块可以包含多个server块,每个server块相当于一个虚拟主机
-
全局server块
最常见的配置是本虚拟机主机的监听配置和本虚拟机主机的名称或IP配置
-
location块
一个server块可以配置多个location块
这块的主要作用是基于nginx服务器接收到的请求字符串(例如:http://192.168.2.27/wzjs),对虚拟ip之外的字符串(例如前面的:/wzjs)进行匹配,对特定的请求进行处理,地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行配置!
-
nginx正反向代理
概念
正向代理概念
比如我们直接访问国外的网站,例如谷歌,是直接访问不到的,这个时候就需要一个正向代理服务器,客户端进行配置,通过正向代理去访问谷歌!
反向代理概念
用户将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址信息,隐藏了真实服务器ip地址
反向代理location指令说明
基本语法:location [=||*|^~|@] pattern{……}
=:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求
~:用于表示uri包含正则表达式,并且区分大小写
~*:用于表示uri包含正则表达式,并且不区分大小写
^~:用于不含正则表达式的uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即处理此location请求,而不再使用location块中的正则uri和请求字符串做匹配
注意:如果uri包含正在表达式,则必须要有~ 或者 ~*标识
nginx负载均衡
负载均衡基础配置
http {
#负载服务配置
upstream wzjsServer {
server 192.168.2.27:8080 weight=5;
server 192.168.2.28:9080 weight=5;
#======================================以下为补充配置==========================================
#限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制
server 192.168.2.27:222 max_conns=1000;
#表示当前的 server 暂时不参与负载。
server 192.168.2.27.333 down;
#其它所有的非 backup 机器 down 或者忙的时候,才会被请求。
server 192.168.2.27.444 backup;
#max_fails(默认1):允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器
#fail_timeout(默认10秒):达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它
server 192.168.2.27:8080 max_fails=3 fail_timeout=15;
}
server {
listen 80;
server_name localhost;
location /wzjs {
#反向代理指定负载服务
proxy_pass http://wzjsServer;
}
}
}
负载均衡策略
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除!
weight(权重配置)
weight代表权重、默认为1,权重越高被分配的客户端越多
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。例如:
#负载服务配置
upstream wzjsServer {
server 192.168.2.27:8080 weight=5;
server 192.168.2.28:9080 weight=4;
}
ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题,例如:
#负载服务配置
upstream wzjsServer {
ip_hash;
server 192.168.2.27:8080 weight=5;
server 192.168.2.28:9080 weight=4;
}
url_hash
按请求url的hash结果来分配请求,使每个url定向到同一个后端服务器,服务器做缓存时比较有效。
#负载服务配置
upstream wzjsServer {
server 192.168.2.27:8080 weight=5;
server 192.168.2.28:9080 weight=4;
hash $request_uri;
}
faid(第三方)==>需要下载fair模块源码编译进nginx
按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream wzjsServer {
server 192.168.2.27:8080;
server 192.168.2.28:9080;
fair;
}
nginx动静分离
nginx配置静态资源代理
-
创建静态资源存放文件夹:/server/staticProxy
-
添加单个目录代理配置
location /img/ { #指向/server/staticProxy下面的img目录 root /server/staticProxy/; #代理目录 } #访问http://192.168.2.27/img/test.jpg测试 location /pdf/ { #指向/server/staticProxy下面的pdf目录目录 root /server/staticProxy/; #代理目录 } #访问http://192.168.2.27/pdf/test.pdf测试 -
添加代理父目录,多个子目录
location /staticProxy/ { #代理父目录 root /server/; } #访问测试 http://192.168.2.27/staticProxy/pdf/test.pdf http://192.168.2.27/staticProxy/img/test.jpg
nginx高可用集群搭建
什么是nginx高可用?

安装实操
集群搭建前置条件
- 两台服务器都安装nginx
- 两台服务器都安装keepalived
keepalived安装
命令安装:yum install keepalived -y
检查是否安装:rpm -q -a keepalived
安装后位置:/etc/keepalived
高可用主从配置
修改keepalived.conf文件
global_defs {
notification_email { #通知
lwenpu@163.com
}
notification_email_from sns-lvs@gmail.com #通知\电子邮件\来自
smtp_server 192.168.2.27 #通知邮箱的服务
router_id 192.168.2.27 # 设置nginx master的id,在一个网络应该是唯一的
}
vrrp_script chk_http_port {
script "/usr/local/nginx/src/check_nginx_pid.sh" #检测脚本
interval 2 #(检测脚本执行的间隔,单位是秒)
weight 2 #权重
}
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡),使用ifconfig查看
virtual_router_id 66 # 虚拟路由编号,主从要一致
priority 100 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
authentication { #权限规则
auth_type PASS
auth_pass mz_xifen
}
track_script {
chk_http_port #(调用检测脚本)
}
virtual_ipaddress {
192.168.17.66 # 定义虚拟ip(VIP),可多设,每行一个
}
}
添加检测脚本
#!/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
systemctl stop keepalived
fi
fi
注:如果脚本执行报错!
vim check_nginx_pid.sh
#直接输入":",然后在":"之后输入"set ff"
:set ff
#如果出现
fileformat=dos
#我们需要把格式改为unix,方法是输入":set ff=unix"
:set ff=unix
#再使用:set ff查看,发现变成了以下,就可以正常执行了
fileformat=unix
两台服务器都配置完keepalived.conf和添加检测脚本后,分别进行keepalived和nginx的启动
keepalived启动:systemctl start keepalived.service
keepalived日志查看:tail -f /var/log/messages
keepalived重启:systemctl restart keepalived
nginx启动:./nginx -c /usr/local/nginx/conf/nginx.conf
测试
访问虚拟ip:192.168.17.66 ==出现nginx配置则成功
- 停止master的nginx测试
- 恢复master,停止slave节点测试
- 都停掉测试
一切按照预想的结果则恭喜溪风高可用集群环境搭建成功!
nginx原理及配置优化
工作原理为:一个master多个worker
一个master和多个worker的好处
- 可以使用nginx -s reload热部署,利于nginx进行热部署操作
- 每个worker是独立的进程,如果有其中的一个worker出现问题,其他worker是独立的,继续进行争抢,实现请求过程,不会造成服务中断!
设置多少个worker合适?
worker数和服务器的cpu数相等是最合适的,如果超出cpu数会造成cpu上下文切换!
连接数worker_connection
-
发送请求,占用了worker的几个连接数?
静态代理2个,反向代理4个
-
nginx有一个master,有四个worker,每个worker支持最大的连接数是1024,支持最大的并发数是多少?
静态代理计算公式:worker_connection*worker_processes/2
反向代理计算公式:worker_connection*worker_processes/4

浙公网安备 33010602011771号