Nginx安装与负载均衡
什么是nginx?
nginx是一个提供HTTP服务的一个服务器。负责把我们的静态资源通过http的形式返回给浏览器。
nginx官网
http://nginx.org/
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默认监听的是80端口
Nginx命令
官方文档:http://nginx.org/en/docs/switches.html
./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
格式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SX0Z4LfW-1667380865765)(images/image-20220924160453011.png)]
什么是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;
}