文章目录
1. 下载nginx安装包
# wget http://nginx.org/download/nginx-1.16.0.tar.gz
2. 解压缩安装包
# tar -zxvf nginx-1.16.0.tar.gz
3. 编译安装nginx
安装前请先安装gcc、make,本次编译并未编译其他模块并且没有将指定功能开关打开或者关闭,后期逐步完善。
1.yum -y install gcc automake autoconf libtool make
2.yum install gcc gcc-c++
# tar -zxvf nginx-1.16.0.tar.gz
# cd nginx-1.16.0
# ./configure && make && make install
4. nginx基础配置
4.1 虚拟主机配置(web服务)
虚拟主机:在一台服务器上设置多个Web站点
#定义两台虚拟主机
server {
#此处可以将listen监听端口配置放在http块的全局配置中
listen 8888;
server_name www.test11.com;
location / {
root /var/www/test1 ;
index test1.html ;
}
}
server {
#此处可以将listen监听端口配置放在http块的全局配置中
listen 8888;
server_name www.test22.com;
location / {
root /var/www/test2 ;
index test2.html ;
}
}
4.1.1 访问测试一下
在电脑上设置hosts解析或者配置域名服务器,如下配置:
# 192.168.1.8 www.test11.com www.test22.com
4.2 负载均衡配置
引用网友博客:https://www.cnblogs.com/qlqwjy/p/8536779.html
负载均衡:分摊到多个操作单元上进行执行,和它的英文名称很匹配。就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。
upstream目前支持的分配算法:
1)、轮询 ——1:1 轮流处理请求(默认)
每个请求按时间顺序逐一分配到不同的应用服务器,如果应用服务器down掉,自动剔除,剩下的继续轮询。
2)、权重 ——you can you up
通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况。
3)、ip_哈希算法
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个应用服务器,可以解决session共享的问题。
#定义后端真正提供服务的业务服务器信息
upstream realserver2 {
server 192.168.1.9:8089 ;
server 192.168.1.10:8088 ;
}
server {
listen 7777;
server_name www.test33.com;
location / {
#将用户请求转发至upstream块中定义的服务器组
proxy_pass http://realserver2;
}
}
#nginx其他配置
1)down
表示单前的server暂时不参与负载
2)Weight
默认为1.weight越大,负载的权重就越大。
3)max_fails
允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4)fail_timeout
max_fails 次失败后,暂停的时间。
5)Backup
其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
4.3 keepalived+nginx实现负载均衡高可用web集群
角色 | IP |
---|---|
nginx+keepalived(master) | 192.168.1.8 |
nginx+keepalived(backup) | 192.168.1.6 |
web服务器(httpd) | 192.168.1.9 |
web服务器(httpd) | 192.168.1.10 |
#keepalived安装(192.168.1.8)
yum install keepalived -y
cat /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_nginx {
script /root/check_nginx.sh
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.22/24 dev ens33 label ens33:1
}
track_script {
check_nginx
}
}
EOF
#keepalived安装(192.168.1.6)
yum install keepalived -y
cat /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_nginx {
script /root/check_nginx.sh
interval 2
}
vrrp_instance VI_1 {
#此处与master不一致
state BACKUP
interface ens33
virtual_router_id 51
#此处与master不一致
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.22/24 dev ens33 label ens33:1
}
track_script {
check_nginx
}
}
EOF
#服务检测脚本
[root@localhost keepalived]# cat /root/check_nginx.sh
#!/bin/bash
status_code=$(netstat -tunlp|grep 7777|awk -F":" '{print $2}'|cut -c 1-5)
if [ -z $status_code];then
systemctl stop keepalived
fi
4.4 nginx location解析
一直搞不懂这块,今天看了一篇博文,还不错,果断收藏。
转载自博友 https://blog.csdn.net/fengzyf/article/details/88954599
访问nginx: 首先要匹配location中的uri 规则, 匹配上后, 然后再将root指定的根目录,拼接上location 上的路径, 再拼接上该目录下的文件, 这才是最终访问的路径, 目前不知道为什么是这样做, 理解不了, 只能先记住。
location [=|~|~*|^~|@] /uri/ { … } 分为两种location: 正则location 和 普通location
一: 正则location: “~ ”和“~* ”前缀表示正则location, “~ ”区分大小写,“~* ”不区分大小写;
二: 普通location: 其他前缀(包括:“=”,“^~ ”和“@ ”)和无任何前缀的都属于普通location 。
普通location 和 正则location 匹配规则是:先匹配普通location (再匹配正则表达式)
普通location 之间匹配规则 --> 最大前缀匹配
例如:location /prefix/mid/ {} 和 location /prefix/ {} , 对于HTTP 请求/prefix/mid/t.html ,(首先看是两个普通location比较,所以是最大前缀匹配规则;)
前缀匹配的话两个location 都满足,选哪个?原则是:the most specific match ,于是选的是location /prefix/mid/ {} )。
“正则location ”与“正则location”内部的匹配规则是:
按照正则location 在配置文件中的物理顺序(编辑顺序)匹配的,并且只要匹配到一条正则location ,就不再考虑后面的
“普通location ”的最大前缀匹配结果与继续搜索的“正则location ”匹配结果的决策关系。
如果继续搜索的“正则location ”也有匹配上的,那么“正则location ”覆盖 “普通location ”的最大前缀匹配
通常的规则是,匹配完了“普通location ”指令,还需要继续匹配“正则location ”,但是你也可以告诉Nginx :
匹配到了“普通location ”后,不再需要继续匹配“正则location ”了,要做到这一点只要在“普通location ”前面加上“^~ ”符号(^ 表示“非”,~ 表示“正则”,字符意思是:不要继续匹配正则)。
“^~ ”和“= ”都能阻止继续搜索正则location 的话,区别:
共同点是它们都能阻止继续搜索正则location ,不同点是“^~ ”依然遵守“最大前缀”匹配规则,然而“= ”不是“最大前缀”,而是必须是严格匹配(exact match )。
5. nginx.conf文件解释
全局块 {
#配置Nginx worker进程最大打开文件数
worker_rlimit_nofile:65535;
#开启8个工作进程
worker_processes 8;
#使用8核cpu,利用多核来处理任务
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
}
events {
#单个进程允许的客户端最大连接数
worker_connections 20480;
}
http {
#此配置并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。
server_tokens off;
# 这里形如text/html格式的字符串就是用来说明数据类型的,
/前的是主类型,/之后的是该主类型下的子类型。
详细的类型定义在RFC2046中。
Nginx通过服务器端文件的后缀名来判断这个文件属于什么类型,
再将该数据类型写入HTTP头部的Content-Type字段中,发送给客户端。
include /apps/srv/nginx/conf/mime.types;
#减少上下文切换,简单说,sendfile是个比 read 和 write 更高性能的系统接口, 不过需要注意的是,sendfile 是将 in_fd 的内容发送到 out_fd 。而 in_fd 不能是 socket , 也就是只能文件句柄。 所以当 Nginx 是一个静态文件服务器的时候,开启 SENDFILE 配置项能大大提高 Nginx 的性能。 但是当 Nginx 是作为一个反向代理来使用的时候,SENDFILE 则没什么用了,因为 Nginx 是反向代理的时候。 in_fd 就不是文件句柄而是 socket,此时就不符合 sendfile 函数的参数要求了。sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
send_file on;
#设置变量值
map $sent_http_set_cookie $resp_uuid {
~*PHPSESSID=(?<u>[0-9a-z]+) $u;
default $cookie_PHPSESSID;
}
tcp_nopush on;
server_names_hash_bucket_size 128;
#Nginx 使用 keepalive_timeout 来指定 KeepAlive 的超时时间(timeout)。指定每个 TCP 连接最多可以保持多长时间。Nginx 的默认值是 75 秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为 0,就禁止了 keepalive 连接。
keepalive_timeout 60;
#见buffer是什么?
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_ignore_client_abort on;
#指定nginx与后端fastcgi server连接超时时间
fastcgi_connect_timeout 30;
#指定nginx向后端传送请求超时时间(指已完成两次握手后向fastcgi传送请求超时时间)
fastcgi_send_timeout 30;
#指定nginx接受后端fastcgi响应请求超时时间 (指已完成两次握手后nginx接受fastcgi响应请求超时时间)
fastcgi_read_timeout 30;
#指定logFormat格式,在文件中指定
include /apps/srv/nginx/conf/logFormat.conf;
include /apps/srv/nginx/conf/conf.d/cache/*.conf;
include /apps/srv/nginx/conf/upstream.conf;
include /apps/srv/nginx/conf/conf.d/*.conf;
#access日志格式,main是指给日志格式起的名字
access_log /apps/srv/nginx/logs/access.log main;
}
- buffer 是什么?
buffer ,即缓冲区,它在 Nginx 上发挥的作用就是 启用一个缓冲区,先在这个缓冲区内进行存储,再把数据发送出去 。和在线观看视频有点类似,先把视频文件缓冲一部分到本地再开始播放。
若没有 buffer,数据将会直接从 Nginx 传输到客户端。假设如果客户端的加载速度足够快,你可以直接把 buffer 关掉,让数据尽可能快地到达客户端。
而使用 buffer,Nginx 将会临时存储后端 response 到缓冲区,然后慢慢把数据发送到客户端。启用 buffer 的好处在于可以把数据一次性地发送给目标,相较于即时传输可以节约出这部分带宽。
顺带一提,Nginx 全局配置中的 tcp_nopush 的作用就是 数据包会累计到一定大小之后才会发送 。而 tcp_nodelay 是尽快发送数据,所以若你启用了 buffer,建议关闭 tcp_nodelay。 - index指令的作用:
- 该指令后面可以跟多个文件,用空格隔开;
- 如果包括多个文件,Nginx会根据文件的枚举顺序来检查,直到查找的文件存在;
- 文件可以是相对路径也可以是绝对路径,绝对路径需要放在最后;
- 文件可以使用变量$来命名;