高级运维(二):搭建Nginx服务器、用户认证、基于域名的虚拟主机、SSL虚拟主机、Nginx反向代理

一、搭建Nginx服务器

目标:

在IP地址为192.168.4.5的主机上安装部署Nginx服务,并可以将Nginx服务器,要求编译时启用如下功能:

1> SSL加密功能

2> 设置Nginx账户及组名称均为nginx

可选项:Nginx服务器升级到更高版本。然后客户端访问页面验证Nginx Web服务器:

1> 使用火狐浏览器访问

2> 使用curl访问

方案:

使用2台RHEL6虚拟机,其中一台作为Nginx服务器(192.168.4.5)、另外一台作为测试用的Linux客户机(192.168.4.100),如下图:

高级运维(二):搭建Nginx服务器、用户认证、基于域名的虚拟主机、SSL虚拟主机、Nginx反向代理

安装nginx-1.8.0版本时,需要使用如下参数:

1> with-http_ssl_module:提供SSL加密功能

2> user:指定账户      #安装源码包时,为了安全都会创建一个普通用户,即使软件被黑,也只是获得一个普通用户权限

3> group:指定组

步骤:

步骤一:构建Nginx服务器

1)使用源码包安装nginx软件包

在Proxy主机安装Nginx   #Proxy主机为服务器端

将lnmp_soft-2017-03-28.tar.gz包解压,解压位置可以随意,解压后会出现目录lnmp_soft

#cd lnmp_soft

#./install_lnmp.sh    #运行这个脚本进入交互界面

##############----Menu----##############

# 1. 安装Nginx

# 2. 安装MariaDB

# 3. 安装PHP

# 4. 安装Memcached

# 5. 安装memcache for php

# 6. 安装Java,Tomcat

# 7. 安装Varnish

# 8. 安装Session共享库

# 9. 退出程序

########################################

请选择一个菜单[1-9]:1     #交互界面,选1 然后回车,自动安装Nginx

# useradd -s /sbin/nologin nginx  #创建一个普通用户禁止登录,安全

# ls       #查看lnmp_soft目录下,默认是没有nginx-1.8.0目录的

# tar -xf nginx-1.8.0.tar.gz

# ls       #查看lnmp_soft目录下,有了nginx-1.8.0目录

# cd nginx-1.8.0/

# ./configure --user=nginx    #配置到nginx普通用户下,被黑了后获得只是普通用户nginx权限,不是root权限

# make      #编译

# make install   #安装

# make&&make install    上面两条命令可以写到一起

2)nginx命令的用法

# /usr/local/nginx/sbin/nginx    #启动服务

# /usr/local/nginx/sbin/nginx -s stop   #关闭服务

# /usr/local/nginx/sbin/nginx -s reload   #重新加载配置文件

# /usr/local/nginx/sbin/nginx -V    #查看安装的nginx软件信息,包括安装了那些模块

# netstat -antpu |grep 80    #nginx默认是通过TCP 80端口监听客户端请求,这个可以查看Nginx服务状态是否开启

3)为Nginx Web服务器建立测试首页文件

Nginx Web服务默认首页文档存储目录为/usr/local/nginx/html/,在此目录下建立一个名为index.html的文件:

# echo "I am a test web" > /usr/local/nginx/html/index.html    #随便写一个测试页面,方便验证Nginx服务状态

步骤二:升级Nginx服务器

1)编译新版本nginx软件

# tar -xf nginx-1.8.0.tar.gz    #理论上这里是nginx-1.9.0.tar.gz版本升级的,这里将1.9.0里需要用到的模块已经压缩到1.8.0里面了,默认未安装,需要手动安装升级

# cd nginx-1.8.0/

# ./configure --help    #这个命令可以帮助查看要安装的模块命令

# ./configure --with-http_ssl_module   #此次升级需要安装这个模块,后面做安全的https访问时,加密访问需要这个模块的支持

# ls  objs/     #配置后的文件都在该目录下

autoconf.err  Makefile  ngx_auto_config.h  ngx_auto_headers.h  ngx_modules.c  src

# make      #编译

2) 备份老的nginx主程序,并使用编译好的新版本nginx替换老版本

# ls  objs/    #编译后的文件也在该目录下

autoconf.err  Makefile  nginx  nginx.8  ngx_auto_config.h  ngx_auto_headers.h  ngx_modules.c  ngx_modules.o  src    #蓝色文件为编译后多出来的文件

