写在前面

在前面学习了Nginx如何实现反向代理和负载均衡,接下来开始学习如何在Nginx中安装第三方模块,以及如何基于来源IP或者用户名密码来对访问进行控制。

Nginx安装第三方模块

前面介绍的4中负载均衡方法中,有两个是第三方模块,需要在Nginx中提前安装它们。开发者只需进入Nginx所在目录,然后执行如下编译命令即可:

1
./configure --prefix=/你的安装目录  --add-module=/第三方模块目录

为了更好的获得演示效果,这里以Nginx安装echo模块为例进行介绍。请注意笔者Nginx的安装目录为/usr/local/nignx,下载目录为/home/envythink/nginx-1.17.0,这两者是不同的,当开发者需要执行编译或者安装第三方插件的时候,就需要进入到下载目录进行编译安装。

第一步,安装前测试。首先在/usr/local/nginx/conf/vhost下的envy.com.conf文件内新增如下的server配置:

1
2
3
4
5
6
7
8
9
server {
listen 82;
server_name envy.com;
client_max_body_size 1024M;

location / {
echo "Hello,Nginx!";
}
}

然后使用nginx -s reload命令验证是否有误,可以看到输出如下信息,这就说明echo模块不可使用:

1
nginx: [emerg] unknown directive "echo" in /usr/local/nginx/conf/vhost/envy.com.conf:14

第二步,查看已安装插件。开发者可以使用nginx -V(注意是大写)命令来查看已经安装的插件,可以发现目前什么插件也没有:

1
2
3
4
[root@envythink sbin]# nginx -V
nginx version: nginx/1.17.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
configure arguments:

第三步,新建第三方模块目录。在Nginx安装目录中创建第三方模块目录,即third_module,笔者的路径为/usr/local/nginx/third_module

第四步,安装第三方echo模块。接下来使用如下命令将echo模块下载到Nginx安装目录中的第三方模块目录,即third_module中:

1
wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz

之后对其进行解压,可以看到解压后的目录为echo-nginx-module-0.61

1
tar -zxvf v0.61.tar.gz

接着回到Nginx的下载目录,笔者为/home/envythink/nginx-1.17.0,使用如下命令对其进行编译:

1
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx  --add-module=/usr/local/nginx/third_module/echo-nginx-module-0.61

之后使用make命令进行安装,切记不可使用make install命令,这样会覆盖前面已经安装的Nginx。

第五步,更新二进制文件。由于此处执行了编译和安装命令,那么接下来就需要将安装目录中的nginx命令进行更新,也就是将/home/envythink/nginx-1.17.0/objs目录下的nginx覆盖掉之前的/usr/local/nginx/sbin/目录下的nginx,使用的命令如下:

1
cp /home/envythink/nginx-1.17.0/objs/nginx /usr/local/nginx/sbin/nginx

如果出现cp: 无法创建普通文件"/usr/local/nginx/sbin/nginx": 文本文件忙的提示语,那么就需要使用systemctl stop nginx命令来终止Nginx的运行,然后重新运行上述命令。

之后开发者再次使用nginx -V(注意是大写)命令来查看已经安装的插件,可以发现echo插件已经安装成功了:

1
2
3
4
[root@envythink objs]# nginx -V
nginx version: nginx/1.17.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
configure arguments: --user=nginx --group=nginx --prefix=/usr/local/nginx --add-module=/usr/local/nginx/third_module/echo-nginx-module-0.61

第六步,重启Nginx并测试。接下来开发者可以使用nginx -s relaod命令来重启Nginx。如果出现诸如nginx: [emerg] getpwnam("nginx") failed的错误提示,说明系统没有创建nginx用户,可使用如下命令进行创建:

1
useradd -s /sbin/nologin -M nginx

之后再次使用nginx -s relaod命令来重启Nginx。如果还出现类似于下面的错误:

1
nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)

那么需要以指定配置文件的方式来启动Nginx:

1
nginx -c /usr/local/nginx/conf/nginx.conf

之后再次使用nginx -s relaod命令来重启Nginx,启动成功后再次使用nginx -V命令来查看已安装的插件:

