一、搭建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 //使用该命令多次访问查看效果