# cp -r nginx /usr/local/nginx/sbin/    #这里只将文件nginx拷贝到/usr/local/nginx/sbin/下,会将新的模块内容加进去而不会影响原有的日志和网页

如果上面命令是make install命令则会将原有的日志和网页文件都覆盖掉,这里增加模块不是新建Nginx服务,make install命令本质上也是cp命令

注意:升级不需要make install

#ls nginx /usr/local/nginx/sbin    #升级后会把原有的nginx变成nginx.old,新的会替换它

nginx  nginx.old

步骤三:客户端访问测试

1)分别使用浏览器和命令行工具curl测试服务器页面

# firefox http://192.168.4.5

# curl  http://192.168.4.5

二、用户认证

目标:

沿用练习一,通过调整Nginx服务端配置,实现以下目标:

1> 访问Web页面需要进行用户认证

2> 用户名为:tom,密码为:12345

方案:

通过Nginx实现Web页面的认证,需要修改Nginx配置文件,在配置文件中添加auth语句实现用户认证。最后使用htpasswd命令创建用户及密码即可。

步骤:

步骤一:修改Nginx配置文件

1)修改/usr/local/nginx/conf/nginx.conf

# vim /usr/local/nginx/conf/nginx.conf     #添加蓝的部分的为认证文件配置

17 http {
35     server {
36         listen       80;
37         server_name  localhost;
添加两句话:
38     auth_basic "Input Password:";         #这里“”内是提示语可以随便写,没有实际功能
39     auth_basic_user_file "/usr/local/nginx/passwd";    #认证密码文件存放位置
44             root   html;
46         }
55         }

2)生成密码文件,创建用户及密码

使用htpasswd命令创建账户文件,需要确保系统中已经安装了httpd-tools。

# yum -y install httpd-tools    #安装加密输入工具,用来输入密码不显示为明文

# htpasswd -c /usr/local/nginx/passwd tom   #密码是加密的,输入密码不显示

# htpasswd  /usr/local/nginx/passwd jerry   #添加用户时,不要加-c,c代表创建文件,加上后会把之前的用户覆盖掉

New password:

Re-type new password:

Adding password for user tom

补充:

apache htpasswd命令选项参数说明

-c  创建一个加密文件

-n  不更新加密文件,只将apache htpasswd命令加密后的用户名密码显示在屏幕上

-m  默认apache htpassswd命令采用MD5算法对密码进行加密

-d  apache htpassswd命令采用CRYPT算法对密码进行加密

-p  apache htpassswd命令不对密码进行进行加密,即明文密码

-s  apache htpassswd命令采用SHA算法对密码进行加密

-b  在apache htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码

-D  删除指定的用户

在Windows, NetWare and TPF 系统中 ‘-m’选项是默认的,在使用apache htpasswd命令时可以忽略。在其他系统中,’-p’选项可能不能工作。

3)重启Nginx服务

# /usr/local/nginx/sbin/nginx -s reload     #不关闭服务,重新读一遍配置文件,配置文件生效,要保证nginx是启动状态,否则报错

步骤二:客户端测试

1)登录192.168.4.100客户端主机进行测试

# firefox https://192.168.4.5     #输入用户名密码才可以访问

三、基于域名的虚拟主机

目标:

沿用练习二,配置基于域名的虚拟主机,实现以下目标:

1> 实现两个基于域名的虚拟主机,域名分别为www.aa.com和www.bb.com

2> 对域名为www.aa.com的站点进行用户认证,用户名称为tom,密码为123456

方案:

修改Nginx配置文件,添加server容器实现虚拟主机功能;对于需要进行用户认证的虚拟主机添加auth认证语句。

步骤:

步骤一:修改配置文件

1)修改Nginx服务配置,添加相关虚拟主机配置如下

86    server {
 87        listen       80;      #客户端访问端口号
 88        server_name www.b.com;    #服务器显示的域名
 89
 90        location / {
 91            root   web;          # www.b.com页面的存储位置,是一个相对路径,nginx安装在哪里,这个web目录就创建在该nginx目录的下面
 92            index  index.html index.htm;
 93        }
 94    }

拓展:

1、基于域名的虚拟主机

类比与虚拟Web主机:一台服务器,一个httpd软件,【多个网站】;门户网站【宣传】;论坛网站【反馈信息】

<Virtualhost *:80>

servername www.a.com

</Virtualhost>

<Virtualhost *:80>

servername www.b.com

