zhaobinglong / myBlog

https://zhaobinglong.github.io/myBlog/
MIT License
7 stars 0 forks source link

nginx服务器 #31

Open zhaobinglong opened 4 years ago

zhaobinglong commented 4 years ago

u=3379754713,1922618047 fm=26 gp=0

LNMP环境一键配置

wget http://soft.vpser.net/lnmp/lnmp1.7.tar.gz -cO lnmp1.7.tar.gz && tar zxf lnmp1.7.tar.gz && cd lnmp1.7 && ./install.sh lnmp

参考

https://juejin.im/post/6864085814571335694

zhaobinglong commented 4 years ago

反向代理

反向代理隐藏了服务器的信息,它代理的是服务器端,代其接收请求。换句话说,反向代理的过程中,客户端并不知道具体是哪台服务器处理了自己的请求。如此一来,既提高了访问速度,又为安全性提供了保证

worker_processes 1;
server {
listen 80;
location / {
// 关键就是proxy_pass,它才是真实要访问的地址
proxy_pass http://10.10.10.10:20186; 
}
}

另一个角度解释反向代理

一台服务器上可以开启多个服务,但是大部分的网络http的服务都是走的80端口,一台服务器上的所有服务如何争抢唯一的一个80端呢,这个时候反向代理就发挥作用了,每个服务使用一个唯一的特殊端口,ng根据用户请求的url,把请求转发到最终的端口。最终实现了一台服务器部署多个应用

正向代理和反向代理的区别

在正向代理中,隐藏了客户端信息; 在反向代理中,隐藏了服务端信息;

zhaobinglong commented 4 years ago

负载均衡(Load Balance)

负载均衡实际上就是将大量请求进行分布式处理的策略。


worker_processes 1; // 工作进程数,和CPU核数相同
events {
    worker_connections 1024; // 每个进程允许的最大连接数
}
http {
    // 负载均衡就靠它
    // 语法格式:upstream name {}
    // 里面写的两个server分别对应着不同的服务器
    upstream firstdemo {
        // ip_hash它的作用是如果第一次访问该服务器后就记录,之后再访问都是该服务器了,
        // 这样比如第一次访问是33服务器,那之后再访问也会分配为33服务器访问了
        ip_hash;
        server 39.106.145.33;  // 第一台服务器
        server 47.93.6.93;     // 第二台服务器
    }
    server {
        listen 8080;
        location / {
            proxy_pass http://firstdemo;  // 实现反向代理,代理到firstdemo里两个服务器上
        }
    }
}

负载均衡的策略

轮询 (round-robin)

upstream mysvr { 
    server 127.0.0.1:7878;
    server 192.168.10.121:3333;       
}

加权轮询

upstream mysvr { 
    server 127.0.0.1:7878 weight=1;
    server 192.168.10.121:3333 weight=2;
}

IP 哈希(IP hash)

upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333;
    ip_hash;
}

URL hash

最小连接数

热备

1、热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB.....

upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333 backup;  #热备, 注意这里的关键词backup
}

负载均衡可以添加的参数

参考

https://mp.weixin.qq.com/s/u-XbBwGxHrhJGiMiiqz26w

zhaobinglong commented 4 years ago

配置子域名和子站点

cd /usr/local/nginx/conf/vhost,进入nginx的vhost文件夹,新建xxx.conf文件,

