锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Nginx一篇从入门到实战

时间:2023-09-07 04:07:02 635k后传感器

Nginx安装
Windows10 安装
Nginx官网:http://nginx.org/en/download.html

下载历史版地址:http://nginx.org/download/

1.下载压缩包:nginx-1.8.0.zip

2.记住解压下载的压缩包,并记住解压路径(D:\Environment\nginx\nginx-1.8.0)

3.打开控制台(cmd)进入Nginx安装包根路径(D:\Environment\nginx\nginx-1.8.0)

5.启动输入命令nginx服务:start nginx

6.访问浏览器localhost,便可看到nginx安装运行成功的页面(默认监控端口80)

7、nginx命令

命令 描述
start nginx 开启nginx服务
nginx.exe -s stop 关闭nginx服务,快速停止nginx,相关信息可能不保存
nginx.exe -s quit 关闭nginx服务,完全有序地停止nginx,并保存相关信息
nginx.exe -s reload 重启Nginx服务,一般修改配置文件,使修改生效
nginx -c 指定新的命令参数nginx替换默认配置文件nginx配置文件
nginx -t 检查配置文件是否检查配置文件是否成功配置
nginx -s reopen 重新打开日志文件命令
nginx -v 简单显示nginx的版本信息(nginx version)
nginx -V 不但显示nginx版本信息,也显示nginx配置参数信息
8、参数解读

-v 可查看nginx的版本。
-V 可查看nginx的详细信息,包括编译的参数。
-t 可用来测试nginx语法错误的配置文件。
-T 可用来测试nginx语法错误的配置文件也可以通过重定向备份nginx配置文件。
-q 如果配置文件中没有错误的信息,则不会有任何提示。如果有错误,则提示错误的信息和-t配合使用。
-s 发送信号给master处理:
stop 立刻停止nginx服务,无论请求是否处理,
quit 优雅的退出服务,处理当前退出请求
reopen 重新打开日志文件,提前备份原日志文件,更名。
reload 重载配置文件
-p 设置nginx默认情况下,默认为编译时的安装路径
-c 设置nginx默认为家庭目录下的配置文件
-g 设置nginx该变量将覆盖配置文件中的变量。
1
2
3
4
5
6
7
8
9
10
11
12
13
9.问题方案:不能关闭nginx?

nginx -s stop:后来用任务管理器看看有没有。nginx.exe进程
cmd执行命令:netstat -ano|find “0:80” 看端口是否还开着
cmd执行命令:tasklist | findstr “nginx” 查看nginx过程还在运行吗?
假如没有过程,端口也没有打开,说明您访问浏览器缓存,F刷新消失了
window 下杀死所有nginx进程:taskkill /fi “imagename eq nginx.EXE” /f
强制关闭一切nginx可用命令:taskkill /F /IM nginx.exe > nul (可能有多开nginx的情况)
10、目录介绍

conf # 记录所有配置
nginx.conf # 默认主要配置部件
html # 这是编译安装的时候Nginx默认站点记录
50x.html # 错误??
index.html # 默认??
logs # nginx默认路径包括错误路径和访问路径
access.log # nginx访问?志
error.log # 错误?志
nginx.pid # nginx启动后的过程id
nginx.exe # 启动命令
1
2
3
4
5
6
7
8
9
10
Linux 安装
安装环境:CentOS 7.X 64位 ,阿里云或阿里云或虚拟机。

1.安装依赖:

yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel wget
1
2、Nginx下载:

wget -P /opt/ http://nginx.org/download/nginx-1.18.0.tar.gz
1
3、Nginx解压进入目录:

tar -zxvf nginx-1.18.0.tar.gz

cd nginx-1.18.0
1
2
3
4、Nginx安装:

# ./configure --prefix=/usr/local/nginx --user=www --group=www

./configure
make && make install
1
2
3
4
5.安装后的路径为(默认):/usr/local/nginx

6、预编译:

# 预编译主要用于检查系统环境是否符合软件包安装条件,生成makefile文件编译、安装、升级nginx指出相应的参数。

./configure -h 编译参数可以查看
使用--prefix选项可以指定nginx编译安装目录;
--user=*** 指定nginx的所属用户
--group=*** 指定nginx的所属组
--with-*** 指定编译模块
--without-** 指定不编译模块
--add-module 编译第三方模块

==============================================================
# 预编译完成后,将生成一个Makefile将定义文件make相关参数:
$ Z ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README src

$ cat Makefile

default: build
clean:
&nbp;     rm -rf Makefile objs
build:
    $(MAKE) -f objs/Makefile
install:
    $(MAKE) -f objs/Makefile install
modules:
    $(MAKE) -f objs/Makefile modules
upgrade:
    /usr/local/nginx/sbin/nginx -t

    kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
    sleep 1
    test -f /usr/local/nginx/logs/nginx.pid.oldbin

    kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
    