</Virtualhost>

服务器192.168.4.5【www.a.com、www.b.com】

客户端【DNS】

www.a.com

www.b.com

这里实现同样功能的操作:

客户端【/etc/hosts】  #本地域名解析文件,注意是位与客户端上面

/etc/hosts的优先级比DNS高,设置了相同域名解析的/etc/hosts和DNS,DNS会不起作用

IP    www.a.com

IP    www.b.com

1.1.1.1  www.baidu.com

# vim /usr/local/nginx/conf/nginx.conf

37         server_name  www.a.com;    #修改显示的域名,页面为默认页面

ctrl + v 变成可视块,移动光标,x删除选中的内容

改动端口号、域名、页面存储位置

86    server {
 87        listen       80;      #客户端访问端口号
 88        server_name www.b.com;    #服务器显示的域名
 89
 90        location / {
 91            root   web;          # www.b.com页面的存储位置,是一个相对路径,nginx安装在哪里,这个web目录就创建在该nginx目录的下面
 92            index  index.html index.htm;
 93        }
 94    }

# mkdir /usr/local/nginx/web  创建www.b.com的网页目录

/etc/hosts设置了本地域名解析  客户端访问该页面时,如果用IP访问的话,会显示服务端配置的相同IP的第一个servername

2、基于端口的虚拟主机
 86    server {
 87        listen       8080;   #端口号
 88        server_name www.b.com;
 89
 90        location / {
 91            root   web;
 92            index  index.html index.htm;
 93        }
 94    }

3、基于IP的虚拟主机
 86    server {
 87        listen       *:80;      #不写*:默认就是所有IP都可以,也可以写4.5:80  IP4.5的访问..
 88        server_name www.b.com;
 89
 90        location / {
 91            root   web;
 92            index  index.html index.htm;
 93        }
 94    }

2)创建账户及密码

# htpasswd -c /usr/local/nginx/passwd tom

New password:

Re-type new password:

Adding password for user tom

3)创建网站根目录及对应首页文件

# mkdir /usr/local/nginx/web  创建www.b.com的网页目录

# echo "I am another test web" > /usr/local/nginx/web/index.html    创建一个页面

4)重启nginx服务

# /usr/local/nginx/sbin/nginx -s reload

步骤二:客户端测试

1)修改客户端主机192.168.4.100的/etc/hosts文件,进行域名解析

[root@client ~]# vim /etc/hosts

192.168.4.5    www.a.com www.b.com

)登录192.168.4.100客户端主机进行测试

注意:SSH –X远程连接调用虚拟机的firefox时,请先关闭真实机的firefox。

[root@client ~]# firefox http://www.aa.com            //输入密码后可以访问

[root@client ~]# firefox http://www.bb.com            //直接访问

四、SSL虚拟主机

目标:

沿用练习二,配置基于加密网站的虚拟主机,实现以下目标:

1> 域名为www.c.com

2> 该站点通过https访问

3> 通过私钥、证书对该站点所有数据加密

方案:

源码安装Nginx时必须使用--with-http_ssl_module参数,启用加密模块,对于需要进行SSL加密处理的站点添加ssl相关指令(设置网站需要的私钥和证书)。

步骤:

步骤一:配置SSL虚拟主机

1)生成私钥与证书

[root@svr5 ~]# cd /usr/local/nginx/conf

[root@svr5 ~]# openssl genrsa -out cert.key                            //生成私钥

[root@svr5 ~]# openssl req -new -x509 -key cert.key -out cert.pem      //生成证书问

2)修改Nginx配置文件,设置加密网站的虚拟主机

[root@svr5 ~]# vim  /usr/local/nginx/conf/nginx.conf

… …

server {

listen       443 ssl;

server_name  www.c.com;

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)修改客户端主机192.168.4.100的/etc/hosts文件,进行域名解析

[root@client ~]# vim /etc/hosts

192.168.4.5    www.c.com  www.a.com   www.b.com

2)登录192.168.4.100客户端主机进行测试

[root@client ~]# firefox https://www.cc.com            //信任证书后可以访问

五、Nginx反向代理

目标:

使用Nginx实现Web反向代理功能,实现如下功能:

1> 后端Web服务器两台,可以使用httpd实现

2> Nginx采用轮询的方式调用后端Web服务器

3> 两台Web服务器的权重要求设置为不同的值

4> 最大失败次数为1,失败超时时间为30秒

方案:

