nginx
安装
官方安装教程:http://nginx.org/en/linux_packages.html
下载源码包:wget path
安装:
1. 安装gcc环境
yum install gcc-c++
2.安装PCRE库
yum install -y pcre pcre-devel
3.zlib安装
yum install -y zlib zlib-devel
4.ssl加密安装
yum install -y openssl openssl-devel
5.创建临时目录
mkdir /var/temp/nginx -p
6.配置参数
./configure --prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi
//安装过程可能报错,一般为缺少包,下方有参数解释:
7.安装:
make & make install
8.启动:
./nginx/sbin/nginx
命令 | 解释 |
---|---|
--prefix | 指定nginx安装目录 |
--pid-path | 指向nginx的pid |
--lock-path | 锁定安装文件,防止被恶意篡改或误操作 |
--error-log | 错误日志 |
--http-log-path | http日志 |
--with-http_gzip_static_module | 启用gzip模块,在线实时压缩输出数据流 |
--http-client-body-temp-path | 设定客户端请求的临时目录 |
--http-fastcgi-temp-path | 设定fastcgi临时目录 |
--http-uwsgi-temp-path | 设定uwsgi临时目录 |
--http-scgi-temp-path | 设定scgi临时目录 |
--add-module | 添加第三方外部模块 |
--conf-path | 指定 nginx.conf 配置文件路径 |
--user | nginx 工作进程的用户 |
--with-pcre | 开启 PCRE 正则表达式的支持 |
--with-http_ssl_module | 启动 SSL 的支持 |
--with-http_stub_status_module | 用于监控 Nginx 的状态 |
--with-http-realip_module | 允许改变客户端请求头中客户端 IP 地址 |
--with-file-aio | 启用 File AIO |
控制命令
#进程号默认存储在logs/nginx.pid
./nginx //启动nginx
kill -INT pid //快速关闭nginx
kill -QUIT pid //优雅关闭
kill -HUP pid //重载配置文件,使用新配置运行
kill -USR1 pid //重读日志文件,即切换日志文件
kill -USR2 pid //平滑升级
kill -WINCH pid //平滑关闭旧进程
#控制命令
./nginx -s stop //快速关闭
./nginx -s quit //优雅关闭
./nginx -s reload //重载配置文件,使用新配置运行
./nginx -s reopen //重读日志文件,即切换日志文件
./nginx -t //测试配置文件是否出错
进程模型
master 进程:主进程,管理工作进程
worker 进程:工作进程,真正执行者,处理客户端连接
配置文件
worker_processes 1;#一般设置为cpu个数*cpu核心数
#日志级别info - notice - warn - error - crit
error_log logs/error.log info;
#pid路径
pid logs/nginx/pid;
events {
use epoll; # 默认使用epoll,可以不配置
worker_connections 1024;#一个工作进程允许的最大连接数
}
http {
#导入外部文件配置
include mime.types;
#配置http服务
sendfile on;#文件传输
#tcp_nopush on; #累积统一处理
gzip on; #开启压缩
server {
#虚拟主机配置
}
}
虚拟主机
server {
listen 80;#监听的端口
server_name hostname.com;#监听的主机名、域名、ip
location / {
root html;
index index.html;
}
location / {
alias /abc;
index index.html;
}
}
日志管理
date=`date -d yesterday +%Y%m%d` #获取时间
logpath=/usr/local/logs/xxx.log
bakpath=/data/logs/
bakname=xxx.log.$date
bakfilepath=$bakpath/$bakname
mv $logpath $bakfilepath
touch $logpath
/usr/local/nginx -s reopen
#设置linux定时任务即可
location配置
location = pattern #精准匹配,如果匹配中的如果是目录,则会重新进行匹配
location pattern #普通匹配,匹配度越高,则使用
location ~ pattern #正则匹配,~*表示不区分大小写
#匹配过程(默认匹配nginx目录下的html)
#精准匹配 > 正则匹配 > 普通匹配,精准匹配命中则不进行继续匹配,如果精准匹配未命中,则进行普通匹配,如果普通匹配有命中,则判断匹配度,以匹配度最高的为准,记忆匹配结果,如果有正则匹配,则以第一个匹配的为准,如果没有匹配则返回记忆结果
rewrite URL重写
if (cond){} #设定条件,在进行重写,if后面需要加空格,判断变量在前,条件在后,如果是文件判断则条件在前,变量在后,重写后重新匹配的url与开始的访问路径一致
set #设置变量
return #返回状态码
break #跳出rewrite,防止循环重定向
rewrite #重写url
#############################
rewrite regex rewriteaddr [break];#正则中如果有{},则需要将所有正则使用双引号包裹
gzip压缩
gzip on|off;#是否开启
gzip_buffers 32 4k|16 8k;#缓存块以及块大小
gzip_comp_level 1-9;#压缩级别,越大则压缩的越小,占用资源越大
gzip_disable pattern;#不压缩的规则
gzip_min_length 200;#最小压缩长度,即小于该值就不进行压缩
gzip_http_version 1.1;#压缩http协议版本
gzip_proxied #如果经过代理,设置缓存;
gzip_types text/plain application/xml;#压缩类型
gzip_vary on|off;#传输压缩标志
expires缓存
#在location和server中
expires 30s;#单位s,m,h,d等
#可以设置一个固定的时间 @20h30m 表示当天20点30分缓存到期
#设置一个过去的时间表示缓存已经过期 -1h
#expires epoch 没有使用缓存
#expires off 关闭缓存,即只使用浏览器缓存
#expires max 最大缓存时间,不过期
#会在浏览器本地缓存读取已缓存的内容
nginx缓存
#设置nginx缓存地址
# keys_zone 设置共享缓存以及占用的空间大小
# max_size 设置缓存的大小
# inactive 设置缓存保留的时间
# use_temp_path 关闭临时目录
proxy_cache_path /home/cache keys_zone=abcd:5m max_size=1g inactive=30s use_temp_path=off;
server {
#其他配置
#开启并使用上面设置的缓存
proxy_cache abcd;
#设置针对特定的状态码的缓存,并设置过期时间
proxy_cache_valid 200 304 8h;
}
反向代理
#反向代理到其他服务器
proxy_pass url|upserver_name;
proxy_set_header X-Forwarded-For $remote_addr;
负载均衡
upstream up_name {
[ip_hash;]#使用ip_hash算法进行负载均衡;
[hash $request_uri;]#使用url进行hash计算的负载均衡
[least_coun;]#最少连接负载均衡
server address [params];
# params:
# weight=[1-9] 权重
# max_conns=number 最大连接数
# slow_start=time 缓慢提升权重,需要和wdight配合,开源版无法使用
# down 标识服务器停机
# backup 标识服务器为备用服务器
# max_fails=number 最大失败数,和fail_timeout配合使用
# fail_timeout=time 失败超时时间,和max_fails配合使用
keepalive 32; 保持连接,http1.1
}
跨域问题
#server下和location下
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' *;
add_header 'Access-Control-Allow-Headers' *;
防盗链
valid_referers *.xxx.com;
if( $invalid_referer ){
return 404;
}
https配置
#检测是否安装了ssl模块,如果没有安装的话,参考安装第三方模块
server {
listen 443;
server_name xxx;
# 开启ssl
ssl on;
# 配置ssl证书,需要与nginx.conf在同一个目录,其他路径些相对路径或绝对路径
ssl_certificate xxx.crt;
# 配置证书秘钥,需要与nginx.conf在同一个目录
ssl_certificate_key xxx.key;
# ssl会话cache
ssl_session_cache shared:SSL:1m;
# ssl会话超时时间
ssl_session_timeout 5m;
# 配置加密套件,写法遵循 openssl 标准
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass xxx;
}
}
MemCache
set $memcached_key "$uri";#设置memchache的key
memcached_pass mc_addr;#memcache的地址
error_page 404 /callback;#如果发生错误回调的地址
第三方模块的安装
#重新编译
./configure -prefix=path --add-moudle=moudlepath
make & make install
#会生成一个nginx.old的可执行文件
keepAlived
- 安装:下载后解压,执行
./configure --prefix=/usr/local/keepalived --sysconf=/etc
进行配置,完成之后执行make & make install
即可。如果过程中出现警告,表示缺少依赖,可以通过yum安装对应依赖即可(yum -y install libnl libnl-devel)
- 启动:进入安装目录,执行sbin下的文件启动即可
- 配置:
global_defs {
#通知邮件地址配置
#notification_email {
# acassen@firewall.loc
# failover@firewall.loc
# sysadmin@firewall.loc
#}
#notification_email_from Alexandre.Cassen@firewall.loc
#smtp_server 192.168.200.1
#smtp_connect_timeout 30
# 路由id,当前安装keepalived节点主机的标识符,全局唯一
router_id keep_1
#vrrp_skip_check_adv_addr
#vrrp_strict
#vrrp_garp_interval 0
#vrrp_gna_interval 0
}
# 这是一个计算机节点配置
vrrp_instance VI_1 {
# 表示当前节点状态为主节点,或者设置为BACKUP表示备用机
state MASTER
# 当前实例绑定的网卡
interface eth0
# 虚拟路由id,保证主备节点一直
virtual_router_id 51
# 优先级,权重,按照优先级做为选举的依据,备用节点可以调低
priority 100
# 主备之间同步检查的间隔,默认为1s
advert_int 1
# 认证授权的密码,防止非法节点
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟ip配置,会将ip绑定到网卡,主机和备用机ip一致
virtual_ipaddress {
192.168.200.16
}
}
- 与nginx配合:
- nginx检测脚本:
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
# 判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
# 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
- keepalived配置:
# 在vrrp_instance下添加该配置
track_script {
check_nginx_alive # 追踪 nginx 脚本
}
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 2 # 每隔两秒运行上一行脚本
weight 10 # 如果脚本运行失败,则升级权重+10,或者设置为负数表示降低权重
}
keepalived双主热备
# 配置两个vrrp_instance,其中名称不一致,每个各绑定一个ip
vrrp_instance VI_1 {
# 主机为MASTER,备用为BACKUP
state MASTER
interface ens33
# 互为主备的值要一致
virtual_router_id 51
# 各自设置优先级
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 主节点配置可以添加该配置检测nginx
track_script {
check_nginx_alive # 追踪 nginx 脚本
}
virtual_ipaddress {
192.168.1.115
}
}
LVS
Linux Virtual Server
- 工作模式
- NAT模式:请求响应均经过lvs
网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用用户可以访问位于公司内部的私有IP主机
- TUN模式:请求经过,响应直接返回给客户端
请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端
- DR模式:请求经过,通过路由响应给客户端
调度器与后端服务器必须在同一个局域网内,VIP地址需要在调度器与后端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源IP为VIP地址,目标IP为客户端IP,这样客户端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址(真实服务器上的VIP),客户端是感觉不到后端服务器存在的
- NAT模式:请求响应均经过lvs
- 安装配置
- 虚拟机配置需要关闭网络管理器
systemctl stop NetworkManager``systemctl disable NetworkManager
- 复制并配置网卡配置
/etc/sysconfig/network-scripts/ifcfg-xxx
# 文件名:ifcfg-ens33:1 BOOTPROTO=static DEVICE=ens33:1 ONBOOT=yes IPADDR=192.168.0.150 NETMASK=255.255.255.0
- 安装ipvsadm (云服务器一般虚拟ip服务需要付费使用)
yum install ipvsadm
- 构建返回服务节点(其他服务器节点)
# 文件名:ifcfg-lo:1 # 使用命令 ifup lo DEVICE=lo:1 IPADDR=192.168.0.150 NETMASK=255.255.255.255 NETWORK=127.0.0.0 BROADCAST=127.255.255.255 ONBOOT=yes NAME=loopback
- ARP配置 (响应节点配置)
# 网卡行为介绍: # arp响应级别(处理请求) # 0:只要配置了ip就能响应请求 # 1:请求目标地址到达对应网络接口才会响应请求 # arp-ignore: 1 # arp通告行为(返回响应)- 通告即响应 # 0: 本机上任何网络接口都能返回,所有网卡都能接收到请求 # 1:尽可能避免本网卡与不匹配的目标进行响应 # 2:只在本网卡响应 # arp-announce: 2 # 网卡行为配置: # 文件位置:/etc/sysctl.conf # configration for lvs net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.default.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_announce = 2 # 使用命令 sysctl -p 使配置生效
- 添加路由(重启失效,可以添加到开机启动脚本/etc/rc.local中) (响应节点配置)
route add -host 192.168.0.150 dev lo:1
- 配置集群规则(lvs主节点配置)
# -A 表示添加虚拟服务,-t表示tcp协议,-s表示负载均衡算法,rr表示轮询 ipvsadm -A -t 192.168.0.150:80 -s rr # -Ln 表示查看配置 ipvsadm -Ln # -a 表示构建服务节点,-t表示tcp协议,-r表示真实服务器地址,-g表示DR模式 ipvsadm -a -t 192.168.0.150:80 -r 192.168.1.111:80 -g # -E表示修改配置,-p 表示持久化时间,即第一次请求定向到统一服务器的时间 ipvsadm -E -t 192.168.0.150:80 -s rr -p 5 # -Lns 表示查看配置路由定向情况和统一服务访问过期时间 ipvsadm -Lns # 一般保持默认即可,不用配置,三个值表示 tcp tcpfin udp的连接超时时间 ipvsadm --set 1 1 1 # -C清空所有配置 ipvsadm -C
- 当前配置的架构
192.168.1.2 (lvs) -> 192.168.0.150:80 -- 192.168.1.15:80 (real server) -- 192.168.1.16:80 (real server)
- 虚拟机配置需要关闭网络管理器
keepalived + lvs
# /etc/keepalived/keepalived.conf
# 主lvs的keepalived配置:
global_defs {
router_id LVS_15
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 2
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.150
}
}
# 配置集群地址访问的ip和端口,和nginx一致
virtual_server 192.168.0.150 80 {
# 健康检查的时间,单位:s
delay_loop 6
# 负载均衡算法,默认轮询
lb_algo rr
# lvs模式 NAT|TUN|DR
lb_kind DR
# 会话请求持久化间隔时间:单位:s
persistence_timeout 5
# 协议设置
protocol TCP
# 真实服务器配置
real_server 192.168.1.15 80 {
# 轮训权重设置
weight 1
# 健康检查设置
TCP_CHECK {
# 检查的端口
connect_port 80
# 超时时间,单位:s
connect_timeout 2
# 重试次数
nb_get_retry 2
# 间隔时间,单位:s
delay_before_retry 3
}
}
real_server 192.168.1.16 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 2
nb_get_retry 2
delay_before_retry 3
}
}
}
# 备份lvs的keepalived配置:
global_defs {
router_id LVS_16
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 2
# 官方建议相差50
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.150
}
}
# 配置集群地址访问的ip和端口,和nginx一致
virtual_server 192.168.0.150 80 {
# 健康检查的时间,单位:s
delay_loop 6
# 负载均衡算法,默认轮询
lb_algo rr
# lvs模式 NAT|TUN|DR
lb_kind DR
# 会话请求持久化间隔时间:单位:s
persistence_timeout 5
# 协议设置
protocol TCP
# 真实服务器配置
real_server 192.168.1.15 80 {
# 轮训权重设置
weight 1
# 健康检查设置
TCP_CHECK {
# 检查的端口
connect_port 80
# 超时时间,单位:s
connect_timeout 2
# 重试次数
nb_get_retry 2
# 间隔时间,单位:s
delay_before_retry 3
}
}
real_server 192.168.1.16 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 2
nb_get_retry 2
delay_before_retry 3
}
}
}
高性能服务器架构
#优化思路
1.减少请求(合并css,js等,合并图片,添加缓存,减少查库,添加cdn)
2.添加服务器(服务器集群加负载均衡)
nginx统计模块使用 --with-http_stub_status_module 参数重新编译
location /status {
stub_status on;#开启统计模块
access_log off;#关闭日志
allow 127.0.0.1;#只允许指定ip访问
deny all;#禁止其他访问
}
#解决方案
worker_connections #修改工作进程最大链接数
worker_rlimit_nofile #修改nginx进程允许打开的文件数,全局配置
/proc/sys/net/core/somaxconn #加大进程最大连接数
/proc/sys/net/ipv4/tcp_tw_recycle #tcp快速回收 1开启
/proc/sys/net/ipv4/tcp_tw_reuse #tcp重用 1开启
/proc/sys/net/ipv4/tcp_syncookies #tcp洪水抵御 0关闭
ulimit -n 10000 #加大系统允许打开的文件数