server {
    listen 80;
    server_name  sub.examlab.cn;

    index index.html index.php;

    root /home/wwwroot/default/haircut/admin/public; // Tips: 子站点的根目录配置在这里

    error_log logs/test.cos.com.error_log;
    access_log logs/test.cos.com.access_log;

   // Tips:如果是静态的站点,location就不用配置了
   // 如果是php动态站点,要注意这里的 fastcgi_pass,
   // fastcgi_pass有两种配置值,要根据当前服务器上php的listen方式来配置
   location ~ [^/]\.php(/|$)
        {
            try_files $uri =404;
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
}

配置子域名后测试子域名的配置文件是否有语法错误

// 直接在命令行运行
nginx -t -c xxx.conf
zhaobinglong commented 4 years ago

配置https

server {
    listen 80;
    listen 443 ssl;
    ssl_certificate /usr/local/nginx/conf/3690180__examlab.cn.pem;     // Tips:证书的pem文件,一般申请https证书时候得到
    ssl_certificate_key /usr/local/nginx/conf/3690180__examlab.cn.key; // Tips:证书的key文件,

    server_name webpic.examlab.cn;
    ···
zhaobinglong commented 4 years ago

限制IP访问的频率和并发量

http{  
       ...  
       limit_req_zone$binary_remote_addr zone=allips:10m rate=20r/s;  
       解释:#定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,  
            #以$binary_remote_addr为key,限制平均每秒的请求为20个,  
            #1M能存储16000个状态,rete的值必须为整数,  
            #如果限制两秒钟一个请求,可以设置成30r/m  
       ...  
       server{  
         ...  
         location {  
           ...  
           limit_reqzone=allips burst=5 nodelay;  
           解释: #限制每ip每秒不超过20个请求,漏桶数burst为5  
                 #brust的意思就是,如果第1秒、2,3,4秒请求为19个,  
                 #第5秒的请求为25个是被允许的。  
                 #但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。  
                 #nodelay,如果不设置该选项,严格使用平均速率限制请求数,  
                 #第1秒25个请求时,5个请求放到第2秒执行,  
                 #设置nodelay,25个请求将在第1秒执行。  
           ...  
         }  
         ...  
       }  
       ...  
}

CC攻击

CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。

cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数来防cc攻击。

HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。一旦并发连接超过指定数量,就会返回503错误。

HttpLimitConnModul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令

这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制

zhaobinglong commented 4 years ago

可视化实时日志监控

$ wget https://tar.goaccess.io/goaccess-1.4.tar.gz
$ tar -xzvf goaccess-1.4.tar.gz
$ cd goaccess-1.4/
$ ./configure --enable-utf8 --enable-geoip=legacy
$ make
# make install

安装后截图

image

指定可视化文件名字和路径

// 在serer中添加下面的代码,go.html是名字,可以随意取
location /go.html {
      alias /homw/wwwroot/default/report/go.html;
}

执行可视化命令

// 在nginx/logs目录下,执行:
goaccess access.log -o /home/wwwroot/default/report/go.html --real-time-html --time-format='%H:%M:%S'  --date-format='%d/%b/%Y' --log-format=COMBINED

访问面板

https://examlab.cn/go.html

面板

第一次安装,发现90%的流量都来自数据库主页的访问,黑客无时无刻不再扫描这互联网上的漏洞 image

参考

https://www.chenleilei.net/article/50.html https://goaccess.io/ https://www.cnblogs.com/zkfopen/p/10126959.html

zhaobinglong commented 4 years ago

数据库子域名访问配置

zhaobinglong commented 4 years ago

shell命令分析服务器日志

1、查看有多少个IP访问:

awk '{print $1}' log_file|sort|uniq|wc -l

2、查看某一个页面被访问的次数:

grep "/index.php" log_file | wc -l

3、查看每一个IP访问了多少个页面:

awk '{++S[$1]} END {for (a in S) print a,S[a]}' log_file > log.txt

参考

https://segmentfault.com/a/1190000009745139

zhaobinglong commented 4 years ago

alias重定向跳转地址

// 在serer中添加下面的代码,go.html是名字,可以随意取
// url中访问go.html,实际返回的是指定的html文件
location /go.html {
      alias /homw/wwwroot/default/report/go.html;
}
zhaobinglong commented 4 years ago

nginx三种地址重写

强制转换url

  rewrite url

访问指定目录

  alias 目录

访问指定url,并不会改变当前地址栏上的url

// 将请求全部代理到新地址
location / {
            proxy_pass http://http_server_pool;
}

// 将指定url中的请求代理到新地址
// 注意:如果proxy_pass后面的新地址最后没有/,则只是替换旧地址的域名,匹配到的规则会一起应用到新地址
location ^~ /army/ {
        proxy_set_header X_Real_IP $remote_addr;
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:3000; // 这里代理一个在3000端口的上的nodejs应用
        proxy_redirect off;
}

  proxy_pass url