====================================
make clean : 重新预编译时,通常执行这条命令删除上次的编译文件
make build : 编译,默认参数,可省略build参数
make install : 安装
make modules : 编译模块
make upgrade : 在线升级
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
7、Nginx命令

查询版本号:/usr/local/nginx/sbin/nginx -v

普通启动服务:/usr/local/nginx/sbin/nginx

配置文件启动:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

暴力停止服务:/usr/local/nginx/sbin/nginx -s stop

优雅停止服务:/usr/local/nginx/sbin/nginx -s quit

检查默认配置:/usr/local/nginx/sbin/nginx -t

检查指定配置:/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf

重新加载配置:/usr/local/nginx/sbin/nginx -s reload

查看相关进程:ps -ef | grep nginx

查看相关端口:lsof -i:80

杀掉相关进程:kill -9 PID

8、⽬录核⼼介绍

conf                         # 所有配置⽂件⽬录
    nginx.conf                 # 默认的主要的配置⽂件
    nginx.conf.default      # 默认模板
html                         # 这是编译安装时Nginx的默认站点⽬录
    50x.html                 # 错误⻚⾯
    index.html                 # 默认⾸⻚
logs                         # nginx默认的⽇志路径,包括错误⽇志及访问⽇志
    access.log                 # nginx访问⽇志
    error.log                 # 错误⽇志
    nginx.pid                 # nginx启动后的进程id
sbin                         # nginx命令的⽬录
    nginx                     # 启动命令
1
2
3
4
5
6
7
8
9
10
11
12
Nginx卸载

1.首先输入命令 ps -ef | grep nginx检查一下nginx服务是否在运行。

2.停止Nginx服务

3.查找、删除Nginx相关文件

查看Nginx相关文件:whereis nginx

find查找相关文件:find / -name nginx

依次删除find查找到的所有目录:rm -rf /usr/sbin/nginx

4.再使用yum清理:yum remove nginx

[root@localhost /]# yum remove nginx
依赖关系解决

======================================================================================================
 Package                              架构            版本                       源              大小
======================================================================================================
正在删除:
 nginx                                x86_64          1:1.12.2-3.el7             @epel          1.5 M
为依赖而移除:
 nginx-all-modules                    noarch          1:1.12.2-3.el7             @epel          0.0  
 nginx-mod-http-geoip                 x86_64          1:1.12.2-3.el7             @epel           21 k
 nginx-mod-http-image-filter          x86_64          1:1.12.2-3.el7             @epel           24 k
 nginx-mod-http-perl                  x86_64          1:1.12.2-3.el7             @epel           54 k
 nginx-mod-http-xslt-filter           x86_64          1:1.12.2-3.el7             @epel           24 k
 nginx-mod-mail                       x86_64          1:1.12.2-3.el7             @epel           99 k
 nginx-mod-stream                     x86_64          1:1.12.2-3.el7             @epel          157 k

事务概要
======================================================================================================
移除  1 软件包 (+7 依赖软件包)

安装大小:1.9 M
是否继续?[y/N]:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Docker 安装
Docker 安装

# 1.下载nginx1.18的docker镜像
docker pull nginx:1.18

# 2.先运行一次容器(为了拷贝容器内nginx配置文件),:
docker run -itd -p 80:80 --name nginx --restart=always -e TZ="Asia/Shanghai" nginx:1.18

# 3.创建需要挂载的目录
# conf 目录用来存放nginx.conf配置文件
# conf.d 目录用来存放独立导入的conf(include /etc/nginx/conf.d/*.conf;)
# logs 用来存放日志文件的
# www 新建的,用来挂载后面新起的服务或者静态资源
# html nginx主页存放路径
mkdir -p /data/nginx/{conf,conf.d,logs,html,www}

# 4.拷贝配置文件
docker cp nginx:/etc/nginx/nginx.conf /data/nginx/conf/
docker cp nginx:/etc/nginx/conf.d/ /data/nginx/

# 5.删除容器
docker rm -f nginx

# 6.再次运行容器,并且挂载配置文件等目录
docker run -itd --name nginx -p 80:80 \
 -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
 -v /data/nginx/conf.d:/etc/nginx/conf.d \
 -v /data/nginx/logs:/var/log/nginx \
 -v /data/nginx/html:/usr/share/nginx/html \
 -v /data/nginx/www:/usr/share/nginx/www \
 nginx:1.18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Docker-compose安装

编写文件:docker-compose.yml
version: "3.1"
services: 
  nginx: 
    restart: always
    container_name: nginx
    image: daocloud.io/library/nginx:1.18.0
    ports: 
      - 80:80
    volumes: 
      - /opt/docker_nginx/conf.d:/etc/nginx/conf.d
