搭建之前,我们先设置我们的环境,封装一台母本虚拟机,创建两台快照虚拟机
封装母本虚拟机
1./etc/udev/rules.d/70-persistent-net.rule (必做)
系统加载网卡驱动后会去读一个文件/etc/udev/rules.d/70-persistent-net.rule,这个文件是一个缓存文件,包含网卡的mac地址,如果现有网卡的mac地址和文件里的不同,系统会拒绝启动,把文件删除就好了
2.修改ip (必做)
DEVICE="eth0"
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=172.25.90.1
PREFIX=24
GATEWAY=172.25.90.250
重启网络
/etc/init.d/network restart
ping 一下真机,看网络通不通
若不通,看真机
# ip addr show br0
inet 172.25.90.250/24 brd 172.25.90.255 scope global br0
若是没有上面的这个网段,就添加
brctl addif br0 vnet0
ip addr show #查看vnet0的状态,如果是DOWN的话就执行下面这条命令
ip link set up vnet0
现在再ping应该就可以通了
3.删掉根目录下的东西
4.修改主机名 (必做)
/etc/sysocnfig/network
5.写解析
/etc/hosts
6.配置yum源 (必做)
配置完之后再安装软件时,什么也安装不上,报下面的信息
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
enable=0
7.
cd /etc/ssh
rm -fr ssh_host_*
8.安装一些自己常用的一些软件
yum install vim lftp openssh-clients -y
9.防火墙以及selinux的关闭
chkconfig iptables off
/etc/init.d/iptables stop
vim /etc/sysconfig/selinux
10.删除ssh密钥
rm -fr /etc/ssh/ssh_host_*
之后就直接poweroff,这样母本虚拟机就封装好了,注意封装好之后就不要再开启他了,也不要对他做任何的修改
新建两台快照虚拟机
cd /var/lib/libvirt/images
# qemu-img create -f qcow2 -b test.qcow2 vm1
# qemu-img create -f qcow2 -b test.qcow2 vm2
如果虚拟机坏掉
# rm -fr vm1
# qemu-img create -f qcow2 -b test.qcow2 vm1
vm1放的是快照虚拟机自己的一些改变,母本虚拟机没有任何变化
一、Nginx的安装配置
1.下载安装包
# wget http://nginx.org/download/nginx-1.12.0.tar.gz ##注意下载一定要下载stable的
2.解包
# tar zxf nginx-1.12.0.tar.gz
# cd nginx-1.12.0/src/core
# vim nginx.h
#define NGINX_VER "nginx" ##隐藏Nginx的版本号
# cd nginx-1.12.0/auto/cc
# vim gcc
/debug ##搜索debug,把debug下面的哪行注释掉,注释debug可以减小安装后的大小
3.开始编译:
# ./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio
--prefix=/usr/local/lnmp/nginx ##指定安装路径
--with-http_ssl_module ##启用SSL支持并且能够处理HTTPS请求
--with-http_stub_status_module ##启用”server status”(服务状态)页
--with-threads ##引入线程池
--with-file-aio ##启用file aio支持(一种APL文件传输格式)
编译中出现的错误
./configure: error: C compiler cc is not found ##c编译器没有安装
# yum install gcc -y
./configure: error: the HTTP rewrite module requires the PCRE library. ##pcre库没有安装
# yum install pcre-devel -y
./configure: error: SSL modules require the OpenSSL library. ##openssl库没有安装
# yum install openssll-devel -y
4.编译成功之后,开始安装
# make
# make install
5.创建符号链接
# ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/sbin/nginx
二、nginx.conf文件
Nginx的配置有着几个不同的上下文
main:对任何功能都生效的配置,user,group,worker
http:只对web服务器有效
mail:对邮件服务器有效
server:一般必须属于http
upstream:实现定义反向代理
location:属于server(还有)
user www www;
#定义Nginx运行的用户和用户组
worker_processes 2; ##nginx进程数,建议设置为等于CPU总核心数。
events
{
use epoll; #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
worker_connections 65535; #单个进程最大连接数(最大连接数=连接数*进程数)
}
worker_cpu_affinity 01 10; ##表示开启两个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核
所能接收的连接数是worker_processes*worker_connections
http() {
include mime.types; ##所包含的文件
default_type application/octet-stream; ##默认支持的类型
sendfile on; ##打开sendfile功能
#tcp_nopush on; ##
}
nodelay和nopush:
nodelay:当发送端要发送大量包含少量数据的数据报时,先发送一个小包,将后面到达的少量字符都缓存起来
而不立即发送,直到收到接收端对前一个数据报报文的ACK确认,或当前字符属于紧急数据,货值积攒到了一定
数量的数据(比如缓存的字符数据已经达到数据包报文段的最大长度)等多种情况才将其组成一个较大的包发送出去
nopush:不做推送
keepalive_timeout 65; ##使用长链接并使用超时
#gzip on; ##发送给用户的东西都是先压缩再发送,可节省带宽
server{ ##每个server定义一个虚拟主机,就一个主机都要定义在server
listen 80; ##
server_name localhost; ##两个名字监听到同一个地址,端口,就是基于虚拟主机
}
location:
location /URI/ { ##/URI/是指下面URL的第三个/
root "/web/htdocs"; ##相对于URI的网页位置路径,/wen/htdocs映射为/URI/,直接输入域名时,所在的路径,若写的是相对路径,是相对于nginx的默认安装目录
index index.html; ##默认访问资源
}
URL举例: http://www.magedu.com/index.html
用法:location [ = | ~ | ~* | ^~ ] uri {...}:
location URI {}:
对当前路径及子路径下的所有对象都生效
location = location {}:
精确匹配指定的路径,不包括子路径,因此,只对当前资源生效
location ~* URI {}:
location ~ URI {}:
模式匹配URI,此处的URI可使用正则表达式,~区分字符大小写,~不区分大小写
location ^~ URI {} :
不使用正则表达式
优先级:=,^~,~,~*,URI
当URI有正则表达式匹配,则下面只能写ip或域名,后面不能目录,否则会报错
43 location ~* ^/forum {
44 proxy_pass http://123.207.5.36;
45 }
httpd:
#定义网页页面在哪,基于本地文件系统路径做访问控制
http://www.magedu.com/... 自/...前面的就是由DocumentRoot定义
#基于URI路径,
http://www.magedu.com/... 从/...这开始就是URI路径
三、Nginx的简单配置
生成证书:
3.实现基于IP地址的访问控制
在某个location内定义deny,allow
基于用户访问控制:
需要借助于httpd来创建用户,必须确保他不要开机启动,否则会和Nginx征用同一个套接字
[root@VM_83_99_centos sbin]# vim ../conf/nginx.conf
53 auth_basic "hhhh";
54 auth_basic_user_file /etc/nginx/.users;
[root@VM_83_99_centos sbin]# yum install httpd -y
[root@VM_83_99_centos sbin]# chkconfig --list httpd
[root@VM_83_99_centos sbin]# mkdir /etc/nginx/
[root@VM_83_99_centos sbin]# htpasswd -c -m /etc/nginx/.users tom
New password:
Re-type new password:
Adding password for user tom
[root@VM_83_99_centos sbin]# htpasswd -m /etc/nginx/.users jerry ##千万注意:第二次不能用-c
New password:
Re-type new password:
Adding password for user jerry
autoindex:
[root@VM_83_99_centos sbin]# vim ../conf/nginx.conf
48 location /bbs {
49 root /web;
50 index 1.html;
51 autoindex on; #开启目录列表访问,合适下载类型的服务器(FTP),默认关闭。
52 }
[root@VM_83_99_centos sbin]# ./nginx -s reload
stub_status:
[root@VM_83_99_centos conf]# vim nginx.conf
43 location / {
44 root /web/htdocs;
45 index index.html index.htm;
46 }
47
48 location /status {
49 stub_status on; #启用stub_status的工作状态统计功能
50 }
51
52 location /bbs {
53 root /web;
54 index index.html;
55 autoindex on;
56 }
[root@VM_83_99_centos conf]# ../sbin/nginx -s reload
测试:
Active connections: 2
server accepts handled requests
135 135 221
Reading: 0 Writing: 1 Waiting: 1
上面的三个数字分别是:已经接受连接的个数,已经处理的连接的个数,已经处理的请求的个数(一个长链接可处理多个请求)
Reading:nginx正在读请求首部的个数,即正在接进来的请求的个数
Writing:nginx正在读请求主体的请求的个数,或正处理着请求内容的请求的个数,或者正在想其客户端发送响应的个数
waiting:长链接模式的保持的连接个数
4.反向代理加负载均衡
再创建两台虚拟机,都安装上apache,并将服务开启
修改nginx的配置文件,在http段定义一组上游服务器
upstream westos {
server 172.25.90.2:80 weight=2; ##这台服务器收到的请求数是下面那台服务器的2倍
server 172.25.90.3:80;
server 172.25.90.1:8080 backup; ##如果两台服务器都宕掉,就定向到这台服务器来处理
}
在虚拟主机上
server {
listen 80;
server_name www.w2.com;
location / {
proxy_pass http://westos; ##反向代理到westos这组服务器上
}
}
查看效果
# for i in {1..10}; do curl www.w2.com; done
可以模拟一台虚拟机宕掉,两台都宕掉的结果是什么
当启动httpd服务器时报错
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.90.2 for ServerName
解决办法:
vim /etc/httpd/conf/httpd.conf
把ServerName修改正确就好
least_conn:我们知道轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同。这有个前提,就是每个请求所占用的后端时间要差不多,如果有些请求占用的时间很长,会导致其所在的后端负载较高。在这种场景下,把请求转发给连接数较少的后端,能够达到更好的负载均衡效果,这就是least_conn算法。
5.重定向
server {
listen 80;
server_name www.w1.com;
rewrite ^(.*) https://$server_name$1 permanent; #永久定向到www.w1.com
}
实验1:怎么将某客户端的请求转发给后端服务器时,请求者还是客户端,而不是Nginx服务器?
参数:proxy_set_header X-Real-IP $remot_addr;
让后端服务器的日志记录的是客户端地址,而不是代理服务器地址:
编辑(http服务安装位置)/etc/http/conf/httpd.conf,找logformat
%{X-Real-IP}i
实验2:如何把所有的访问都转发到后端
Nginx代理请求到多个服务器:
upstream:上游服务器
upstream要定义在server之外
upstream websrvs {
server 172.26.100.11 weight=1;
server 172.26.100.12 weight=1;
}
还要将反向代理修改为websrvs
proxy_pass http://websrvs;
upstream的健康状况检查:
upstream websrvs {
server 172.26.100.11 weight=1 max_fails=2 fail_timeout=2;
server 172.26.100.12 weight=1 max_fails=2 fail_timeout=2;
}
upstream内还可以填ip_bash:这个参数表示记录客户端在哪个服务器上得到的请求,以后就一直到那个后端服务器上访问
sysctl命令:sysctl是一个允许您改变正在运行中的Linux系统的接口。它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。
ulimit命令:http://www.linuxidc.com/Linux/2012-10/72782.htm