Nginx安装与负载均衡

本文详细介绍了Nginx的安装过程,包括安装依赖、编译及配置。接着讲解了Nginx的基本使用,如启动、检查状态以及命令行参数。深入探讨了配置文件的设置,包括网站配置、日志管理和location匹配规则。此外,还阐述了Nginx的反向代理、日志切割、正向代理和负载均衡的概念及配置,特别是负载均衡中的各种算法如轮询、加权轮询和IP_hash等。

Nginx安装与负载均衡

nginx官网

nginx news

nginx安装

安装必要的依赖

yum install gcc gcc-g++ pcre pcre-devel zlib zlib-devel openssl openssl-devel autoconf automake make

下载nginx安装包

wget http://nginx.org/download/nginx-1.22.0.tar.gz

解压安装包

tar vfxz nginx-1.22.0.tar.gz

进入安装包根目录并编译安装

cd nginx-1.22.0
​
# 设置配置项,指定安装位置
./configure --prefix=/usr/local/nginx
​
# 编译安装
make & make install

安装完成后,nginx安装根目录为 /usr/local/nginx

nginx目录结构

conf 配置文件
html 网页文件
logs 日志文件
sbin 主要二进制程序

运行nginx程序

./sbin/nginx

检查nginx是否启动成功

此时,nginx会创建两个进程。master(主进程)和worker(子进程、工作进程)

主进程不负责处理请求和响应,只负责管理子进程

http请求交由子进程进行处理。worker进程可能同时存在多个

浏览器直接访问IP显示nginx欢迎页面

Nginx命令

官方文档:Command-line parameters

./nginx -s stop # 强制关闭
./nginx -s quit # 优雅地关闭
./nginx -s reload # 重新加载配置
./nginx -s reopen # 重新载入日志文件
./nginx -t  # 测试日志文件是否正确

配置项

最基础的配置

worker_processes  1; # 子进程数,推荐配置  CPU数*CPU核数
​
events {
    worker_connections  1024; # 一个子进程最多可以处理多少个连接
}
​
http {
    include       mime.types;
    default_type  application/octet-stream;
​
    sendfile        on;
​
    keepalive_timeout  65;
​
    server { # 虚拟服务,可以存在多个
        listen       80;  # 监听端口
        server_name  localhost;  # 监听域名
​
        location / {  # 访问路由
            root   html;  # 文件路径,可以相对路径(相对于nginx而言),也可以绝对路径
            index  index.html index.htm; # 如果访问url没有指定文件,优先找哪个文件。从前往后找,找到即停
        }
​
        error_page   500 502 503 504  /50x.html;  # 错误响应页面
        location = /50x.html {
            root   html;
        }
​
    }
​
}

增加一个网站

创建网站源代码

新建目录/home/www/www.zy.com,并创建index.html文件

<!--index.html-->
<html>
<meta charset="utf-8">
我是一个静态网站
</html>

添加配置

# 在配置文件中的http下面,复制一个server
http{
    ...
    server {
        listen 80;
        server_name: www.zy.com;
​
        location / {
            root /home/www/www.zy.com;
            index index.html;
        }
    }
    ...
}

重新加载配置项

./nginx -r reload

访问www.zy.com即可看到展示页面

Nginx日志

nginx可以针对不同的server存储不同的日志文件

如何开启日志?

打开日志文件,我们可以看到如下信息

表名当前server的日志存放位置为log/host.access.log,保存格式为main格式

什么是main格式?

日志切割

如果日志文件过大,无论是读取还是查找都会变得非常缓慢。所以我们需要对日志进行切割。

如何切割?就需要利用到linux的定时任务

首先,先了解以下Linux里面用到的一些命令

用到的Linux命令

# linux查看昨天日期
date -d yesterday
​
# 查看并格式化日期
date -d yesterday +"%Y%m%d%H%M%S"

创建Linux可执行脚本

mkdir /usr/local/nginx/data # 创建备份文件存储文件夹
cd /usr/local/nginx/data # 进入文件夹
touch bak_log.sh # 创建可执行文件
chmod 755 bak_log.sh # 添加可执行权限

编写Linux可执行脚本

#!/bin/bash
LOGPATH=/usr/local/nginx/logs/access.log
​
BAK=/usr/local/nginx/data/`date -d yesterday +"%Y%m%d%H%M"`.access.log
​
mv $LOGPATH $BAK
touch $LOGPATH
​
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

设置定时任务

crontab -e
​
# 打开文件中输入
# 分 时 日 月 周 命令
*/1 * * * * sh /usr/local/nginx/data/bak_log.sh

效果展示

Nginx配置

location匹配模式

匹配结果优先级:精准匹配 > 正则匹配 > 普通匹配

