Nginx安装与使用

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;    
}  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值