1
2
3
4
[root@envythink conf]# nginx -V
nginx version: nginx/1.17.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
configure arguments: --user=nginx --group=nginx --prefix=/usr/local/nginx --add-module=/usr/local/nginx/third_module/echo-nginx-module-0.61

最后开发者使用curl http://envy.com:82命令来查看Nginx是否配置成功,配置成功的话可以看到如下的输出信息:

Nginx实现访问控制

当开发者需要基于来源IP或者用户名密码来对访问进行控制的时候,Nginx就能提供上述功能。

基于来源IP实现控制

由于对于IP的修改可能是频繁的,因此最好就是单独拿出一个文件来存放需要控制的IP,可以在envy.com.conf文件同级目录下新建一个ip.conf文件,然后在该文件内定义需要控制访问的IP,可以按照下面的格式进行设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 屏蔽单个IP访问
deny IP;

# 允许单个IP访问
allow IP;

# 屏蔽所有IP访问
deny all;

# 允许所有IP访问
allow all;

# 屏蔽整个段即从192.0.0.1到192.255.255.254访问的命令
deny 192.0.0.0/8

# 屏蔽IP段即从192.168.0.1到192.168.255.254访问的命令
deny 192.168.0.0/16

# 屏蔽IP段即从192.168.73.1到192.168.73.254访问的命令
deny 192.168.73.0/24

例子1:现在允许IP地址为192.168.73.1的机器来访问,其余的全部拒绝,此时envy.com.conf配置文件中可增加如下的server配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 83;
server_name envy.com;
client_max_body_size 1024M;
charset utf8;
# 开启目录索引,提供下载
autoindex on;
# 以人性化方式显示大小
autoindex_exact_size off;
# 与本地时间保持一致
autoindex_localtime on;

location / {
allow 192.168.73.1;
deny all;
}
}

这样只有IP地址为192.168.73.1的机才能访问,其余的机器无法访问。

例子2:现在只拒绝IP地址为192.168.73.102的机器访问,其余的全部允许,此时envy.com.conf配置文件中可增加如下的server配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 84;
server_name envy.com;
client_max_body_size 1024M;
charset utf8;
# 开启目录索引,提供下载
autoindex on;
# 以人性化方式显示大小
autoindex_exact_size off;
# 与本地时间保持一致
autoindex_localtime on;

location / {
deny 192.168.73.102;
allow all;
}
}

请注意deny和allow的顺序,默认情况下会使用第一条规则进行匹配,如果匹配成功,那么就停止匹配后续内容;否则就继续往下匹配。

基于用户名密码实现控制

在实际工作中,当开发者需要在企业内部Web服务上,针对运维人员或者其他用户进行访问控制时,可以采用基于用户名密码的方式来进行访问控制。

Nginx相关的配置语法如下所示:

1
2
3
4
location / {
auth_basic "close site";
auth_basic_user_file "conf/auth_conf";
}

简单解释一下上述参数的含义:

  • auth_basic语法为 auth_basic string|off,默认值为 auth_basic off,它可以使用在http、server、location、limit_except等处;
  • auth_basic_user_file语法为 auth_basic_user_file file,默认值为 -,其实就是认证信息的文件位置,它可以使用在http、server、location、limit_except等处。

第一步,安装密码生成工具。开发者使用如下命令安装密码生成工具:

1
yum -y install httpd-tools

第二步,生成密码。开发者使用如下命令来生成密码,并将其保存至指定文件中:

1
htpasswd -b -c /usr/local/nginx/conf/vhost/auth_conf root root123

第三步,修改Nginx配置文件。开发者可以在envy.com.conf配置文件中增加如下的server配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 84;
server_name envy.com;
client_max_body_size 1024M;
charset utf8;
# 开启目录索引,提供下载
autoindex on;
# 以人性化方式显示大小
autoindex_exact_size off;
# 与本地时间保持一致
autoindex_localtime on;

location / {
auth_basic "Hello Nginx!";
auth_basic_user_file "/usr/local/nginx/conf/vhost/auth_conf";
}
}

之后在浏览器中访问http://envy.com:84链接,可以看到页面弹出账号和密码验证框,只有输入正确的用户信息才能访问得到首页。

这样关于Nginx安装第三方模块和访问控制的学习就到此结束,后续开始学习其他内容。