使用4台RHEL7虚拟机,其中一台作为Nginx代理服务器,该服务器需要配置两块网卡,IP地址分别为192.168.4.5和192.168.2.5,两台Web服务器IP地址分别为192.168.2.100和192.168.2.200。客户端测试主机IP地址为192.168.4.100。如下图所示。

高级运维(二):搭建Nginx服务器、用户认证、基于域名的虚拟主机、SSL虚拟主机、Nginx反向代理

步骤:

步骤一:部署实施后端Web服务器

1)部署后端Web1服务器

后端Web服务器可以简单使用yum方式安装httpd实现Web服务,为了可以看出后端服务器的不同,可以将两台后端服务器的首页文档内容设置为不同的内容。

[root@web1 ~]# yum  -y  install  httpd

[root@web1 ~]# echo "192.168.2.100" > /var/www/html/index.html

[root@web1 ~]# systemctl restart httpd

2)部署后端Web2服务器

[root@web2 ~]# yum  -y  install  httpd

[root@web2 ~]# echo "192.168.2.200" > /var/www/html/index.html

[root@web2 ~]# systemctl restart httpd

步骤二:配置Nginx服务器,添加服务器池,实现反向代理功能

1)修改/usr/local/nginx/conf/nginx.conf配置文件

[root@svr5 ~]# vim /usr/local/nginx/conf/nginx.conf

.. ..

http {

.. ..

upstream webserver {

server 192.168.2.100 weight=1 max_fails=2 fail_timeout=10;

server 192.168.2.200 weight=2 max_fails=2 fail_timeout=10;

}

.. ..

server {

listen        80;

server_name  www.tarena.com;

location / {

proxy_pass http://webserver;

}

}

2)重启nginx服务

[root@svr5 ~]# /usr/local/nginx/sbin/nginx –s reload

3)使用浏览器访问代理服务器测试轮询效果

[root@client ~]# curl http://192.168.4.5            //使用该命令多次访问查看效果

步骤二:配置upstream服务器集群池属性

1)设置失败次数,超时时间,权重

[root@svr5 ~]# vim /usr/local/nginx/conf/nginx.conf

.. ..
    http {
    .. ..
    upstream webserver {
                    server 192.168.2.100 weight=1 max_fails=2 fail_timeout=10;  #weight=1表示轮询时转发一次, max_fails=2 连接失败后允许连接第二次,fail_timeout=10表示失败后10秒内不再访问该web服务器
                    server 192.168.2.200 weight=2 max_fails=3 fail_timeout=20;  #weight=2表示轮询时转发二次, max_fails=3 两次失败后允许连接第三次,fail_timeout=20表示失败后20秒内不再访问该web服务器

#server 192.168.2.300 weight=1 max_fails=2 fail_timeout=10  down;    #如果发现该服务器坏掉了,可以在后面加down,也可以在前面加#,注释掉这条命令,这样该web就不再参与集群,不再参与轮询,直到该web被修好,去掉down或者掉#,继续正常工作
            }
    .. ..
    server {
            listen        80;
            server_name  www.tarena.com;
                location / {
                proxy_pass http://webserver;
            }
    }

2)重启nginx服务

[root@svr5 ~]# /usr/local/nginx/sbin/nginx –s reload

3)使用浏览器访问代理服务器测试轮询效果  #nginx默认的算法时轮询

[root@client ~]# curl http://192.168.4.5            //使用该命令多次访问查看效果

4)设置相同客户端访问相同Web服务器

[root@svr5 ~]# vim /usr/local/nginx/conf/nginx.conf
    .. ..
    http {
    .. ..
    upstream webserver {
                     ip_hash;     #加了该参数后,相同的客户端只会访问相同的web
                    server 192.168.2.100 weight=1 max_fails=2 fail_timeout=10;
                    server 192.168.2.200 weight=2 max_fails=2 fail_timeout=10;
            }
    .. ..
    server {
            listen        80;
            server_name  www.tarena.com;
                location / {
                proxy_pass http://webserver;
            }
    }

5)重启nginx服务

[root@svr5 ~]# /usr/local/nginx/sbin/nginx –s reload

6)使用浏览器访问代理服务器测试轮询效果

[root@client ~]# curl http://192.168.4.5            //使用该命令多次访问查看效果

上一篇:insertBefore的兼容性问题


下一篇:加州大学伯克利分校Stat2.2x Probability 概率初步学习笔记: Section 2 Random sampling with and without replacement