精准匹配

location = / {
    root html;
    index index.html;
}

普通匹配

匹配原则:左前缀匹配原则,与书写的先后顺序无关

多命中:普通匹配可以命中多个,如果同时命中多个。则命中最长的生效。

location / {
    root html;
    index index.html;
}

正则匹配

匹配原则:从前往后依次命中,最先命中的生效。与书写的先后顺序有关

location ~ /image {
    root /var/html/image;
    index index.html;
}

Rewrite 重写

常用命令

if (条件) {} 设定条件再进行重写
set 设置变量
return 返回状态码
break 跳出rewrite
rewrite 重写

简单例子

location / {
    ...
    # 封某IP
    if ($remote_addr == 192.168.0.1) { # if后面有个空格,不能少
        return 403;
    }
    # 禁用IE浏览器   
    if ($http_user_agent ~ MSIE) {
        rewrite ^.*$ /ie.html;
        break;
    }
    ...
}

缓存

为所有图片设置一天的缓存

location ~* \.(jpg|jpeg|png|gif){
    expires 1d;
}

反向代理

什么是反向代理?

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

我们换个方式理解,就是当外部网络对内部网络器是不能直接访问的,要通过一个代理服务器才能进行访问,而外部网络看到的只是代理服务器,反馈也是由代理服务器返回的,外部网络对于代理服务器与内部网络直接的具体情况是不可见的。

使用方式

location / {
    proxy_pass http://127.0.0.1:8000; # 指定把请求转发的地址即可
    proxy_set_header Host $host;
}

正向代理

什么是正向代理?

正向代理,也就是我们常说的代理,其工作原理为:我访问不了某个网站,但是我能访问一个代理服务器,这个代理服务器他能访问那个我不能访问的网站,于是我连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来之后返回给我。从网站的角度来说只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理是否告诉网站。

总之,正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标,然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

安装第三方依赖

nginx正向代理需要使用到第三方模块

下载git

yum install -y git

下载第三方模块

git clone https://github.com/chobits/ngx_http_proxy_connect_module.git ~/module/proxy

选择合适的patch包

patch -p1 < ~/module/proxy/patch/proxy_connect_rewrite_102101.patch

编译并安装

./configure --prefix=/usr/local/nginx2 --add-module=~/module/proxy
make & make install

配置

server {
     listen  8848;
​
     resolver  114.114.114.114;
​
     proxy_connect;
     proxy_connect_allow            443 80;
     proxy_connect_connect_timeout  10s;
     proxy_connect_read_timeout     10s;
     proxy_connect_send_timeout     10s;
​
     location / {
         proxy_pass http://$http_host$request_uri;
         proxy_set_header Host $host;
     }
 }

负载均衡

把反向代理指向的目标换成多个,每次访问的时候,按照特定的规则来选择其中的某一个目标进行访问。这就是所谓的负载均衡

配置

​
http {
    ...
    # 把所有的目标放到同一个组里面
    upstream imgserver {
        server 192.168.0.100:8081 weight=1 max_fails=2 fail_timeout=3;
        server 192.168.0.100:8082 weight=1 max_fails=2 fail_timeout=3;
        server 192.168.0.100:8083 weight=1 max_fails=2 fail_timeout=3;
    }
    ...
    
    server{
        location ~* \.(jpg|jpeg|png|gif){
            proxy_pass http://imgserver;
        }  
    }
​
}

负载均衡算法

轮询算法(默认算法)

upstream bakend {    
    server 192.168.0.14;
    server 192.168.0.15;
}  

weight(加权轮询)

upstream bakend {    
    server 192.168.0.14 weight=5;    
    server 192.168.0.15 weight=10;    
}
1.down 表示当前的server暂时不参与负载  
2.weight 默认为1.weight越大,负载的权重就越大。  
3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误  
4.fail_timeout:max_fails次失败后,暂停的时间。  
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。  
nginx支持同时设置多组的负载均衡,用来给不用的server来使用。  
client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug  
client_body_temp_path 设置记录文件的目录 可以设置最多3层目录  
location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

IP_hash

根据请求者ip的hash值将请求发送到后台服务器中,可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。

upstream bakend {    
    ip_hash;    
    server 192.168.0.14:88;    
    server 192.168.0.15:80;    
} 

url_hash(第三方)

根据请求的url的hash值将请求分到不同的机器中,当后台服务器为缓存的时候效率高。

upstream backend {    
    server squid1:3128;    
    server squid2:3128;    
    hash $request_uri;    
    hash_method crc32;    
}  

fair(第三方)

根据后台响应时间来分发请求,响应时间短的分发的请求多。

upstream backend {    
    server server1;    
    server server2;    
    fair;    
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值