• 高级运维(二):搭建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-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

    2)登录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。如下图所示。

    步骤:

    步骤一:部署实施后端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            //使用该命令多次访问查看效果

  • 相关阅读:
    MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐 级之间的区别?
    NOW()和 CURRENT_DATE()有什么区别?
    什么是非标准字符串类型?
    列的字符串类型可以是什么?
    实践中如何优化 MySQL ?
    可以使用多少列创建索引?
    数据库中的事务是什么?
    锁的优化策略?
    SQL 注入漏洞产生的原因?如何防止?
    强调事项段、其他事项段、关键审计事项
  • 原文地址:https://www.cnblogs.com/baichuanhuihai/p/8195839.html
Copyright © 2020-2023  润新知