======================================================================php
①. 利用DNS服务,将输入的域名解析为相应的IP地址css
回顾网络基础部分知识html
01 本地主机输入域名后,会查询本地缓存信息和本地hosts前端
02 本地主机会向远程LDNS服务器,发送递归查询请求mysql
LDNS是网卡配置的DNS服务(223.5.5.5 114.114.114.114)linux
03 LDNS服务器会向根域名服务器发出请求,将请求响应给LDNS服务器android
04 LDNS服务器会向顶级域名服务器发出请求,将请求响应给LDNS服务器nginx
05 LDNS服务器会向二级域名服务器发出请求,将请求响应给LDNS服务器web
06 LDNS服务器收到二级域名服务器响应过来的信息(解析记录),进行本地缓存正则表达式
将解析记录发送给本地主机
07 本地主机收到LDNS服务器的响应信息,也会将解析记录进行缓存,利用IP地址访问网站服务器
②. 利用已知的IP地址,进行网络三次握手链接创建
③. 本地主机客户端向网站服务端,发出请求 http请求数据包(http请求报文)
④. 网站服务端向本地主机客户端,回复响应 http响应数据包(http响应报文)
⑤. 完成网络四次挥手断开过程
* 请求方法: 但愿客户端完成个人什么样请求
get 获取服务端的文件内容
post 存储提交数据到服务端
* 协议版本:http1.0 http1.1 http2.0
http1.0: 属于TCP短链接类型协议
http1.1:属于TCP长链接类型协议
/n
* get方法:没有请求主体内容
* post方法:会有请求主体内容
起始行:
* 状态码信息
web服务能够处理接收的资源类型(text/html css jpg avi)
通常在web服务软件程序中,会有一个文件来定义媒体资源类型(mime.type)
URL 统一资源定位符
URI 统一资源标识符
www.jd.com / error2.aspx
URL URI
静态网页资源有几个重要的特征:
1) 每一个页面都有一个固定的URL地址,且URL通常以.html、.htm、.shtml等常见形式为后缀,并且地址中不含有问号“?”或“&”等特殊符号。
2) 静态网页是实实在在保存在服务器上的文件实体,每一个网页都是一个独立的文件。
3) 网页内容是固定不变的,所以,容易被搜索引擎收录(容易被用户找到)(优势)。
4) 由于网页没有数据库的支持,因此在网站制做和维护方面的工做量较大,当网站信息量很大时,彻底依靠静态网页比较困难(缺点)。
5) 网页的交互性较差,在程序的功能实现方面有较大的限制(缺点)。
6) 网页程序在用户浏览器端解析,如IE浏览器,程序解析效率很高,因为服务器端不进行解析,而且不须要读取数据库,所以服务器端能够接受更多的并发访问。当客户端向服务器请求数据时,服务器会直接从磁盘文件系统上返回数据(不作任何解析)。待客户端拿到数据后,在浏览器端解析并展示出来(优势)。
1) 网页扩展名后缀常见为:.asp、.aspx、.php、.js、.do、.cgi 等。
2) 网页通常以数据库技术为基础,大大下降了网站维护的工做量。
3) 采用动态网页技术的网站能够实现更多的功能,如用户注册、用户登陆、在线调查、投票、用户管理、订单处理、发博文等。
4) 动态网页并非独立存在于服务器上的网页文件,当用户请求服务器上的动态程序时,服务器解析这些程序并可能经过读取数据库来返回一个完整的网页内容。
5) 动态网页中的“?”在搜索引擎的收录方面存在必定的问题,搜索引擎通常不会从一个网站的数据库中访问所有网页,或者出于技术等方面的考虑,搜索蜘蛛通常不会去抓取网址中“?”后面的内容,所以在企业经过搜索引擎进行推广时,须要针对采用动态网页的网站作必定的技术处理(伪静态技术),以便适应搜索引擎的抓取要求。
根本实质仍是动态资源,将动态资源假装成静态
动态不便于搜索引擎收录 响应速度较慢
1. IP(独立IP),即Internet Protocol,这里指独立IP数,
独立IP数是指不一样IP地址的计算机访问网站时被计的总次数
2. PV(访问量)即Page View,中文翻译为页面浏览,即页面浏览量或点击量,无论客户端是否是相同,
也无论IP是否是相同,用户只要访问网站页面就会被计算PV
3. UV(独立访客)即Unique Visitor,同一个客户端(PC或移动端)访问网站被计为一个访客。
一天(00:00-24:00)内相同的客户端访问同一个网站只计一次UV
cookie:标识用户主机身份信息
======================================================================
这是中小型Web服务的主流,Web服务器中的老大哥。
大型网站Web服务的主流,曾经Web服务器中的初生牛犊,现已长大。
Nginx的分支Tengine(http://tengine.taobao.org/)目前也在飞速发展。
这是一个不温不火的优秀Web软件,社区不活跃,静态解析效率很高。
在Nginx流行前,它是大并发静态业务的首选,国内百度贴吧、豆瓣等众多网站都有Lighttpd奋斗的身影。
大中小型网站都会使用,动态网页语言PHP程序的解析容器。
它可配合Apache解析动态程序,不过,这里的PHP不是FastCGI守护进程模式,而是mod_php5.so(module)。
也可配合Nginx解析动态程序,此时的PHP经常使用FastCGI守护进程模式提供服务。
中小企业动态Web服务主流,互联网Java容器主流(如jsp、do)。
大型动态Web服务主流,互联网Java容器主流(如jsp、do)。
若是你据说或使用过Apache软件,那么很快就会熟悉Nginx软件,与Apache软件相似,
Nginx(“engine x”)是一个开源的,支持高性能、高并发的WWW服务器和代理服务软件。
它是由俄罗斯人lgor Sysoev开发的,最初被应用在俄罗斯的大型网站www.rambler.ru上。
后来做者将源代码以类BSD许可证的形式开源出来供全球使用。
Nginx能够运行在UNIX、Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操做系统中
· 支持高并发:能支持几万并发链接(特别是静态小文件业务环境)
· 资源消耗少:在3万并发链接下,开启10个Nginx线程消耗的内存不到200MB
· 支持异步网络I/O事件模型epoll(Linux 2.6+) apache(select)
1)做为Web服务软件(处理用户访问静态请求)
2)反向代理或负载均衡服务
3)前端业务数据缓存服务
apache使用select模型
nginx使用epoll模型
select模型版管理员 会一个一个房间查询人员
epoll模型版管理员 会进行检索后,直接找到须要找的人
select模型版阿姨 会一个一个小朋友进行询问,确认哪一个小朋友须要上厕所
epoll模型版阿姨 会告知想上厕所小朋友自觉站到响应位置
3种安装方式:yum安装、二进制包安装、编译安装
编译安装至关于本身作饭
须要本身手动解决依赖包
pcre-devel: perl语言正则表达式兼容软件包
openssl-devel:使系统支持https方式访问
安装命令:yum install -y pcre-devel openssl-devel
useradd www -s /sbin/nologin/ -M
cd /server/tools
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar xf nginx-1.12.2.tar.gz
将软件信息系统能够识别的二进制信息
软件编译安装三部曲:
①. 编译配置
cd /server/tools/nginx-1.12.2
./configure --prefix=/application/nginx-12.2 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
--prefix=PATH 指定软件安装在什么目录下
--user=USER 指定软件worker进程管理用户,利用www虚拟用户管理worker进程
--group=USER
--with-http_ssl_module 使nginx程序能够支持HTTPsF访问功能
--with-http_stub_status_module 用于监控用户访问nginx服务状况
# 经过检查返回值,确认安装成功 [root@web01 nginx-1.12.2]# echo $? 0
②. 编译过程
make
echo $?
③. 编译安装
make install
# 进入目录中查看 [root@web01 nginx-1.12.2]# cd /application/ [root@web01 application]# ll total 4 drwxr-xr-x 6 root root 4096 Feb 26 16:52 nginx-12.2
ln -s /application/nginx-12.2 /application/nginx
惟一的命令
/application/nginx/sbin/nginx
1.conf --- nginx程序全部配置文件保存目录
2.html --- nginx程序站点目录
3.logs --- nginx程序日志文件保存目录
4.sbin --- nginx程序命令所在目录
5.nginx命令参数说明(-h):
-V --- 查看nginx软件编译配置参数
-t --- 检查nginx配置文件语法格式是否正确
-s --- 用于管理nginx服务运行状态
stop 中止nginx服务
reload 平滑重启nginx服务器
重启nginx服务
nginx -s stop 先中止
nginx 再启动
nginx.conf nginx目录conf中的程序主配置文件
nginx.conf.default 和 nginx 是同样的 是软件的给的备份文件,能够经过vimdiff 对比一下
由于配置文件中有不少空行和注释,能够
先把配置文件先精简一下,
[root@web01 conf]# grep -Ev "#|^$" nginx.conf.default >nginx.conf
nginx配置文件组成:
①. main nginx主区块
②. event nginx事件区块
③. http nginx http功能区块
④. server nginx 网站主机区块
⑤. location nginx 匹配或者定位区块
[root@web01 conf]# ps -ef |grep nginx root 6701 1 0 17:17 ? 00:00:00 nginx: master process sbin/nginx www 6702 6701 0 17:17 ? 00:00:00 nginx: worker process
只有两个进程,一个主进程(master process)和worker进程(服务员)
mime.types文件就在当前目录下
①. 大括号要成对出现
②. 每一行指令后面要用分号结尾
③. 每个指令要放置在指定的区块中
官网帮助:Nginx官网 右边有一个documentation 下面有一个指令索引Alphabetical index of directives 使用ctrl+F 搜索咱们要查询的指令
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.etiantian.org; location / { root html/www; 目录要正确,必需要有 index index.html index.htm; } } } # 编写完毕检查一下,使用-t 参数测试语法是否都正确 [root@web01 conf]# /application/nginx/sbin/nginx -t nginx: the configuration file /application/nginx-12.2/conf/nginx.conf syntax is ok nginx: configuration file /application/nginx-12.2/conf/nginx.conf test is successful
# 重启服务
[root@web01 conf]# /application/nginx/sbin/nginx -s reload
# 须要在win中配置一下hosts
找到 C:\Windows\System32\drivers\etc下的hosts
添加 10.0.0.7 www.etiantian.org
访问成功
server { listen 80; server_name www.etiantian.org; location / { root html/www; index index.html index.htm; } } server { listen 80; server_name bbs.etiantian.org; location / { root html/bbs; index index.html index.htm; } } server { listen 80; server_name blog.etiantian.org; location / { root html/blog; index index.html index.htm; } }
mkdir -p /application/nginx/html/{www,bbs,blog}
for name in www bbs blog;do echo "10.0.0.7 $name.etiantian.org" >/application/nginx/html/$name/index.html;done
for name in www bbs blog;do cat /application/nginx/html/$name/index.html;done
10.0.0.7 www.etiantian.org
10.0.0.7 bbs.etiantian.org
10.0.0.7 blog.etiantian.org
浏览器访问测试:
注意:须要编写windows主机hosts文件,进行解析
命令行访问测试:
利用curl命令在linux系统中访问测试
注意:须要编写linux主机hosts文件,进行解析
将nginx中的多个server拆分红小文件,进行分类管理,以防止配置出错
[root@web01 conf]# mkdir extra [root@web01 conf]# cd extra/ [root@web01 extra]# sed -n '10,17p' ../nginx.conf > www.conf [root@web01 extra]# sed -n '18,25p' ../nginx.conf > bbs.conf [root@web01 extra]# sed -n '26,33p' ../nginx.conf > blog.conf
将原来的nginx.conf修改一下,进行分类管理
# 使用include 修改如下内容 include extra/www.conf; include extra/bbs.conf; include extra/blog.conf;
①. 基于域名的虚拟主机配置方法(最经常使用)
②. 基于端口的虚拟主机配置方法
说明:当你访问的网站域名在虚拟主机配置中不存在时,默认会将第一个虚拟主机的配置页面响应给用户
在配置中修改 listen 8080;
在浏览器中使用 bbs.etiantian.org:8080 进行访问,没有给端口就会变成www的内容
③. 基于IP地址的虚拟主机配置方法
说明:nginx服务中只要涉及IP地址的修改,都须要重启nginx服务,而不能采用平滑重启
在配置中修改 listen 10.0.0.7:80
[root@web01 nginx]# cd logs/ [root@web01 logs]# ll total 28 -rw-r--r-- 1 root root 18202 Feb 26 20:29 access.log -rw-r--r-- 1 root root 2960 Feb 26 20:02 error.log -rw-r--r-- 1 root root 5 Feb 26 17:17 nginx.pid
错误日志error.log
访问日志access.log
master主进程号 nginx.pid
咱们能够在默认的配置文件nginx.conf.default中找到下面的内容
#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;
在nginx.conf中编辑 加入
vim nginx.conf
error_log /tmp/www_error.log error;
修改好了,重启一下!
补充说明:
===========================================================================================
错误日志的,默认状况下不指定也没有关系,由于nginx不多有错误日志记录的。
但有时出现问题时,是有必要记录一下错误日志的,方便咱们排查问题。
error_log 级别分为 debug, info, notice, warn, error, crit 默认为crit
该级别在日志名后边定义格式以下:
error_log /your/path/error.log crit;
crit 记录的日志最少,而debug记录的日志最多。
若是nginx遇到一些问题,好比502比较频繁出现,可是看默认的error_log并无看到有意义的信息,
那么就能够调一下错误日志的级别,当你调成error级别时,错误日志记录的内容会更加丰富
===========================================================================================
一样的,咱们能够在默认的配置文件nginx.conf.default中找到下面的内容
下面的变量信息在官网的Alphabetical index of variables中查询
# log_format main '$remote_addr - $remote_user [$time_local] "$request" ' --- 定义日志信息要记录的内容格式 # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"';
# access_log logs/access.log main; --- 调用定义格式信息,生成访问日志
$remote_addr 10.0.0.1 --- 访问客户端的源地址信息
$remote_user - --- 访问客户端认证用户信息 ???
[$time_local] --- 显示访问时间
$request GET / HTTP/1.1 --- 请求行信息
$status 304 --- 状态码信息(304状态码利用缓存显示页面信息)
$body_bytes_sent --- 服务端响应客户端的数据大小信息
$http_referer --- 记录连接到网站的域名信息 ???
$http_user_agent --- 用户访问网站客户端软件标识信息
用户利用客户端浏览器测试访问时,win10默认浏览器会有异常问
$http_x_forwarded_for --- ??? 反向代理,下面讲
官方连接:http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log
01. 利用shell脚本实现日志切割
[root@web01 scripts]# vim cut_log.sh
#!/bin/bash
data_info=$(date +%F-%H:%M)
mv /application/nginx/logs/www_access.log /application/nginx/logs/access.log.$data_info
/application/nginx/sbin/nginx -s reload
# cut nginx log cron
* */6 * * * /bin/sh /server/scripts/cut_log.sh &>/dev/null
利用location区块能够用于定位或者匹配网站资源信息
搭建好一台nginx的web服务器。配置好内网卡地址与外网卡地址
web服务的网站域名为www.etiantian.org,站点目录为html/www
要求内网用户能够访问网站http://www.etiantian.org/AV资源信息
要求外网用户禁止访问网站http://www.etiantian.org/AV资源信息
deny allow ----- 在rsync中的访问控制
deny(ngx_http_access_module ) --- 在doc中找到实现访问控制模块
官方连接:nginx.org/en/docs/http/ngx_http_access_module.html
location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; allow 2001:0db8::/32; deny all; }
location区块进行定位站点目录下资源信息
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
官方连接:http://nginx.org/en/docs/http/ngx_http_core_module.html#location
server {
listen 80;
server_name www.etiantian.org;
root html/www;
index index.html index.htm;
location /AV {
allow 172.16.1.0/24;
deny 10.0.0.0/24;
}
}
mkdir AV
echo "AV info" >AV/oldboy.html
cat AV/oldboy.html
/application/nginx/sbin/nginx -t
/application/nginx/sbin/nginx -s reload
location [ = | ~ | ~* | ^~ ] uri { ... }
= --- 精确匹配网站uri资源信息
~ --- 区分大小写匹配网站uri资源信息
~* --- 不区分大小写匹配网站uri资源信息
^~ --- 优先匹配网站uri资源信息
/AV/ --- 指定匹配网站资源目录信息
/ --- 默认匹配网站资源信息
! --- 对匹配的内容进行取反
location = / {
[ configuration A ] --- 优先级最高 ①
}
location / { --- 全部匹配都不知足时候,匹配默认location ④
[ configuration B ]
}
location /documents/ { --- 根据资源目录进行匹配 ③
[ configuration C ]
}
location ^~ /images/ { --- 优先匹配 ②
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ { --- 不区分大小写匹配网站资源 ③
[ configuration E ]
}
实现相似百度重写域名的功能?
baidu.com ===> www.baidu.com
etiantian.org ===> www.etiantian.org
www.etiantian.org/oldboy?edu.html ---动态资源
www.etiantian.org/oldboy-edu.html ---伪静态
官方说明
rewrite
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if
last 一旦找到匹配信息,执行跳转,继续匹配后面的
stops processing the current set of ngx_http_rewrite_module directives and starts a search for a new location matching the changed URI;
break 一旦找到匹配信息,就终止
stops processing the current set of ngx_http_rewrite_module directives as with the break directive;
redirect 临时跳转
returns a temporary redirect with the 302 code; used if a replacement string does not start with “http://”, “https://”, or “$scheme”;
permanent 永久跳转
returns a permanent redirect with the 301 code.
=================================================================================================================
rewrite指令实践操做一:(错误)
[root@web01 extra]# cat bbs.conf
server {
listen 80;
server_name www.etiantian.org bbs.org;
rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
root html/bbs;
index index.html index.htm;
}
[root@web01 extra]# curl -L etiantian.org (-L 追踪参数,一直跟着)
curl: (47) Maximum (50) redirects followed
[root@web01 extra]# curl -Lv etiantian.org --- 显示无限循环过程
说明:以上配置进入了无限循环状态
rewrite指令实践操做二:(正确)
cat bbs.conf
server {
listen 80;
server_name etiantian.org;
rewrite ^/(.*) http://bbs.etiantian.org/$1 permanent;
}
server {
listen 80;
server_name bbs.etiantian.org bbs.org;
root html/bbs;
index index.html index.htm;
}
rewrite指令实践操做三:(正确)
[root@web01 extra]# cat bbs.conf
server {
listen 80;
server_name bbs.etiantian.org bbs.org;
if ($host ~* "^etiantian.org$") {
rewrite ^/(.*) http://bbs.etiantian.org/$1 permanent;
}
root html/bbs;
index index.html index.htm;
}
0一、LNMP架构说明
使前端web服务和后端存储服务进行串联
nginx只能处理静态的信息,动态的信
主要实现处理PHP程序动态请求
0二、LNMP架构工做原理
L linux
N nginx
M MySQL
P php
======================================================================
0)nginx 没法完成动态请求解析,只能处理静态请求,因此要找帮手
1)使前端web服务和后端存储服务进行串联
2)主要实现处理PHP程序动态请求
L Linux N nginx M mysql P php
基础优化操做要完成(防火墙关闭 关闭selinux /tmp权限为1777)
[root@web01 ~]# /etc/init.d/iptables status iptables: Firewall is not running. [root@web01 ~]# getenforce Disabled [root@web01 ~]# ll /tmp/ -d drwxrwxrwt. 3 root root 4096 Feb 27 09:43 /tmp/
暂时忽略,以前部署过
yum部署软件 编译安装软件 二进制包方式部署mysql服务
此次咱们用二进制包方式部署mysql服务
mysql官方下载连接地址:ftp://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/
必定要选择glibc的
上传mysql软件程序,进行利用xftp软件进行上传
tar xf mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.34-linux-glibc2.5-x86_64 /application/mysql-5.6.34
ln -sf /application/mysql-5.6.34/ /application/mysql
-f 参数是强制覆盖原有的软连接
useradd mysql -M -s /sbin/nologin
chown -R mysql.mysql /application/mysql/data/
注:/data 是全部数据存放的地方
/application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data/ --user=mysql
该过程出现两个OK 就表示成功的!也能够用echo $?
在系统中,默认是没有启动脚本的。
将mysql中的mysql.server(启动脚本)复制到/etc/init.d/mysqld
cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld
在脚本中有一个默认的basedir和binddir,须要修改两个文件
sed -ri 's#/usr/local#/application#g' /etc/init.d/mysqld /application/mysql/bin/mysqld_safe
配置文件的修改,默认配置文件不太符合咱们使用的5.6
cp /application/mysql/support-files/my-default.cnf /etc/my.cnf
启动
/etc/init.d/mysqld start
设置密码,不是修改密码
/application/mysql/bin/mysqladmin -uroot password "oldboy123"
登陆
/application/mysql/bin/mysql -uroot -poldboy123
yum install -y zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel
libiconv 软件安装---字符集转换库(默承认以不进行安装了)
cd /server/tools
#wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar zxf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure --prefix=/usr/local/libiconv
make
make install
cd ../
程序加密的软件的安装,依赖epel源,由于以前已经安装了,因此注释掉了
#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install libmcrypt-devel mhash mcrypt
rpm -qa libmcrypt-devel mhash mcrypt
php官方网站下载:php.net
cd /server/tools/
tar xf php-5.5.32.tar.gz
cd php-5.5.32
./configure --prefix=/application/php-5.5.32 --with-mysql=/application/mysql-5.6.34 --with-pdo-mysql=mysqlnd --with-iconv-dir=/usr/local/libiconv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-soap --enable-short-tags --enable-static --with-xsl --with-fpm-user=www --with-fpm-group=www --enable-ftp --enable-opcache=no
##防报错处理(如下信息能够不进行配置了) ,用来与数据库沟通
ln -s /application/mysql/lib/libmysqlclient.so.18 /usr/lib64/
建立文件,用来保存安装信息
touch ext/phar/phar.phar
安装
make
make install
ln -s /application/php-5.5.32/ /application/php
php.ini php-fpm.ini 两个配置文件
cp php.ini-production /application/php-5.5.32/lib/
cd /application/php/etc/
cp php-fpm.conf.default php-fpm.conf
/application/php/sbin/php-fpm 这样就启动了
netstat -lntup|grep php
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 6251/php-fpm
vim /application/nginx/conf/extra/blog.conf
location ~* .*\.(php|php5)?$ { # 不缺分大小写,地址后面有php或者php5 fastcgi_pass 127.0.0.1:9000; # 将请求抛给 127.0.0.1:9000,实际上就是抛给PHP服务 fastcgi_index index.php; # 当没有指定特殊的请求的时候,默认的动态资源文件 include fastcgi.conf; # 接口配置文件 }
原来的blog.conf
server { listen 80; server_name blog.etiantian.org; location / { root html/blog; index index.html index.htm; } }
修改后的
[root@web01 extra]# vim blog.conf server { listen 80; server_name blog.etiantian.org; root html/blog; index index.html index.htm; location ~* .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } }
检查并平滑重启
[root@web01 extra]# /application/nginx/sbin/nginx -t nginx: the configuration file /application/nginx-12.2/conf/nginx.conf syntax is ok nginx: configuration file /application/nginx-12.2/conf/nginx.conf test is successful [root@web01 extra]# /application/nginx/sbin/nginx -s reload
测试
[root@web01 html]# cd /application/nginx/html/blog/ [root@web01 blog]# ll total 4 -rw-r--r-- 1 root root 28 Feb 26 19:46 index.html [root@web01 blog]# vim test_php.php <?php phpinfo(); ?> "test_php.php" [New] 3L, 20C written [root@web01 blog]#
重启后,访问blog.etiantian.org/test_php.php成功(配置hosts)
[root@web01 blog]# vim test_mysql.php <?php //$link_id=mysql_connect('主机名','用户','密码'); //mysql -u用户 -p密码 -h 主机 下面link_id这是了一个变量,建立了一个函数用来链接mysql $link_id=mysql_connect('localhost','root','oldboy123') or mysql_error(); if($link_id){ echo "mysql successful by oldboy !\n"; }else{ echo mysql_error(); } ? >
访问blog.etiantian.org/test_mysql.php成功
以wordpress网站模板为例子,将压缩包传到服务器中
tar xf wordpress-4.7.3-zh_CN.tar.gz
mv wordpress/* /application/nginx/html/blog/
修改权限为nginx的work进程相通的用户权限
chown -R www.www /application/nginx/html/blog/
为何要用www呢,由于咱们的这个nginx程序,当用户访问进来以后,有点相似咱们以前所学的rsync和nfs,无论你你的哭护短身份是什么,多是win七、win10无论是什么样的主机以什么样的身份登陆咱们的主机,都会把咱们的身份作一个映射,压缩转换,而咱们的www会把他映射转换成相应的www用户,而以前的rsync转换成相应的rsync用户,nfs转换成nfs-nobody用户,这都须要改相应的程序目录权限。而如今。把站点目录改为相应的www用户管理,只有这样设置之后,之后有用户向目录中写入数据的时候,咱们才能有数据信息生成出来,不然,就会报权限终止,只能查看,没法上传和修改。先放置最大,经过之后的学习,再调整。
直接访问blog.etiantian.org,会出现403
这是由于,咱们blog.conf中的配置若是没有指定后缀,默认是访问index.html
可是,在咱们的目录中没有这个文件
[root@web01 html]# vim /application/nginx/conf/extra/blog.conf server { listen 80; server_name blog.etiantian.org; root html/blog; index index.php index.html index.htm; location ~* .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } }
/application/mysql/bin/mysql -uroot -p
create database wordpress;
show databases;
grant all on wordpress.* to 'wordpress'@'localhost' identified by '123456';
select user,host from mysql.user;
======================================================================
咱们把全部的LNMP软件都装在了一台服务器上,可是,这样安装会形成各个web服务器上的数据不一致,因此没法统一数据资源。
如今,咱们须要把数据资源都存储在一个地方,存储在db01的服务器上。
迁移数据库:利用数据库备份命令(mysql mysqladmin mysqldump)
mysqldump -uroot -p123456 --all-databases >/tmp/bak.sql
ll /tmp/bak.sql -h
scp /tmp/bak.sql 172.16.1.51:/tmp/
注:数据库没有启动,将没法使用命令mysqldump
##db01
mysql -uroot -p123456 </tmp/bak.sql
###db01添加新的用户,并受权
grant all on wordpress.* to wordpress@'172.16.1.0/255.255.255.0' identified by '123456;
flush privileges;
mysql -uwordpress -poldboy123 -h 172.16.1.51
mysql -uwordpress -poldboy123 -h 172.16.1.51 <-- 修改配置文件以前,先测试网站web服务器与迁移后的数据库连通性
vim wp-config.php <-- 修改wordpress上的数据库链接参数信息
/** MySQL主机 */
define('DB_HOST','172.16.1.51') <-- 修改链接的主机信息,将localhost修改成172.16.1.51
说明:web服务器数据库此时能够关闭了
/etc/init.d/mysql stop
cd /application/nginx/html/blog/wp-content/uploads
mkdir /tmp/wordpress_backup -p
mv ./* /tmp/wordpress_backup/
数据存储到本地什么位置,获取方法
①. 经过网站页面右键点击,获取资源地址信息
②. find命令利用-mmin 5
③. 利用inotify服务监控目录数据变化
vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
showmount -e 172.16.1.31
mount -t nfs 172.16.1.31:/data /mnt/
上面是以前作过的配置,如今,将nfs挂载到upload是下面
showmount -e 172.16.1.31
mount -t nfs 172.16.1.31:/data/ ./uploads/
mv /tmp/wordpress_backup/* ./
一群完成相同工做的服务器
集群概念做用说明:
一、提升网站处理请求能力;二、提升网站稳定运行,高可用性
集群做用分类说明
一、高可用集群HA;
二、负载均衡集群LB
硬件实现:一、F5硬件设备;二、A10硬件设备;价格贵
软件实现:一、Nginx(7层,19以后支持4层负载);二、LVS(4层);三、HAproxy(4层、7层)
负载均衡概念说明:
一、对用户请求进行跳读管理;二、对用户的访问请求进行压力分担
反向代理概念说明:
一、接受用户请求代替用户向后端访问;二、反向代理与数据转发概念区别说明
客户端====代理服务器===web服务器
客户端看到的服务端==代理服务器
代理服务器====web服务器
反向代理功能架构
3台web服务器,组建出web服务器集群
web01 10.0.0.7 172.16.1.7
web02 10.0.0.8 172.16.1.8
web03 10.0.0.9 172.16.1.9
1台负载均衡服务器
lb01 10.0.0.5 172.16.1.5
mkdir /server/tools -p cd /server/tools wget http://nginx.org/download/nginx-1.12.2.tar.gz tar xf nginx-1.12.2.tar.gz yum install -y pcre-devel openssl-devel useradd -M -s /sbin/nologin www cd nginx-1.12.2 #在咱们装好的nginx软件的服务器是上用 nginx -V 命令找到 编译参数 ./configure --prefix=/application/nginx-1.12.2 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module make && make install ln -s /application/nginx-1.12.2 /application/nginx /application/nginx/sbin/nginx netstat -lntup|grep nginx
server {
listen 80;
server_name www.etiantian.org;
root html/www;
index index.html index.htm;
}
server {
listen 80;
server_name bbs.etiantian.org;
root html/bbs;
index index.html index.htm;
}
scp -rp /application/nginx/conf/nginx.conf 172.16.1.8:/application/nginx/conf/
scp -rp /application/nginx/conf/nginx.conf 172.16.1.9:/application/nginx/conf/
mkdir /application/nginx/html/{www,bbs} -p
for name in www bbs;do echo "$(hostname) $name.etiantian.org" >/application/nginx/html/$name/oldboy.html;done
for name in www bbs;do cat /application/nginx/html/$name/oldboy.html;done
curl -H host:www.etiantian.org 10.0.0.7/oldboy.html
web01 www.etiantian.org
curl -H host:bbs.etiantian.org 10.0.0.7/oldboy.html
web01 bbs.etiantian.org
curl -H host:www.etiantian.org 10.0.0.8/oldboy.html
web02 www.etiantian.org
curl -H host:bbs.etiantian.org 10.0.0.8/oldboy.html
web02 bbs.etiantian.org
curl -H host:www.etiantian.org 10.0.0.9/oldboy.html
web03 www.etiantian.org
curl -H host:bbs.etiantian.org 10.0.0.9/oldboy.html
web03 bbs.etiantian.org
mkdir /server/tools -p cd /server/tools wget http://nginx.org/download/nginx-1.12.2.tar.gz tar xf nginx-1.12.2.tar.gz yum install -y pcre-devel openssl-devel useradd -M -s /sbin/nologin www cd nginx-1.12.2 ./configure --prefix=/application/nginx-1.12.2 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module make && make install ln -s /application/nginx-1.12.2 /application/nginx /application/nginx/sbin/nginx netstat -lntup|grep nginx
grep -Ev "#|^$" nginx.conf.default >nginx.conf
# upstream 官方连接: http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream Syntax: upstream name { ... } Default: — Context: http # 只能配置在http中 eg: upstream oldboy { # 名字(oldboy)能够随便定义 server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; } # 说明:upstream模块就相似定义一个一个地址池或者说定一个web服务器组 # proxy_pass 官方连接: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass Syntax: proxy_pass URL; Default: — Context: location, if in location, limit_except eg: location / { proxy_pass http://oldboy; } # 说明:proxy_pass主要用于进行抛送用户访问请求给upstream模块中的相应节点服务器
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream oldboy {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
server {
listen 80;
server_name localhost;
root html;
index index.html index.htm;
location / {
proxy_pass http://oldboy;
}
}
}
/application/nginx/sbin/nginx -t
/application/nginx/sbin/nginx -s reload
定义多个虚拟主机标签信息
①. proxy模块参数添加-proxy_set_header Host $host 使用浏览器中的请求HOST
②. proxy模块参数添加-proxy_set_header X-Forwarded-For $remote_addr 保留原始访问信息
进行hosts解析
10.0.0.5 www.etiantian.org
访问http://www.etiantian.org/oldboy.html
--- >利用ctrl+F5刷新测试,检查是否进行负载调度
[root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.5/oldboy.html
web01 www.etiantian.org
[root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.5/oldboy.html
web02 www.etiantian.org
[root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.5/oldboy.html
web03 www.etiantian.org
# 标准配置 upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; }
# 服务器的品质不必定是同样的,因此,给好的服务器承担多一点,数字越大,责任越大 upstream oldboy { server 10.0.0.7:80 weight=3; server 10.0.0.8:80 weight=1; server 10.0.0.9:80 weight=1; } 注:共分配了5个权重,加入有5个请求,3个会去10.0.0.7
# 咱们的负载服务器要随时观察,下面负责的web服务器是否可用,若是可用,我才分配请求
# 所以,就有了一个健康检查的功能
# 在达到最大失败次数以后,就再也不分配请求
upstream oldboy {
server 10.0.0.7:80 weight=3 max_fails=2; server 10.0.0.8:80 weight=1 max_fails=1; server 10.0.0.9:80 weight=1 max_fails=3; }
# 好比10.0.0.7出现异常后,我先给你3次机会,可是都没有成功,就不给了, # 10s后再给一次机会,若是还不行,就不给了,再等10s后给一次...... upstream oldboy { server 10.0.0.7:80 weight=3 max_fails=2 fail_timeout=10s; server 10.0.0.8:80 weight=1 max_fails=1; server 10.0.0.9:80 weight=1 max_fails=3; }
# 谁都很差用的时候,我才用9,只要有好的,就不用9 upstream oldboy { server 10.0.0.7:80 weight=3 max_fails=2 fail_timeout=10s; server 10.0.0.8:80 weight=1 max_fails=1; server 10.0.0.9:80 backup; }
采起平均分配
能者多劳
# 配置ip_hash upstream oldboy { ip_hash; server 10.0.0.7:80 ; server 10.0.0.8:80 ; server 10.0.0.9:80 ; } # 注意:配置ip_hash时,必定不能喝backup与weight参数同时使用
谁的连接多,就不要再分配给她了,谁的连接少,给他多分配一点,达到最小链接数
# 做用:设置反向代理服务器到web服务器的HTTP请求中的头部信息 # 配置nginx.conf [root@lb01 nginx]# vim ./conf/nginx.conf events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; } server { listen 80; server_name www.etiantian.org; root html; index index.html index.htm; location / { proxy_pass http://oldboy; } } server { listen 80; server_name bbs.etiantian.org; root html; index index.html index.htm; location / { proxy_pass http://oldboy; } "./conf/nginx.conf" 33L, 722C written [root@lb01 nginx]# ./sbin/nginx -t nginx: the configuration file /application/nginx-1.12.2/conf/nginx.conf syntax is ok nginx: configuration file /application/nginx-1.12.2/conf/nginx.conf test is successful [root@lb01 nginx]# ./sbin/nginx -s reload # 用浏览器访问 www.etiantian.org # 是正常的 # 用浏览器访问 bbs.etiantian.org # 访问的居然也是www.etiantian.org的结果 # 用抓包软件看一下 # 抓取http协议的包,看到在虚部服务器中,使用的是分组名oldboy请求,这样,就会使用相应的IP地址在访问web服务器,若是用IP地址访问服务器,默认响应的是第一个虚拟主机 # 因此,解决的方式就是HOST使用bbs.etiantian.org去访问 # 咱们须要修改请求头的HOST信息
# 在配置文件中修改 location / { proxy_pass http://oldboy; proxy_set_header host $host # 这个$host 就是客户端浏览器请求头中的HOST }
# 打开咱们我日志监控 [root@web01 logs]# tail -f access.log # 进行一次访问,查看日志 10.0.0.5 - - [28/Feb/2019:15:18:30 +0800] "GET /oldboy.html HTTP/1.0" 200 24 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0" "-" 10.0.0.5 - - [28/Feb/2019:15:18:32 +0800] "GET /favicon.ico HTTP/1.0" 404 169 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0" "-" # 发现,日志中并非真实的访问IP,而是10.0.0.5反向代理服务器 # 这里就有问题了 # 有时候,咱们须要统计有多少用户在访问咱们,确定没法获得真实的信息 # 这时须要修改配置proxy_set_header location / { proxy_pass http://oldboy; proxy_set_header host $host # 这个$host 就是客户端浏览器请求头中的HOST proxy_set_header X-Forwarded-For $remote_addr } #从新访问,查看日志 10.0.0.5 - - [28/Feb/2019:15:28:31 +0800] "GET /oldboy.html HTTP/1.0" 200 24 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0" "10.0.0.253" 10.0.0.5 - - [28/Feb/2019:15:28:31 +0800] "GET /favicon.ico HTTP/1.0" 404 169 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0" "10.0.0.253" # 在日志的最后多了一个IP地址
说明:X-Forwarded-For $remote_addr 实现用户访问反向代理服务,让web服务器日志中记录真实的IP地址信息
解题:
解题方法: 1)完成nginx网站服务器配置 第一个里程:建立测试环境 # 10.0.0.8 主机上建立upload目录,而后生成网站测试页面文件 cd /application/nginx/html/www/ mkdir upload cp oldboy.html upload/ # 10.0.0.7 主机上建立static目录,而后生成网站测试页面文件 cd /application/nginx/html/www/ mkdir static cp oldboy.html static/ # 10.0.0.9 主机上建立默认测试页面文件便可 第二个里程:利用lb01进行访问测试 # 测试10.0.0.8访问是否正常 curl -H host:www.etiantian.org 10.0.0.8/upload/oldboy.html web02 www.etiantian.org # 测试10.0.0.7访问是否正常 curl -H host:www.etiantian.org 10.0.0.7/static/oldboy.html web01 www.etiantian.org # 测试10.0.0.9访问是否正常 curl -H host:www.etiantian.org 10.0.0.9/oldboy.html web03 www.etiantian.org 2)完成nginx反向代理服务器配置 第一个里程:配置upstream模块信息 upstream upload { server 10.0.0.8:80; } upstream static { server 10.0.0.7:80; } upstream default { server 10.0.0.9:80; }
第二个里程:配置proxy_pass模块信息 server { listen 80; server_name www.etiantian.org; root html; index index.html index.htm; location / { proxy_pass http://default; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } location /upload { proxy_pass http://upload; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } location /static { proxy_pass http://static; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } }
根据用户请求客户端软件,显示不一样页面信息
解决:
1)nginx网站服务器配置 第一个里程:建立测试环境 # 10.0.0.8 主机上建立upload目录,而后生成网站测试页面文件 cd /application/nginx/html/www/ cat oldboy.html # 10.0.0.7 主机上建立static目录,而后生成网站测试页面文件 cd /application/nginx/html/www/ cat oldboy.html # 10.0.0.9 主机上建立默认测试页面文件便可 cd /application/nginx/html/www/ cat oldboy.html 测试访问: [root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.7/oldboy.html web01 www.etiantian.org [root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.8/oldboy.html web02 www.etiantian.org [root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.9/oldboy.html web03 www.etiantian.org 2)nginx反向代理服务器配置 第一个里程:配置upstream模块信息 upstream iphone { server 10.0.0.8:80; } upstream android { server 10.0.0.7:80; } upstream pc {· server 10.0.0.9:80; }
第二个里程:配置proxy_pass模块信息 server { listen 80; server_name www.etiantian.org; root html; index index.html index.htm; location / { if ($http_user_agent ~* "iphone") { proxy_pass http://iphone; } if ($http_user_agent ~* "android") { proxy_pass http://android; } proxy_pass http://pc; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } }
======================================================================
Keepalived软件起初是专为LVS负载均衡软件设计的,
用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了能够实现高可用的VRRP功能
Keepalived软件主要是经过VRRP协议实现高可用功能的。
VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,
VRRP出现的目的就是为了解决静态路由单点故障问题的,
它可以保证当个别节点宕机时,整个网络能够不间断地运行
1)VRRP协议,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,
VRRP的出现是为了解决静态路由的单点故障。
2)VRRP是用过IP多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通讯的。
3)工做时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,
就启动接管程序接管主节点的资源。备节点能够有多个,经过优先级竞选,
但通常Keepalived系统运维工做中都是一对。
①. 管理LVS负载均衡软件
②. 实现对LVS集群节点健康检查功能
③. 做为系统网络服务的高可用功能
第一个里程:在lb01/lb02上测试web服务器是否能够正常
curl -H host:www.etiantian.org 10.0.0.7/oldboy.html
curl -H host:www.etiantian.org 10.0.0.8/oldboy.html
curl -H host:www.etiantian.org 10.0.0.9/oldboy.html
curl -H host:bbs.etiantian.org 10.0.0.7/oldboy.html
curl -H host:bbs.etiantian.org 10.0.0.8/oldboy.html
curl -H host:bbs.etiantian.org 10.0.0.9/oldboy.html
第二个里程:在浏览器上测试访问lb01/lb02
解析hosts文件,将域名解析为10.0.0.5,进行测试访问
解析hosts文件,将域名解析为10.0.0.6,进行测试访问
scp -rp /application/nginx/conf/nginx.conf 10.0.0.6:/application/nginx/conf/ ---测试前同步lb01和lb02配置文件
第一个里程:安装keepalived服务软件
yum install -y keepalived
第二个里程:编写keepalived配置文件
vim /etc/keepalived/keepalived.conf
man keepalived.conf --- 配置文件说明信息
配置文件结构:
GLOBAL CONFIGURATION --- 全局配置(*)
VRRPD CONFIGURATION --- vrrp配置(*)
LVS CONFIGURATION --- LVS服务相关配置
lb01主负载均衡器配置
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance gorup01 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24 dev eth0 label eth0:1
}
}
/etc/init.d/keepalived start
lb02配置信息
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance group01 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24 dev eth0 label eth0:1
}
}
/etc/init.d/keepalived start
3)进行测试访问
10.0.0.5
[root@lb01 nginx]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:e6:d1:df brd ff:ff:ff:ff:ff:ff inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0 inet 10.0.0.3/24 scope global secondary eth0:1 # vip网卡地址 inet6 fe80::20c:29ff:fee6:d1df/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:e6:d1:e9 brd ff:ff:ff:ff:ff:ff inet 172.16.1.5/24 brd 172.16.1.255 scope global eth1 inet6 fe80::20c:29ff:fee6:d1e9/64 scope link valid_lft forever preferred_lft forever
10.0.0.6
[root@lb02 conf]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:5f:f1:03 brd ff:ff:ff:ff:ff:ff inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0 inet6 fe80::20c:29ff:fe5f:f103/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:5f:f1:0d brd ff:ff:ff:ff:ff:ff inet 172.16.1.6/24 brd 172.16.1.255 scope global eth1 inet6 fe80::20c:29ff:fe5f:f10d/64 scope link valid_lft forever preferred_lft forever
模拟10.0.0.5宕机
[root@lb01 nginx]# /etc/init.d/keepalived stop Stopping keepalived: [ OK ] [root@lb01 nginx]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:e6:d1:df brd ff:ff:ff:ff:ff:ff
inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
inet6 fe80::20c:29ff:fee6:d1df/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:e6:d1:e9 brd ff:ff:ff:ff:ff:ff
inet 172.16.1.5/24 brd 172.16.1.255 scope global eth1
inet6 fe80::20c:29ff:fee6:d1e9/64 scope link
valid_lft forever preferred_lft forever
查看10.0.0.6
[root@lb02 conf]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:5f:f1:03 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.3/24 scope global secondary eth0:1
inet6 fe80::20c:29ff:fe5f:f103/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:5f:f1:0d brd ff:ff:ff:ff:ff:ff
inet 172.16.1.6/24 brd 172.16.1.255 scope global eth1
inet6 fe80::20c:29ff:fe5f:f10d/64 scope link
valid_lft forever preferred_lft forever
不管谁是主,客户端访问的都是10.0.0.3这个地址
同时在keepalived高可用集群中,出现了两个虚拟IP地址信息,这种状况就称为脑裂
1. 心跳线出现问题
网卡配置有问题
交换设备有问题
线缆链接有问题
2. 有防火墙软件阻止问题
3. virtual_router_id配置数值不正确
总之:只要备服务器收不到组播包,就会成为主,而主资源没有释放,就会出现脑裂
出问题要点:备用设备有VIP就是表示不正常
01. 真正实现主备切换
02. 出现脑裂状况了
#!/bin/bash check_info=$(ip a|grep -c 10.0.0.3) # -c 统计数字 if [ $check_info -ne 0 ] then echo "keepalived server error!!!" fi
为了网站的安全性,在咱们的架构中,只给负载服务器提升外网网卡,
其余的服务器都不设置外网网卡。
因此,负载服务器就成了可能被黑客攻击的入口。
对于攻击者而言,不要让他看到服务器的IP(你访问IP地址,我能够不接受)
经过监听网卡,
server {
listen 10.0.0.3:80;
server_name www.etiantian.org;
root html;
index index.html index.htm;
location / {
proxy_pass http://oldboy;
proxy_set_header host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
server {
listen 10.0.0.3:80;
server_name bbs.etiantian.org;
root html;
index index.html index.htm;
location / {
proxy_pass http://oldboy;
proxy_set_header host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
/application/nginx/sbin/nginx -s stop 必定要重启
/application/nginx/sbin/nginx
netstat -lntup|grep nginx
tcp 0 0 10.0.0.3:80 0.0.0.0:* LISTEN 53334/nginx
由于只能监听网卡上有的地址,若是10.0.0.3没有,启动程序后就会报错
[root@lb01 nginx]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:e6:d1:df brd ff:ff:ff:ff:ff:ff inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0 inet6 fe80::20c:29ff:fee6:d1df/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:e6:d1:e9 brd ff:ff:ff:ff:ff:ff inet 172.16.1.5/24 brd 172.16.1.255 scope global eth1 inet6 fe80::20c:29ff:fee6:d1e9/64 scope link valid_lft forever preferred_lft forever [root@lb01 nginx]# ./sbin/nginx -s stop [root@lb01 nginx]# ./sbin/nginx nginx: [emerg] bind() to 10.0.0.3:80 failed (99: Cannot assign requested address)
解决:修改内核配置参数
echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
sysctl -p
只能访问10.0.0.3 记得修改hosts
服务器的地址已经没法实现访问,只有一个虚拟IP地址提供访问
实现了提升了网站的安全性
为何要部署高可用keepalived?你可能会说。是为了是防止一台宕机还能工做~!
可是,当咱们把nginx反向代理服务中止以后,keepalived服务并无进行主备切换!
那么,咱们的页面就这样丢失了!这不是咱们但愿看到的
咱们但愿,
nginx反向代理服务中止以后,keepalived服务也中止!
#!/bin/bash web_info=$(ps -ef|grep [n]ginx|wc -l) if [ $web_info -lt 2 ] then /etc/init.d/keepalived stop fi
注:grep 中 带上[]表示 过滤grep命令自己
chmod +x check_web.sh --- 修改脚本可执行权限
能够编写一个定时任务,也能够编写一个while 循环 放在守护进程里面
更好的方法
编辑keepalived服务配置文件
vrrp_script check_web { #定义一个监控脚本,脚本必须有执行权限 script "/server/scripts/check_web.sh" #指定脚本间隔时间 interval 2 #脚本执行完成,让优先级值和权重值进行运算,从而实现主备切换 # 在本例子中,服务已经被中止了, weight 2 } track_script { check_web }
脚本要添加在全局配置和实例配置之间
执行脚本的函数放在实例中
! Configuration File for keepalived global_defs { router_id lb01 } vrrp_script check_web { #定义一个监控脚本,脚本必须有执行权限 script "/server/scripts/check_web.sh" #指定脚本间隔时间 interval 2 #脚本执行完成,让优先级值和权重值进行运算,从而实现主备切换 # 在本例子中,服务已经被中止了,因此这个权重计算没有意义 weight 2 } vrrp_instance gorup01 { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 dev eth0 label eth0:1 } # 执行监控脚本函数 track_script { check_web } }
备注:在实际测试中,出问题了,命令行中web_info 是0.可是脚本中倒是2。没有找到缘由
再增长一个虚拟网卡
lb01服务器
vrrp_instance gorup01 { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 dev eth0 label eth0:1 } }
vrrp_instance gorup02 { state BACKUP interface eth0 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 dev eth0 label eth0:1 } }
lb02服务器
vrrp_instance gorup01 { state BACKUP interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 dev eth0 label eth0:1 } } vrrp_instance gorup02 { state MASTER interface eth0 virtual_router_id 52 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 dev eth0 label eth0:1 } }
修改nginx反向代理监控地址信息,将bbs的监听地址改成10.0.0.4
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; } server { listen 10.0.0.3:80; server_name www.etiantian.org; root html; index index.html index.htm; location / { proxy_pass http://oldboy; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } } server { listen 10.0.0.4:80; server_name bbs.etiantian.org; root html; index index.html index.htm; location / { proxy_pass http://oldboy; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } } }
备注:在win的本地host中以下两种修改都能访问,我不知道是为何
10.0.0.3 www.etiantian.org
10.0.0.4 bbs.etiantian.org
或者
10.0.0.3 www.etiantian.org bbs.etiantian.prg
为啥咧?忽然懂了,由于对于第一种状况来讲,不管是www.或者bbs都解析到了10.0.0.3
①. 网络安全问题-数据机密性问题
传输的数据可能会被第三方随时都能看到
②. 网络安全问题-数据完整性问题
传输的数据不能随意让任何人进行修改
③. 网络安全问题-身份验证问题
第一次通信时,须要确认通信双方的身份正确
利用相应算法,对传输数据(明文数据)进行加密(密文数据);
再利用对应算法,将加密数据解密变为真实数据
优势:实现了数据机密传输,避免了明文传输数据的危险性。
缺点:利用加密算法,将明文改密文,若是第三方得到加密算法,便可将传输密文再次变为明文
对称加密算法就比如将普通算法的规则手册放入到了保险柜里,只有获取保险柜和保险柜钥匙才能获取《算法手册》
优势:密钥加密算法计算速度很是快;解决了普通加密算法的安全问题
缺点:加解密过程的安全性彻底依赖于密钥,而且对称加密密钥是公开的,当通信加密对象过多时,没法解决密钥管理问题。
根据数据生成特征码(数据指纹信息);
接收数据方获取数据信息算出特征码,验证是否与发送过来的特征码一致 若特征码一致,表示数据完整性没被破坏;若特征码不一致,表示数据已被破坏,直接丢弃 **************************************************************************** 扩展说明: 01:不一样数据的特征码(数据指纹信息)是不可能一致的 单项加密算法特征 · 数据输入同样,特征码信息输出必然相同 · 雪崩效应,输入的微小改变,将形成输出的巨大改变 · 定长输出,不管源数据多大,但结果都是同样的 · 不可逆的,没法根据数据指纹,还原出原来的数据信息。 **************************************************************************** 优势:有效的解决了数据完整性问题 缺点:没有考虑中间人攻击对数据信息的影响
利用对称加密算法对数据加密的同时,也对特征码进行加密; 接收方拥有和发送方同样的密钥,才能够解密加密后的数据和特征码 而中间人加密的特征码是没有办法让接收方进行解密的,因此接收方获取不了特征码,直接丢弃数据 **************************************************************************** 扩展说明: 01:那么对称密钥如何有效的让通信双方获取呢 须要进行对称密钥协商过程,即经过密钥交换机制(Internet key exchange IKE) 实现密钥交换机制的协议称为diffie-hellman协议 ****************************************************************************
发送方创建私钥和公钥,将公钥发送给接收方,从而实现发送数据方的身份验证
让你的母亲验证你的爸爸身份信息,你的母亲就称为证书颁发机构
公钥信息在网站访问过程当中,被称为证书(身份证)
网络安全问题结论:实现网络安全性,须要解决问题的顺序为
1. 解决身份验证问题
2. 解决数据完整性问题
3. 解决数据机密性问题
根据上述结论可知,网络安全性最首先要解决的就是身份验证问题;
而解决身份验证问题,最主要的方式就是借助私钥和公钥
默认公钥在网络中进行传递时,默认状况下也是会出现问题的以下图所示:
而最主要的公钥信息获取就变得尤其重要;利用第三方公正者,公正公钥信息
因此为了避免上述状况的出现,须要引入一个新的概念:第三方CA证书签发机构。
目前标准的证书存储格式是x509,还有其余的证书格式,须要包含的内容为:
证书==身份证
公钥信息,以及证书过时时间
证书的合法拥有人信息
证书该如何被使用(不用关注)
CA颁发机构信息
CA签名的校验码
对称加密算法特性是加密和解密使用同一个密钥,利用对称算法能够将明文改成密文(加密),密文还原为明文(解密)。
对称加密算法常见的有:
最先期的称为DES(Data Encryption Standard),是美国国家安全局征集加密算法时,由一个美国公司提出的,是公开可使用的,使用的是56位的密钥长度,可是因为计算机的发展,可使用计算机对56位的密钥进行暴力破解了,所以DES渐渐再也不被使用。
一种新的算法,将DES加密后,再进行一次DES加密,而后再进行一次DES,称为3DES算法,是目前使用比较多的加密算法
更安全的加密算法,AES(高级加密标准)加密算法产生,默认使用128位的加密密钥,可是也有特殊的AES(AES192 AES256 AES512等),密钥越长安全性提升的同时,加密效率就会下降,所以应该选择比较合适的加密算法
blowfish加密算法,加密不是按位进行加密的,而是将数据分红大小相同的数据块进行加密的
单项加密算法常见的有:
DH加密算法,主要用于密钥的协商交换
MD4 MD5(128)
SHA1(160) SHA(192) SHA(256) SHA(384)
CRC-32(循环输出校验码),不是加密机制,只是一种校验机制,不提供安全性,正常加密算法是不容许出现输入不同,输出同样的状况,但CRC是能够有这样状况的,由于CRC只是具备校验功能,不具备加密功能
非对称加密算法能够实现身份认证功能(经过数字签名实现),数据加密功能,以及现密钥交换功能。
非对称加密算法常见的有:
RSA,RSA既是一个公司的名称,也是三个创始人的名称,RSA既能够加密又能够进行签名。
DSA,只能实现数字签名功能
ELGamal,属于商业化的加密算法
加密和解密须要算法来实现,所以须要主机上能够有相应的软件工具来控制加密和解密的算法,相应的工具就是加密和解密算法的具体实现,对称加密算法能够实现的工具:openssl、gpg。
Netscape网景公司生产了最初的浏览器,但为了提升浏览器访问页面的安全性,对TCP/IP模型进行了必定改进,在传输层与应用层之间,
建立了一个3.5层的概念,称为SSL((Secure Sockets Layer 安全套接层))层,SSL不是一个软件,只是一个库,
让应用层将数据传输到传输层前,调用了ssl层的功能对数据进行了加密,目前比较流行的版本是(SSLv2 v3),
可是SSL是netscape公司进行定义的,不够开放性,所以为了使加密功能更加开放,TSL(传输层安全协议)协议就出现了,
目前比较流行的版本是(TSLv1==ssl v3),TSL更像是传输层上实现的数据加密。
SSL数据通信实现原理介绍
因为借助SSL实现安全数据通信的方式比较多,本文只以最基本的HTTP协议为例,了解一下SSL数据安全通信的过程。具体实现过程说明以下: 01.http是基于tcp协议进行创建的,所以在创建tcp链接以前要先进行tcp的三次握手过程 02.三次握手以后,不立刻进行数据的传输,而是进行SSL的创建 03.客户端首先向服务器端发起数据传输请求,但服务端不会回复http数据包,而是与客户端一来一回协商生成/创建SSL会话,
确认是选用SSLv2仍是SSLv3,TSL协议,而且还要协商加密算法。 04.服务端与客户端的加密协议协商好后,服务端会将本身的证书发送给客户端 05.客户端在获取到证书后,先进行对证书的验证,确认是不是信任机构颁发的,而且验证证书是不是完整的,以及确认证书是没有注销的,
验证完毕后,得到的证书中的公钥就能够进行使用了 06.证书合法性验证完毕后,客户端会创建生成一个会话密钥 07.客户端选择随机数生成一个随机密钥,而且利用服务端的公钥对随机密钥进行加密,发给服务端 08.服务器端收到公钥加密的数据,就能够利用本身的私钥进行解密,得到对称密钥,就能够对传输数据进行加密了
openSSL概念说明
ssl功能的开源实现,就称为openssl,功能很是强大,几乎实现了市面上主流的加密算法,而且工做性能很是的好。
openssl的官方连接:http://openssl.org/。
openSSL软件组成部分
openssl是由三部分组成: libcrpto:通用加密库 libssl:TSL/SSL功能的实现,基于会话的,实现了身份认证,数据机密性和会话完整性的TSL/SSL库 openssl:提供的命令行工具,多用途命令工具,模拟实现私有证书颁发机构;命令行工具是经过多种子命令实现openssl的相应功能
获取OpenSSL软件的版本信息:
rpm -qa openssl
openssl version <- 查看openssl版本信息
获取OpenSSL配置文件信息:
/etc/pki/tls/openssl.cnf <- openssl配置文件,主要用于配置成私有ca时进行使用
说明:基本上openssl 配置文件不须要运维过多修改配置,有CA证书颁发机构去关注
实现HTTPS:
openssl genrsa 2048 >server.key <- 建立私钥信息,并指定私钥的长度为2048,并将生成的私钥信息保存在一个文件中
openssl genrsa -out server.key 2048 <- 将私钥信息直接进行保存,加密长度必定要放在输出文件后面
保存在/server/key须要本身建立,
(umask 077;openssl genrsa -out server1024.key 1024) <- 利用小括号,实现子shell功能,临时修改umask,使之建立的私钥文件权限为600
①. 生成自签发证书 --- 运维人员能够自行操做
[root@NFS-server-01 ~]# openssl req -new -x509 -key server.key -out server.crt -days 365
req <- 用于请求建立一个证书文件
new <- 表示建立的是新的证书
x509 <- 表示定义证书的格式为标准格式
key <- 表示调用的私钥文件信息
out <- 表示输出证书文件信息
days <- 表示证书的有效期
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN <- 定义生成证书的国家
State or Province Name (full name) []:BJ <- 定义生成证书的省份
Locality Name (eg, city) [Default City]:BJ <- 定义生成证书的城市
Organization Name (eg, company) [Default Company Ltd]:oldboy <- 定义生成证书的组织
Organizational Unit Name (eg, section) []:it <- 定义生成证书的职能部门
Common Name (eg, your name or your server's hostname) []:oldboy.com.cn <- 定义主机服务器名称
说明:此输出信息很是重要,客户端在获取证书前,会利用主机名与相应服务器之间创建链接,而后得到证书
Email Address []:
[root@web01 key]# ll total 8 -rw------- 1 root root 1675 Mar 1 16:57 server2048.key -rw-r--r-- 1 root root 1367 Mar 1 17:04 server.crt # 生成了自签发证书,不具备合法性,主要用于本地测试
②. 向证书颁发机构申请证书 --- ca证书版本机构完成
生成请求证书文件 (户口本) --- 运维人员完成
openssl req -new -key server.key -out server.csr
[root@web01 key]# openssl req -new -key server2048.key -out server.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:GD Locality Name (eg, city) [Default City]:ZS Organization Name (eg, company) [Default Company Ltd]:JINXINDENGSHI Organizational Unit Name (eg, section) []:IT Common Name (eg, your name or your server's hostname) []:web01 Email Address []:123@qq.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: # 能够设置密码,防止被截获 An optional company name []: [root@web01 key]# ll total 12 -rw------- 1 root root 1675 Mar 1 16:57 server2048.key -rw-r--r-- 1 root root 1367 Mar 1 17:04 server.crt # -rw-r--r-- 1 root root 1025 Mar 1 17:09 server.csr # 发送给证书盘发机构,证书颁发机构会给咱们crt
获取获得证书文件 (身份证) --- ca颁发机构完成
省略
在web服务器设置nginx 添加server
# 样本:
server { server_name YOUR_DOMAINNAME_HERE; listen 443; # 不能使用80端口了,80是http的 ssl on; # 开启ssl功能 ssl_certificate /usr/local/nginx/conf/server.crt; # 加载证书 ssl_certificate_key /usr/local/nginx/conf/server.key; 加载key私钥 }
# 添加配置信息:自动加上https server { listen 80; server_name www.etiantian.org; rewrite ^(.*)$ https://$host$1 permanent; }
# 配置: server { listen 443; server_name www.etiantian.org; ssl on; ssl_certificate /server/key/server.crt; ssl_certificate_key /server/key/server.key; root html/www; index index.html index.htm; }
# 测试的时候,要将本地host文件解析到测试所在的web01服务器的ip地址
第一次在没有设置rewrite 的时候,要输入https://www.etiantina.org进行访问
成功后,才有加入了配置,实现自动加上https
须要详细了解,请参看官方文档
ssl模块官方连接:http://nginx.org/en/docs/http/ngx_http_ssl_module.html
学好iptables的基础:
OSI7层模型以及不一样层对应哪些协议?
TCP/IP三次握手,四次断开的过程,TCP HEADER,状态转换
经常使用的服务端口要很是清楚了解。
经常使用服务协议原理http协议,icmp协议。
企业中安全配置原则:
尽量不给服务器配置外网IP,能够经过代理转发或者经过防火墙映射。
并发不是特别大状况有外网IP,能够开启防火墙服务。
大并发的状况,不能开iptables,影响性能,利用硬件防火墙提高架构安全。
真正实现防火墙的是一个内核netfiilter,咱们的iptables是控制内核的软件。
Netfilter/Iptables(如下简称Iptables)是unix/linux自带的一款优秀且开放源代码的彻底自由的基于包过滤
的防火墙工具,它的功能十分强大,使用很是灵活,能够对流入和流出服务器的数据包进行很精细的控制。
iptables是linux2.4及2.6内核中集成的服务。
iptables主要工做在OSI七层的二(MAC地址的过滤局域网之间的通信,通常不用)、三(IP地址)、四层(访问服务的端口),若是从新编译内核,iptables也能够支持7层控制
容器:装东西的器皿,docker容器技术,将镜像装在了一个系统中,这个系统就称为容器
iptables称为一个容器 --- 装着防火墙的表
防火墙的表又是一个容器---装着防火墙的链
防火墙的链也是一个容器---装着防火墙的规则
iptables---表---链---规则
规则:防火墙一条一条安全策略
防火墙匹配规则流程:
1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
2. 若是匹配上规则,即明确表示是阻止仍是经过,数据包就再也不向下匹配新的规则。
3. 若是规则中没有明确代表是阻止仍是经过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则获得明确的阻止仍是经过。
4. 防火墙的默认规则是全部规则执行完才执行的。
表(tables) 链(chains)
Filter:实现防火墙安全过滤功能
· INPUT 对于指定到本地套接字的包,即到达本地防火墙服务器的数据包 外面---->(门)房子iptables
· FORWARD 路由穿过的数据包,即通过本地防火墙服务器的数据包 外面-----(前门)房子(后门)---房子
· OUTPUT 本地建立的数据包 外面<-----(门)房子iptables
NAT:实现将数据包中IP地址或者端口信息,内网到外网进行改写/外网到内网进行改写
· PREROUTING 一进来就对数据包进行改变 在路由以前,进行数据包IP地址或端口信息的转换
· OUTPUT 本地建立的数据包在路由以前进行改变 本地防火墙要出去的流量进行相应转换(了解)
· POSTROUTING 在数据包即将出去时改变数据包信息 在路由以后,进行数据包IP地址或端口信息的转换
Managle :对数据进行标记
raw :忽略不计
man iptables中能够查看
[root@web01 key]# man iptables IPTABLES(8) iptables 1.4.7 IPTABLES(8) NAME iptables — administration tool for IPv4 packet filtering and NAT
# 是对 IPV4 进行管理
[root@web01 key]# /etc/init.d/iptables status iptables: Firewall is not running. [root@web01 key]# /etc/init.d/iptables start iptables: Applying firewall rules: [ OK ] [root@web01 key]# /etc/init.d/iptables status Table: filter Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) num target prot opt source destination
# 上面的规则都是默认的
咱们但愿,规则都是咱们本身设定的
/etc/init.d/iptables start
chkconfig iptables on
iptables -F --- 清除防火墙默认规则
iptables -X --- 清除防火墙自定义链
iptables -Z --- 清除防火墙计数器信息
/etc/init.d/iptables status
iptables -L --- -L 以列表形式显示全部规则信息
iptables -L -n --- -n 以数字形式显示IP地址或端口信息,不要转换为字符串显示
iptables -t nat -L -n --- -t 表示指定查看或者配置相应的表
iptables -L -n -v --- -v 表示显示详细规则信息,包含匹配计数器数值信息
iptables -L -n --line-number --- --line-number 显示规则序号信息
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP --- -A 表示添加规则到相应链上,默认表示添加规则到结尾
iptables -t filter -D INPUT -p tcp --dport 22 -j DROP --- -D 表示删除规则从相应链上。
iptables -t filter -D INPUT 规则序号
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP --- -I 表示插入规则到相应链上,默认表示插入规则到首部
iptables -t filter -I INPUT 3 -p tcp --dport 22 -j DROP --- 指定规则插入位置
iptables -t filter -R INPUT 6 -p tcp --dport 8080 -j DROP --- -R 指定将配置好的规则信息进行替换
-A --- 表示将规则添加到指定链上
-I --- 表示将规则插入到指定链上
-D --- 表示将规则从指定链上删除
-R --- 表示将规则信息进行修改
-p --- 指定相应服务协议信息(tcp udp icmp all)
--dport --- 表示指定目标端口信息, 只有tcp和udp有端口信息
--sport --- 表示指定源端口号信息
-j --- 指定对相应匹配规则执行什么操做(ACCEPT DROP(拒绝推荐使用DROP) REJECT(拒绝))
10.0.0.0/24 -- 22端口(阻止)
iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j DROP
iptables -t filter -A INPUT -i eth0 -s 10.0.0.9 -p tcp --dport 22 -j DROP
-s --- 指定匹配的源地址网段信息,或者匹配的主机信息
-d --- 指定匹配的目标地址网段信息,或者匹配的主机信息
-i --- 指定匹配的进入流量接口信息 只能配置在INPUT链上
-o --- 指定匹配的发出流量接口信息 只能配置在OUTPUT链上
10.0.0.1 10.0.0.253 10.0.0.9(只容许)
两行实现
iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
一步实现,利用!
iptables -t filter -A INPUT ! -s 10.0.0.9 -p tcp --dport 22 -j ACCEPT
经过利用 !进行规则取反,进行策略控制
咱们设置的规则和默认的规则是如何配合的?默认的规则是最后采起匹配的
22--80 22,24,25
iptables -A INPUT -s 10.0.0.9 -p tcp --dport 22:80 -j DROP --- 匹配连续的端口号访问
iptables -A INPUT -s 10.0.0.9 -m multiport -p tcp --dport 22,24,25 -j DROP --- 匹配不连续的端口号访问
-m --- 指定应用扩展模块参数
multiport --- 能够匹配多个不连续端口信息
实现ping功能测试链路是否正常,基于icmp协议实现的
icmp协议有多种类型:
icmp-type 8:请求类型 icmp-type 0:回复类型
状况一:实现禁止主机访问防火墙服务器(禁ping)
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP
状况二:实现禁止防火墙访问主机服务器(禁ping)
iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j DROP
默认状况:全部icmp类型都禁止
iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP
iptables -A OUTPUT -p icmp -m icmp --icmp-type any -j DROP
NEW: 发送数据包里面控制字段为syn=1,其余都是0,发送第一次握手的数据包
ESTABLISHED: 请求数据包发出以后,响应回来的数据包称为回复的包
RELATED: 基于一个链接,而后创建新的链接,进行新数据包的通信(FTP传输-控制链接和传输链接)
INVALID: 无效的的数据包,数据包结构不符合正常要求的(损坏、被修改等)
容许哪些状态包:
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
项目:部署一个最安全的企业级防火墙(案例)
两种思想:针对默认规则而言。
逛公园:黑名单
1、默认规则默认是容许的状态。
看电影:白名单(更安全,推荐配置)
2、默认规则默认是不容许的状态。更安全。
看电影的思想更安全。
cp /etc/sysconfig/iptables{,.bak}
iptables -F <- 清空iptables全部规则信息(清除filter)
iptables -X <- 清空iptables自定义链配置(清除filter)
iptables -Z <- 清空iptables计数器信息(清除filter)
iptables -A INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
-P --- 指定相应链的默认规则策略,是容许仍是阻止
iptables -A INPUT -i lo -j ACCEPT --- 让本身能够ping本身
lo 全称 loopback,指回环接口
为的是数据要发出去的时候,经过loopback在回来
而若是是发到往卡上,就直接发出去了
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT --- 容许架构内部服务进行访问
iptables -A INPUT -s 10.0.1.0/24 -j ACCEPT --- 容许一些合做企业的外网服务器进行访问
iptables -A INPUT -s 10.0.2.0/24 -j ACCEPT
9)若是防火墙上配置了FTP服务,须要配置网络状态机制
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT --- 容许web服务与ftp服务器创建链接
在没有配置以前使用telnet 是没用的,由于ESTABLISHED数据包进不来
①. 利用防火墙启动脚本命令参数,实现永久保存
/etc/init.d/iptables save
②. 利用防火墙配置信息保存命令,实现永久保存
iptables-save >/etc/sysconfig/iptables 原理是转变成配置文件里面的信息
实例拓展:避免本身被踢出门外
01. 去机房重启系统或者登录服务器删除刚才的禁止规则。
02. 让机房人员重启服务器或者让机房人员拿用户密码登陆进去
03. 经过服务器的远程管理卡管理(推荐)
04. 先写一个定时任务,每5分钟就中止防火墙
05. 测试环境测试好,写成脚本,批量执行
以上内容为防火墙filter表的配置实践与原理说明
iptables NAT:(配置NAT表示就是配置如下两个链)
01. postrouting(内网---外网-NAT 源私网IP地址---源公网IP地址)
路由以后,进行地址映射转换,把源地址进行转换(源私网地址==>源公网地址)
02. prerouting(外网---内网-NAT 目标公网IP地址---目标私网IP地址 映射目标端口)
路由以前,进行地址映射转换,把目标地址进行转换(目标公网地址==>目标变为私网地址)
假设有10.0.0.7(iptables服务器)和10.0.0.8(内网服务器,无外网网卡)两台服务器,
在8的服务器上,关闭外网网卡ifdown eth0
在7的服务器链接到8:ssh 172.16.1.8
[root@web02 ~]# ifconfig eth1 Link encap:Ethernet HWaddr 00:0C:29:DF:D0:8C inet addr:172.16.1.8 Bcast:172.16.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fedf:d08c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:142 errors:0 dropped:0 overruns:0 frame:0 TX packets:178 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:18804 (18.3 KiB) TX bytes:20392 (19.9 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:576 (576.0 b) TX bytes:576 (576.0 b) [root@web02 ~]# ping 223.5.5.5 connect: Network is unreachable
第一个历程:配置内网服务器,设置网关地址
/etc/init.d/iptables stop --- 内网服务器中止防火墙服务
ifdown eth0 --- 模拟关闭内网服务器外网网卡
setup --- 修改内网网卡网关和DNS地址信息
将默认网关修改成172.16.1.7
添加DNS 223.5.5.5
# 重启网卡
[root@web02 ~]# /etc/init.d/network restart Shutting down interface eth1: [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface eth0: Determining if ip address 10.0.0.8 is already in use for device eth0... [ OK ] Bringing up interface eth1: Determining if ip address 172.16.1.8 is already in use for device eth1... [ OK ] [root@web02 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:DF:D0:82 inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fedf:d082/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:14429 errors:0 dropped:0 overruns:0 frame:0 TX packets:15197 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1352195 (1.2 MiB) TX bytes:1227453 (1.1 MiB) eth1 Link encap:Ethernet HWaddr 00:0C:29:DF:D0:8C inet addr:172.16.1.8 Bcast:172.16.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fedf:d08c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:492 errors:0 dropped:0 overruns:0 frame:0 TX packets:409 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:51240 (50.0 KiB) TX bytes:69590 (67.9 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:56 errors:0 dropped:0 overruns:0 frame:0 TX packets:56 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4032 (3.9 KiB) TX bytes:4032 (3.9 KiB) # 关闭etho,外网网卡 [root@web02 ~]# ifdown eth0 [root@web02 ~]# ifconfig eth1 Link encap:Ethernet HWaddr 00:0C:29:DF:D0:8C inet addr:172.16.1.8 Bcast:172.16.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fedf:d08c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:539 errors:0 dropped:0 overruns:0 frame:0 TX packets:434 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:55538 (54.2 KiB) TX bytes:73912 (72.1 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:56 errors:0 dropped:0 overruns:0 frame:0 TX packets:56 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4032 (3.9 KiB) TX bytes:4032 (3.9 KiB) #检查路由生效了没有 [root@oldboyedu42-lnb-02 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
0.0.0.0 172.16.1.7 0.0.0.0 UG 0 0 0 eth1 说明:内网服务器网关地址指定为共享上网服务器内网网卡地址
[root@web02 ~]# ping 172.16.1.7
PING 172.16.1.7 (172.16.1.7) 56(84) bytes of data.
64 bytes from 172.16.1.7: icmp_seq=1 ttl=64 time=0.372 ms
64 bytes from 172.16.1.7: icmp_seq=2 ttl=64 time=0.399 ms
^C
--- 172.16.1.7 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7211ms
rtt min/avg/max/mdev = 0.305/0.424/0.749/0.136 ms
[root@web02 ~]#
第二个历程:配置共享上网服务器,开启共享上网服务器路由转发功能
也就是要想让咱们的防火墙充当路由器的功能,把主机8的请求通过防火墙路由转发到外网,须要编写7服务器内核配置文件,实现路由转发的功能
[root@web01 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 改成1
[root@web01 ~]# sysctl -p
第三个历程:配置共享上网服务器,实现内网访问外网的NAT映射
[root@web01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.7
-s 172.16.1.0/24 --- 指定将哪些内网网段进行映射转换
-o eth0 --- 指定在共享上网哪一个网卡接口上作NAT地址转换
-j SNAT --- 将源地址进行转换变动
-j DNAT --- 将目标地址进行转换变动
--to-source ip地址 --- 将源地址映射为何IP地址
--to-destination ip地址 --- 将目标地址映射为何IP地址
扩展若是开启:forward默认drop策略,若是配置forward链
正常来讲,如今已经能够访问外网了,可是
# 没法访问 [root@web02 ~]# ping 223.5.5.5 PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data. ^C --- 223.5.5.5 ping statistics --- 60 packets transmitted, 0 received, 100% packet loss, time 59770ms # 查看防火墙 [root@web02 ~]# iptables -t nat -nL -v Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 2 packets, 204 bytes) pkts bytes target prot opt in out source destination 0 0 SNAT all -- * eth0 172.16.1.0/24 0.0.0.0/0 to:10.0.0.7 Chain OUTPUT (policy ACCEPT 2 packets, 204 bytes) pkts bytes target prot opt in out source destination [root@web02 ~]# # 数据包是0,表示没有生效 [root@web02 ~]# # 看咱们以前的一张图数据包过滤匹配流程,咱们的nat(POSTROUTING)是最后通过的 # 看一下7服务器的fiter [root@web01 ~]# iptables -nL -v Chain INPUT (policy DROP 129 packets, 28011 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 10.0.0.1 0.0.0.0/0 tcp dpt:22 1803 155K ACCEPT tcp -- * * 10.0.0.0/24 0.0.0.0/0 tcp dpt:22 6 504 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 547 89233 ACCEPT all -- * * 172.16.1.0/24 0.0.0.0/0 1420 120K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED Chain FORWARD (policy DROP 0 packets, 0 bytes) # FORWARD 默认是阻止的 pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 5048 packets, 401K bytes) pkts bytes target prot opt in out source destination [root@web01 ~]# #
对7服务器作如下配置
iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT
网络数据包传输过程必定是有去有回的
能够访问了
[root@web02 ~]# ping 223.5.5.5 PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data. 64 bytes from 223.5.5.5: icmp_seq=2 ttl=127 time=32.5 ms 64 bytes from 223.5.5.5: icmp_seq=3 ttl=127 time=41.9 ms ^C --- 223.5.5.5 ping statistics --- 3 packets transmitted, 2 received, 33% packet loss, time 2976ms rtt min/avg/max/mdev = 32.586/37.269/41.952/4.683 ms [root@web02 ~]#
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE <- 假装共享上网
说明:在企业中如何没有固定外网IP地址,能够采起以上假装映射的方式进行共享上网
01. 指定哪些网段须要进行映射 -s 172.16.1.0/24
02. 指定在哪作映射 -o eth0
03. 用什么方法作映射 -j SNAT/DNAT
04. 映射成什么地址 --to-source ip地址/--to-destination ip地址
需求:将网关的IP和9000端口映射到内网服务器的22端口
端口映射 10.0.0.7:9000 -->172.16.1.8:22
实现命令:
iptables -t nat -A PREROUTING -d 10.0.0.7 -i eth0 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.8:22
(1)-d 10.0.0.8目标地址。
(2)-j DNAT 目的地址改写。