1
2
3
4
5
6
7
8
9
10
**附:**Docker安装Nginx的核心目录及文件路径(主要为标记的 1-4)

/etc/nginx                  # 所有Nginx⽂件⽬录
=================================================
/etc/nginx/nginx.conf       # Nginx配置文件(1)
/etc/nginx/conf.d/          # Nginx子配置文件目录(2)
    *.conf                  # conf文件
/var/log/nginx/             # 日志文件存放目录(3)
    access.log              # nginx访问⽇志
    error.log               # 错误⽇志
/usr/share/nginx/html/      # 这是编译安装时Nginx的默认站点⽬录(4)
    50x.html                # 错误⻚⾯
    index.html              # 默认⾸⻚
=================================================
1
2
3
4
5
6
7
8
9
10
11
12
Nginx核心基础
默认配置文件详解
全局块配置
events 块配置
http 块配置
server 主机设置
location(URL匹配特定位置的设置)
Nginx 配置文件结构
# 1.全局块
...             
# 2.events块
events {         
   ...
}
# 3.http块
http {
    # 3.1 http全局块
    ...
    # 3.2 虚拟主机server块
    server { 
        # 1) server全局块
        ...       
        # 2) location块
        location [PATTERN] {
            ...
        }
        location [PATTERN] {
            ...
        }
        ...
    }
    server {
      ...
    }
    ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
默认的nginx.conf 文件:
# 每个配置项由配置指令和指令参数 2 个部分构成

# user  nobody;            # 指定Nginx Worker进程运⾏以及⽤户组
worker_processes  1;

#error_log  logs/error.log;                # 错误日志的存放路径  和错误日志
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;                # 进程PID存放路径

# 事件模块指令,用来指定Nginx的IO模型,
# Nginx支持的有select、poll、kqueue、epoll 等。
# 不同的是epoll用在Linux平台上,而kqueue用在BSD系统中,对于Linux系统,epoll工作模式是首选
events {
    use epoll;
    # 定义Nginx每个进程的最大连接数, 作为服务器来说: worker_connections * worker_processes,
    # 作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2。
    #因为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接
    worker_connections  1024;
}

# 设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    # 设定mime类型,类型由mime.type文件定义
    include       mime.types;
    default_type  application/octet-stream;


    # $remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
    # $remote_user:用来记录客户端用户名称;
    # $time_local: 用来记录访问时间与时区;
    # $request: 用来记录请求的url与http协议;
    # $status: 用来记录请求状态;成功是200,
    # $body_bytes_sent :记录发送给客户端文件主体内容大小;
    # $http_referer:用来记录从那个页面链接访问过来的;
    # $http_user_agent:记录客户浏览器的相关信息;
    # 日志格式设置:
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
    
    # 定义日志输出的路径和模板
    #access_log  logs/access.log  main;
    
    # 是否开启高效传输模式 on开启 off关闭
    sendfile        on;
    
    # 减少网络报文段的数量
    #tcp_nopush     on;

    # 客户端连接保持活动的超时时间,超过这个时间之后,服务器会关闭该连接
    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    # 虚拟主机的配置
    server {
        listen       80;            # 虚拟主机的服务端口
        server_name  aabbcc.com;    # 用来指定IP地址或域名,多个域名之间用空格分开

        #charset koi8-r;

        # 虚拟主机使用的日志路径和模板
        #access_log  logs/host.access.log  main;

        # URL地址匹配
        location / {
            root   html;        # 服务默认启动目录
            index  index.html index.htm;    # 默认访问文件,按照顺序找
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;    # 错误状态码的显示页面
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    server {
        listen       80;
        server_name  aabbccdd.com;
    location / {
            root   html;
            index  xdclass.html;
        }
     }

    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

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


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

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

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
反向代理与动静分离
反向代理服务器
什么是虚拟主机( server{} )
指在一台物理主机服务器上划分出多个磁盘空间,每个磁盘空间都是一个虚拟主机,每台虚拟主机都可以对外提供Web服务,并且互不干扰,就类似虚拟机
利用虚拟主机把多个不同域名的网站部署在同一台服务器上,节省了服务器硬件成本和相关的维护费用
案例一:通过建通不同的域名和端口号访问不同的server 和 本地不同的html
# 访问http://aabbcc.com 返回的是 aabbcc.html
server {
    listen       80;
    server_name  aabbcc.com;  
    # 访问本地绝对路径下的静态html
    location / {
        root   /usr/local/nginx/html;
         index  aabbcc.html;
    }
}

# 访问http://aabbccdd.com 返回的是 aabbccdd.html
server {
    listen       80;
    server_name  aabbccdd.com;
    # 访问本地相对路径下的静态html  
    location / {
        root   html;
        index  aabbccdd.html;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
案例二:通过不同server监听不同的域名和端口叫跳转不同的资源(或local/path 监听不同的/path 范访问不同的资源)
# 访问:127.0.0.1:82 将访问CSDN
server {
    listen       81;
    server_name  127.0.0.1;
    location ~ /csdn/ {
        proxy_pass https://www.csdn.net/;
    }
}
# 访问:127.0.0.1:82 将访问百度
server {
    listen       82;
    server_name  127.0.0.1;
    location ~ /baidu/ {
        proxy_pass https://www.baidu.com/;
    }
}

server {
    listen       80;
    server_name  127.0.0.1;
    
    # 访问:127.0.0.1/csdn/ 将访问CSDN
    location ~ /csdn/ {
        proxy_pass https://www.csdn.net/;
    }
    
    # 访问:127.0.0.1/baidu/ 将访问百度
    location ~ /baidu/ {
        proxy_pass https://www.baidu.com/;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
静态资源服务器
文件图片服务器
Web项目图片基本都是上传到项目本身,这种方式现在项目中很少用了
现在公司一般会使用图片服务器 或者 云厂商提供的CDN
使用流程:前端提交图片->后端处理->存储到图片服务器->拼接好访问路径存储到数据库和范围前端
server {
    listen       80;
    server_name  localhost;
    
    # 访问本地相对路径下的静态html
    location / {
        # root D:/nginx/www;
        root   www;
        index  index.html index.htm;
    }

    # 对静态资源进行映射,访问路径拼接 upload 访问本地绝对路径下的某图片 
    location /upload/ {
        alias /usr/local/software/img/;
        autoindex on;    # 开启目录文件列表
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
注:root与alias的使用区别

1、root访问的资源路径为 root指定地址+location访问地址,alias访问的资源路径为 alias指定路径;

2、alias只能用于location中,但root在server、http以及location中都能使用;

3、alias后面指定路径必须以 " / " 结尾,是一个文件夹,但root可以不要"/"结尾。

# 用户访问地址:http://location/images/login.jpg
 
# root模式下:访问的资源路径为: E:/public/images/login.jpg
location /images/ {
    root E:/public;
}
# alias模式下:访问的资源路径为: E:/public/login.jpg
location /images/ {
    alias E:/public/;
}
1
2
3
4
5
6
7
8
9
10
开启网站目录浏览
1、开启全站目录浏览功能:nginx.conf,在http下面添加以下内容:

http {
    autoindex on;                      # 开启目录文件列表
    autoindex_exact_size on;          # 显示出文件的确切大小,单位是bytes(KB)
    autoindex_localtime on;          # 显示文件修改时间为服务器本地时间,否则以gmt时间显示
    charset utf-8,gbk,gb2312;         # 避免中文乱码
    
    add_header Content-Disposition attachment; # 文件下载(可以不开启该功能)
    # ...
}
1
2
3
4
5
6
7
8
9
2、开启网站部分目录浏览功能:nginx.conf ,在server {} 模块或者 localtion 模块下加入以下内容:

# server {}
server {
    autoindex on;                  # 开启目录文件列表
    autoindex_exact_size on;      # 显示出文件的确切大小,单位是bytes
    autoindex_localtime on;      # 显示的文件时间为文件的服务器时间
    charset utf-8,gbk,gb2312;      # 避免中文乱码
}

# localtion下
server {
    location / {
        root E:/public;
        alias /usr/local/nginx/logs/;# 需要访问的目录
        autoindex on;                   # 开启目录文件列表
        autoindex_exact_size on;       # 显示出文件的确切大小,单位是bytes
        autoindex_localtime on;       # 显示的文件时间为文件的服务器时间
        charset utf-8,gbk,gb2312;       # 避免中文乱码
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
目录访问加密
这个功能特性是由ngx_http_auth_basic_module提供的,默认编译nginx时会编译好,主要有以下两个指令。

Syntax:    auth_basic string | off;
Default:    
auth_basic off;
Context:    http, server, location, limit_except
1
2
3
4
Syntax:    auth_basic_user_file file;
Default:    —
Context:    http, server, location, limit_except
1
2
3
认证的配置可以在http指令块,server指令块,location指令块配置。

auth_basic string :定义认证的字符串,会通过响应报文返给客户端,也可以通过这个指令关闭认证。

auth_basic_user_file file :定义认证文件。

实例:

# 对匹配目录加密:
location /img {
    alias /usr/local/nginx/logs/;
    auth_basic "User Auth";
    auth_basic_user_file /usr/local/nginx/conf/auth.passwd;
}
1
2
3
4
5
6
auth_basic:设置名字
auth_basic_user_file :用户认证文件放置路径
生成认证文件:

# 安装工具
$ yum install -y httpd-tools

# 输入两次密码确定。
$ htpasswd  -c /usr/local/nginx/conf/auth.passwd admin
1
2
3
4
5
重启服务后,访问验证:

会弹出弹窗,需要输入账号/密码。它不仅可以设置访问指定目录时认证还可以直接在访问首页时认证。

如果需要关闭可以使用auth_basic off,或者直接将这两段注释掉。

htpasswd命令工具:

htpasswd(选项)(参数)
选项
-c:创建一个加密文件;
-n:不更新加密文件,只将加密后的用户名密码显示在屏幕上;
-m:默认采用MD5算法对密码进行加密;
-d:采用CRYPT算法对密码进行加密;
-p:不对密码进行进行加密,即明文密码;
-s:采用SHA算法对密码进行加密;
-b:在命令行中一并输入用户名和密码而不是根据提示输入密码;
-D:删除指定的用户。

# 添加用户名及密码:
htpasswd -b /usr/local/nginx/conf/auth.passwd liusx password

# 更新密码:
htpasswd  -D  /usr/local/nginx/conf/auth.passwd liusx
htpasswd -b  /usr/local/nginx/conf/auth.passwd liusx liusx666
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Nginx日志挖掘
Nginx访问日志详解
access.log日志作用:

统计站点访问ip来源、某个时间段的访问频率
查看访问最频的页面、Http响应状态码、接口性能
接口秒级访问量、分钟访问量、小时和天访问量
…等等
默认配置解析

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
1
2
3
案例:access.log
122.70.148.18 - - [04/Aug/2020:14:46:48 +0800] "GET /user/api/v1/product/order/query_state?product_id=1&token=xdclasseyJhbGciOJE HTTP/1.1" 200 48 "https://xdclass.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
1
解析
# 用以记录客户端的ip地址
$remote_addr 对应的是真实日志里的122.70.148.18,即客户端的IP。

# 即记录客户端用户名称
$remote_user 对应的是第二个中杠“-”,没有远程用户,所以用“-”填充。

# 用来记录访问时间与时区
[$time_local]对应的是[04/Aug/2020:14:46:48 +0800]。

# 用来记录请求的url与http协议
“$request”对应的是"GET /user/api/v1/product/order/query_state?product_id=1&token=xdclasseyJhbGciOJE HTTP/1.1"。

# 用来记录请求状态
$status对应的是200状态码,200表示正常访问。

# 记录发送给客户端文件主体内容大小
$body_bytes_sent对应的是48字节,即响应body的大小。

# 用来记录从那个页面链接访问过来的
“$http_referer” 对应的是”https://xdclass.net/“,若是直接打开域名浏览的时,referer就会没有值,为”-“。

# 记录客户浏览器的相关信息
“$http_user_agent” 对应的是”Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:56.0) Gecko/20100101 Firefox/56.0”。

# 用以记录客户端的ip地址
“$http_x_forwarded_for” 对应的是”-“或者空。

# 通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_addr拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Nginx日志实战统计
1、Nginx统计站点访问量、高频url统计

查看访问最频繁的前100个IP
# 查看访问最频繁的前100个IP
awk '{print $1}' access_temp.log | sort -n |uniq -c | sort -rn | head -n 100

# 统计访问最多的url 前20名
cat access_temp.log |awk '{print $7}'| sort|uniq -c| sort -rn| head -20 | more
1
2
3
4
5
基础
awk 是文本处理工具,默认按照空格切分,$N 是第切割后第N个,从1开始

sort命令用于将文本文件内容加以排序,-n 按照数值排,-r 按照倒序来排
  案例的sort -n 是按照第一列的数值大小进行排序,从小到大,倒序就是 sort -rn

uniq 去除重复出现的行列, -c 在每列旁边显示该行重复出现的次数。
1
2
3
4
5
6
2、自定义日志格式,统计接口响应耗时:

日志格式增加 $request_time
从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间

$upstream_response_time:指从Nginx向后端建立连接开始到接受完数据然后关闭连接为止的时间

$request_time一般会比upstream_response_time大,因为用户网络较差,或者传递数据较大时,前者会耗时大很多
1
2
3
4
5
配置自定义日志格式
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" $request_time';
server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/local/nginx/html;
            index  .html;
        }
        # 使用自定义日志模板
        access_log  logs/host.access.log  main;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
统计耗时接口, 列出传输时间超过 2 秒的接口,显示前5条
# 备注:$NF 表示最后一列, awk '{print $NF}'
cat time_temp.log|awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
1
2
Nginx日志切割
nginx日志文件没有rotate功能,不能编写每天生成一个日志,所以我们可以写一个shell脚本定时切割日志文件

需求:

nginx的日志文件路径
每天0点对nginx 的access与error日志进行切割
以前一天的日期为命名
步骤:

重命名日志文件
向nginx主进程发送USR1信号
新建shell脚本:

vim /opt/nginx/nginx_log.sh
1
脚本内容:

#!/bin/bash
# 设置日志文件存放目录
LOG_PATH="/usr/local/nginx/logs"
# 备分文件名称
YesterDay="$(date -d yesterday +%Y%m%d%H%M)"

# 重命名日志文件
mv ${LOG_PATH}/access.log ${LOG_PATH}/access_${YesterDay}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error_${YesterDay}.log

# 向nginx主进程发信号重新打开日志
# nginx -s reopen 等同于 kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
# /usr/local/nginx/sbin/nginx -s reopen
# kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
配置crontab定时任务:

# 编辑并且添加一行新的任务:
crontab -e
# 每天0时0分进行日志分割(建议在02-04点之间,系统负载小)
00 00 * * * /opt/nginx/nginx_log.sh
# 重启Linux定时任务
systemctl restart crond.service
1
2
3
4
5
6
附1:定时删除Nginx 7天前日志
$ pwd
/usr/local/nginx/sh
$ vim delete_nginx_logs.sh
# 添加脚本内容内容

# /usr/local/nginx/logs/ 目录下
# -mtime +7 :7天前的文件
# -name "access_*.log":文件名称匹配access_*.log
# -exec rm -rf 强制删除,包含目录
find /usr/local/nginx/logs/ -mtime +7 -name "access_*.log" -exec rm -rf {} \;

# 添加定时任务,
$ crontab -e
# 每天10时0分进删除
10 0 * * * /bin/sh /usr/local/nginx/sh/delete_nginx_logs.sh > /dev/null 2>&1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
附2:常用定时任务命令:
systemctl start crond.service        # 启动
systemctl stop crond.service        # 停止
systemctl restart crond.service        # 重新启动
systemctl status crond.service        # 查看状态 
systemctl reload crond.service        # 重新载入配置

# 语法:crontab 【选项】 
crontab -l # 列出crontab有哪些任务 
crontab -e # 编辑crontab任务 
crontab -r # 删除crontab里的所有任务

# 内容格式: 
* * * * * 级别 命令 
分 时 日 月 周
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Nginx集群-负载均衡
Java环境搭建
安装JDK8环境

官方地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
本地上传JDK1.8到服务器,配置全局环境变量
解压:tar -zxvf jdk-8u171-linux-x64.tar.gz
移动并重命名:mv jdk1.8.0_181 /usr/local/software/jdk/jdk8
配置环境变量:vim /etc/profile
JAVA_HOME=/usr/local/software/jdk/jdk8
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
1
2
3
4
环境变量立刻生效:source /etc/profile
查看安装情况:java -version
上传jar包

启动应用:nohup java -jar BiuBiuBiu.jar >/dev/null 2>&1 &
关闭应用:kill -9 PID
查看应用:
ps -ef | grep java
lsof -i:port
jps
SpringBoot后端集群
SpringBoot应用和接口说明

Linux服务器需要安装JDK8

准备两个一样的Jar包,或者一个jar包动态指定端口启动

demo-1.jar监听8080端口
demo-2.jar监听8081端口

2.动态指定端口:

在命令行中指定启动端口(--server.port必须放在 xx.jar包后面):
java -jar test.jar --server.port=8080
1
传入虚拟机系统属性:(-D一般在xx.jar之前)
java -Dserver.port=8081 -jar test.jar
1
注意:两种方式可以同时配置并且属性一样,有优先级区分

# 最后 name 值为 Spring!
java -Dname="Dname" -jar app.jar --name="Spring!"
1
2
接口说明

接口一
GET请求,返回json数据,控制输出日志
http://127.0.0.1:8080/api/v1/pub/info/check
接口二
返回HTML页面,两个jar返回的HTML内容不一样,方便区分访问的是哪个jar
http://localhost:8080/api/v1/pub/web
直接启动

java -jar demo.jar --server.port=8080
java -jar demo.jar --server.port=8081
1
2
守护进程方式
nohup java -jar demo.jar --server.port=8080 &
nohup java -jar demo.jar --server.port=8081 &
1
2
Nginx负载均衡-upstream
简介:Nginx的upstream模板介绍

负载均衡(Load Balance)

分布式系统中一个非常重要的概念,当访问的服务具有多个实例时,需要根据某种“均衡”的策略决定请求发往哪个节点,这就是所谓的负载均衡,
原理是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,从而提高了数据的吞吐量
负载均衡的种类

通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但比较昂贵的
通过软件来进行解决,常见的软件有LVS、Nginx等,它们是基于Linux系统并且开源的负载均衡策略
目前性能和成本来看,Nginx是目前多数公司选择使用的
配置案例

# 集群服务配置
upstream lbs {
    server localhost:8080;
    server localhost:8081;
}
server {
    ....
    location /api/ {
        proxy_pass http://lbs;
        proxy_redirect default;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
server-静态模拟集群
    # 集群服务配置
    upstream lbs {
       server localhost:8080;
       server localhost:8081;
    }
    # 配置需要访问集群代理的入口
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://lbs;
            proxy_redirect default;
        }
    }
    
    # 模拟后端服务1
    server {
        listen       8080;
        server_name  localhost;
        location / {
            default_type text/html ;
            return 200 '===== 8080 ====='; 
        }
        location /api {
            default_type text/html ;
            return 200 '===== api-8080 ====='; 
        }
    }

    # 模拟后端服务2
    server {
        listen       8081;
        server_name  localhost;
        location / {
            default_type text/html ;
            return 200 '===== 8081 ====='; 
        }
        location /api {
            default_type text/html ;
            return 200 '===== api-8081 ====='; 
        }
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
测试:
$ curl localhost
===== 8080 =====
$ curl localhost
===== 8081 =====
$ curl localhost/api
===== api-8080 =====
$ curl localhost/api
===== api-8081 =====
1
2
3
4
5
6
7
8
备注:如果是Docker安装的Nginx,nginx -s reload 是没用的,需要重启Nginx服务:docker restart nginx

负载均衡策略解析
Nginx常见的负载均衡策略

节点轮询(默认)

简介:每个请求按顺序分配到不同的后端服务器
场景:会造成可靠性低和负载分配不均衡,适合静态文件服务器
weight(权重配置)

简介:weight和访问比率成正比,数字越大,分配得到的流量越高
场景:服务器性能差异大的情况使用
upstream lbs {
   server 192.168.159.133:8080 weight=5;
   server 192.168.159.133:8081 weight=10; 
}
1
2
3
4
ip_hash(固定分发)

简介:根据请求按访问ip的hash结果分配,这样每个用户就可以固定访问一个后端服务器
场景:服务器业务分区、业务缓存、Session需要单点的情况
upstream lbs {
   ip_hash;
   server 192.168.159.133:8080;
   server 192.168.159.133:8081;
}
1
2
3
4
5
节点参数配置:

参数    描述
backup    标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。
down    标记服务器永久停机了。表示当前的server暂时不参与负载
max_fails    允许请求失败的次数,默认为1。当超过最大次数时就不会请求。认为该服务器会已停机
fail_timeout    与 max_fails 结合使用,max_fails 次失败后,暂停请求的时间,默认 fail_timeout 为10s
upstream还可以为每个节点设置状态值

down:表示当前的server暂时不参与负载
backup:其它所有非backup机器down时,会请求backup机器,这台机器压力会最轻,配置也会相对低
upstream lbs {
   server 192.168.159.133:8080;
   server 192.168.159.133:8081 down;
}

upstream 2bs {
   server 192.168.159.133:8080;
   server 192.168.159.133:8081 backup;
}
1
2
3
4
5
6
7
8
9
如果某个应用挂了,请求不应该继续分发过去

max_fails:允许请求失败的次数,默认为1.当超过最大次数时就不会请求

fail_timeout : max_fails次失败后,暂停的时间,默认:fail_timeout为10s

参数解释

max_fails=N 设定Nginx与后端节点通信的尝试失败的次数。
在 fail_timeout 参数定义的时间内,如果失败的次数达到此值,Nginx就这个节点不可用。
在下一个fail_timeout时间段到来前,服务器不会再被尝试。
失败的尝试次数默认是1,如果设为0就会停止统计尝试次数,认为服务器是一直可用的。
具体什么是nginx认为的失败呢

可以通过指令 proxy_next_upstream来配置什么是失败的尝试。
注意默认配置时,http_404状态不被认为是失败的尝试。
upstream lbs {
    server 192.168.0.106:8080 max_fails=2 fail_timeout=60s ;
    server 192.168.0.106:8081 max_fails=2 fail_timeout=60s;
}

location /api/ {
    proxy_pass http://lbs;
    proxy_next_upstream error timeout http_500 http_503 http_404;
}
1
2
3
4
5
6
7
8
9
案例实操

暂停一个后节点,然后访问接口大于10次,Nginx会把这个节点剔除
重启这个节点,在fail_timeout周期里面不会再获取流量
Nginx深入配置
Nginx全局异常处理
Nginx自定义全局异常json数据
任何接口都是可能出错,4xx、5xx等错误,直接暴露给用户,无疑是看不懂
所以假如后端某个业务出错,nginx层也需要进行转换
让前端知道http响应是200,其实是将错误的状态码定向至200,返回了全局兜底数据
server{
    listen 80;                    # 监听80端口
    server_name localhost;        # 对应的域名或者IP

    location / {
        proxy_pass http://192.168.0.106:8080;

        proxy_redirect default;
        # 开启错误拦截配置,一定要开启
        proxy_intercept_errors on;

        # 存放用户的真实ip,Nginx代理的服务想要拿到请求接口的真实ip需要如下配置
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;  
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
        # 那些是失败错误页面        
        proxy_next_upstream error timeout http_503 non_idempotent;
    }

    # 不加 =200,则返回的就是原本的http错误码;
    # 配上后如果出现500等错误都返回给用户200状态,并跳转至/default_api
    error_page  404 500 502 503 504  =200  /default_api;
    location = /default_api {
        default_type application/json;
        return 200 '{"code":"-1","msg":"invoke fail, not found "}';
    }

    # 或者直接返回错误码json
    error_page 403 /respon_403.json;
    location = /respon_403.json {
        default_type application/json;
        return 403 '{"code":"403","status":"error","message":"Forbidden"}';
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Nginx自定义全局异常html页面返回
server{
    listen 80;                    # 监听80端口
    server_name localhost;        # 对应的域名或者IP
    proxy_intercept_errors on;    # 开启错误拦截配置,一定要开启

    location / {
        root /usr/local/nginx/html;
        index index.html;        # 主页文件
    }
    
    # 如果出现404,则返回/404.html页面
    error_page  404  /404.html;
    location = /404.html {
        root   /usr/local/nginx/html;
    }
    # 如果出现50x,则返回/50x.html页面 
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/local/nginx/html;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Nginx封禁恶意IP
简介:Nginx封禁恶意IP

网络攻击时有发生:1、TCP洪水攻击、注入攻击、DOS等。2、比较难防的有DDOS等

数据安全,防止对手爬虫恶意爬取,封禁IP

一般封禁ip方式:

linux server的层面封IP:iptables、
nginx的层面封IP ,方式多种 (但 req还是会打进来, 让nginx 返回 403, 占用资源)
Nginx作为网关,可以有效的封禁ip
# 所有网站屏蔽IP的方法,把include xxx; 放到http {}语句块。
# 单独网站屏蔽IP的方法,把include xxx; 放到网址对应的在server{}语句块,虚拟主机
# 单独接口屏蔽IP的方法,把include xxx; 放到local{}语句块。
# nginx配置如下:
http{
    # ....
    # 引入黑名单配置文件
    include blacklist.conf;

    server{
        listen 80;                    # 监听80端口
        server_name localhost;        # 对应的域名或者IP
        location / {
            proxy_pass http://localhost:8080;
            proxy_redirect default;
        }        
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# blacklist.conf文件内容
deny 192.168.159.2;
deny 192.168.159.32;
1
2
3
./nginx -s reload:# 重新加载配置,不中断服务
相关配置语句

# 1.屏蔽单个ip访问——格式: deny ip;
deny 123.68.23.5;

# 2.允许单个ip访问——格式: allow ip;
allow 123.68.25.6;

# 3.屏蔽所有ip访问——格式:deny all;
deny all;

# 4.允许所有ip访问——格式:allow all;
allow all;

# 5.屏蔽ip段访问——格式:deny ip/mask
# 屏蔽172.12.62.0到172.45.62.255访问的命令 
deny 172.12.62.0/24;

# 6.允许ip段访问——格式:allow ip/mask
# 屏蔽172.102.0.0到172.102.255.255访问的命令 
allow 172.102.0.0/16;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
配置说明

可新建一个配置文件,如blockip.conf。在其中编写相关的ip限制语句,然后在nginx.conf中加入如下配置:

# 配置ip限制策略
include blockip.conf; 
1
2
nginx会根据配置文件中的语句,从上至下依次判断。因此,写在前面的语句可能会屏蔽后续的语句。

除部分ip白名单外,屏蔽所有ip的错误示例

deny all; # 该语句已经禁止所有ip的访问,后续的配置不会生效
allow 123.45.25.6;
allow 123.68.52.125;
allow 123.125.25.106;
1
2
3
4
正确示例

# 允许部分ip访问
allow 123.45.25.6;
allow 123.68.52.125;
allow 123.125.25.106;
 # 禁止其余ip访问
deny all; 
1
2
3
4
5
6
屏蔽策略文件可以放在http, server, location, limit_except语句块中,我们可以根据需要合理的配置。

放置位置    效果    备注
http    nginx中所有服务起效    -
server    指定的服务起效    -
location    满足的location下起效    -
limit_except    指定的http方法谓词起效    -
拓展-自动化封禁思路
编写shell脚本
AWK统计access.log,记录每秒访问超过60次的ip,然后配合nginx或者iptables进行封禁
crontab定时跑脚本
Nginx配置浏览器跨域
跨域:浏览器同源策略 1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。 最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同"
三个相同为(同源):
    协议相同  http https
    域名相同  www.xdclass.net
    端口相同  80  81

一句话:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域

浏览器控制台跨域提示:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
1
2
3
4
5
6
7
8
9
解决方法

JSONP
Http响应头配置允许跨域
nginx层配置
程序代码中处理通过拦截器配置
Nginx开启跨域配置

location下配置
location / {
    # 如下为跨域配置

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章