HTTP协议概念原理说明
1. 当用户访问一个网站时经历的过程
# ①. 利用DNS服务,将输入的域名解析为相应的IP地址 a 本地主机输入域名后,会查询本地缓存信息和本地hosts b 本地主机会向远程LDNS服务器,发送递归查询请求 LDNS是网卡配置的DNS服务(223.5.5.5 114.114.114.114) c LDNS服务器会向根域名服务器发出请求,将请求响应给LDNS服务器 d LDNS服务器会向*域名服务器发出请求,将请求响应给LDNS服务器 e LDNS服务器会向二级域名服务器发出请求,将请求响应给LDNS服务器 f LDNS服务器收到二级域名服务器响应过来的信息(解析记录),进行本地缓存 将解析记录发送给本地主机 g 本地主机收到LDNS服务器的响应信息,也会将解析记录进行缓存,利用IP地址访问网站服务器 # ②. 利用已知的IP地址,进行网络三次握手连接建立 # ③. 本地主机客户端向网站服务端,发出请求 http请求数据包(http请求报文) # ④. 网站服务端向本地主机客户端,回复响应 http响应数据包(http响应报文) # ⑤. 完成网络四次挥手断开过程
2. HTTP通讯原理说明
HTTP请求报文 请求行: * 请求方法: 希望客服务端完成我的什么样请求 get 获取服务端的文件内容 post 存储提交数据到服务端 * 协议版本:http1.0 http1.1 http2.0 http1.0: 属于TCP短连接类型协议 http1.1:属于TCP长连接类型协议 请求头: 空行 请求主体 * get方法:没有请求主体内容 * post方法:会有请求主体内容 HTTP响应报文 起始行: * 状态码信息
HTTP请求报文:
HTTP响应报文:
3. HTTP 协议资源说明
# 1. 媒体资源类型 web服务可以处理接收的资源类型(text/html css jpg avi) 一般在web服务软件程序中,会有一个文件来定义媒体资源类型(mime.type) # 2. URL/URI URL 统一资源定位符 URI 统一资源标识符 www.jd.com / error2.aspx URL URI # 3. 静态文件资源 静态网页资源有几个重要的特征: 1) 每个页面都有一个固定的URL地址,且URL一般以.html、.htm、.shtml等常见形式为后缀, 而且地址中不含有问号“?”或“&”等特殊符号。 2) 静态网页是实实在在保存在服务器上的文件实体,每个网页都是一个独立的文件。 3) 网页内容是固定不变的,因此,容易被搜索引擎收录(容易被用户找到)(优点)。 4) 因为网页没有数据库的支持,所以在网站制作和维护方面的工作量较大, 当网站信息量很大时,完全依靠静态网页比较困难(缺点)。 5) 网页的交互性较差,在程序的功能实现方面有较大的限制(缺点)。 6) 网页程序在用户浏览器端解析,如IE浏览器,程序解析效率很高, 由于服务器端不进行解析,并且不需要读取数据库,因此服务器端可以接受更多的并发访问。 当客户端向服务器请求数据时,服务器会直接从磁盘文件系统上返回数据(不做任何解析)。 待客户端拿到数据后,在浏览器端解析并展现出来(优点)。 # 4. 动态文件资源 1) 网页扩展名后缀常见为:.asp、.aspx、.php、.js、.do、.cgi等。 ※ 2) 网页一般以数据库技术为基础,大大降低了网站维护的工作量。 3) 采用动态网页技术的网站可以实现更多的功能, 如用户注册、用户登录、在线调查、投票、用户管理、订单处理、发博文等。 4) 动态网页并不是独立存在于服务器上的网页文件,当用户请求服务器上的动态程序时, 服务器解析这些程序并可能通过读取数据库来返回一个完整的网页内容。 5) 动态网页中的“?”在搜索引擎的收录方面存在一定的问题, 搜索引擎一般不会从一个网站的数据库中访问全部网页,或者出于技术等方面的考虑, 搜索蜘蛛一般不会去抓取网址中“?”后面的内容,因此在企业通过搜索引擎进行推广时, 需要针对采用动态网页的网站做一定的技术处理(伪静态技术),以便适应搜索引擎的抓取要求。 # 5. 伪静态文件资源 根本实质还是动态资源,将动态资源伪装成静态 动态不便于搜索引擎收录 响应速度较慢
4. 网站度量值统计方法:
# 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:标识用户主机身份信息
架构之nginx的Web服务
1. web服务软件种类介绍
# 1.1 常用来提供静态Web服务的软件有如下三种: # Apache: 这是中小型Web服务的主流,Web服务器中的老大哥。 # Nginx: 大型网站Web服务的主流,曾经Web服务器中的初生牛犊,现已长大。 Nginx的分支Tengine(http://tengine.taobao.org/)目前也在飞速发展。 # Lighttpd: 这是一个不温不火的优秀Web软件,社区不活跃,静态解析效率很高。 在Nginx流行前,它是大并发静态业务的首选,国内百度贴吧、豆瓣等众多网站都有Lighttpd奋斗的身影。 # 1.2 常用来提供动态服务的软件 # PHP(FastCGI): 大中小型网站都会使用,动态网页语言PHP程序的解析容器。 它可配合Apache解析动态程序,不过,这里的PHP不是FastCGI守护进程模式,而是mod_php5.so(module)。 也可配合Nginx解析动态程序,此时的PHP常用FastCGI守护进程模式提供服务。 # Tomcat: 中小企业动态Web服务主流,互联网Java容器主流(如jsp、do)。 # Resin: 大型动态Web服务主流,互联网Java容器主流(如jsp、do)。
2. nginx软件服务介绍
如果你使用过Apache软件,那么很快就会熟悉Nginx软件,与Apache软件类似, Nginx(“engine x”)是一个开源的,支持高性能、高并发的WWW服务器和代理服务软件。 Nginx可以运行在UNIX、Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系统中
3. nginx软件特征介绍
· 支持高并发:能支持几万并发连接(特别是静态小文件业务环境) · 资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB · 支持异步网络I/O事件模型epoll(Linux 2.6+); apache(select模型)
4. nginx软件功能介绍
1)作为Web服务软件(处理用户访问静态请求) 2)反向代理或负载均衡服务 3)前端业务数据缓存服务
5. nginx软件模型特点说明
apache与nginx软件对比说明??? # apache使用select模型 # nginx使用epoll模型 举例说明:宿舍管理员 select模型版管理员 会一个一个房间查询人员 epoll模型版管理员 会进行检索后,直接找到需要找的人
6. nginx软件编译安装
# 第一个步:软件依赖包安装 pcre-devel: perl语言正则表达式兼容软件包 openssl-devel:使系统支持https方式访问 [root@web01 ~]# yum install -y pcre-devel openssl-devel # 第二个步:创建一个管理nginx进程的虚拟用户 [root@web01 ~]# useradd www -s /sbin/nologin -M # 第三个步:下载并解压nginx软件 [root@web01 tools]# pwd /server/tools [root@web01 tools]# wget http://nginx.org/download/nginx-1.12.2.tar.gz # 下载到 /server/tools 目录下 ... [root@web01 tools]# tar xf nginx-1.12.2.tar.gz # 第四个步:进行软件编译安装 # 软件编译安装三部曲: # ①. 编译配置 # 参数: --prefix=PATH 指定软件安装在什么目录下 --user=USER 指定软件worker进程管理用户(利用www虚拟用户管理worker进程) --group=GROUP 指定软件worker进程管理用户组 --with-http_ssl_module 使nginx程序可以支持https访问功能 --with-http_stub_status_module 用于监控用户访问nginx服务情况 # 命令: [root@web01 nginx-1.12.2]# ./configure --prefix=/application/nginx-12.2 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module # ②. 编译过程 [root@web01 nginx-1.12.2]# make # ③. 编译安装 [root@web01 nginx-1.12.2]# make install # 第五个步:为nginx程序软件创建链接目录 [root@web01 nginx-12.2]# ln -s /application/nginx-12.2/ /application/nginx # 第六个步:启动nginx程序服务 [root@web01 application]# /application/nginx/sbin/nginx [root@web01 application]# ps -ef |grep nginx root 8046 1 0 01:25 ? 00:00:00 nginx: master process /application/nginx/sbin/nginx www 8047 8046 0 01:25 ? 00:00:00 nginx: worker process root 8049 2735 0 01:25 pts/0 00:00:00 grep --color=auto nginx [root@web01 application]#
7. nginx软件程序目录结构
nginx.conf nginx程序主配置文件 # 精简nginx.conf配置文件内容: [root@web01 conf]# egrep -v "#|^$" nginx.conf.default >nginx.conf # 去掉空格和注释 nginx配置文件组成: ①. main nginx主区块 ②. event nginx事件区块 ③. http nginx http功能区块 ④. server nginx 网站主机区块 ⑤. location nginx 匹配或者定位区块 html 目录 --- nginx程序站点目录 logs 目录 --- nginx程序日志文件保存目录 sbin 目录 --- nginx程序命令所在目录 nginx命令参数说明: -V --- 查看nginx软件编译配置参数 -t --- 检查nginx配置文件语法格式是否正确 -s --- 用于管理nginx服务运行状态 stop # 停止nginx服务 reload # 平滑重启nginx服务器 # 重启nginx服务: nginx -s stop 先停止 nginx 再启动
nginx配置文件结构:
nginx配置文件详解:
8. 编写nginx服务配置
# 三个语法格式说明: ①. 大括号要成对出现 ②. 每一行指令后面要用分号结尾 ③. 每一个指令要放置在指定的区块中 # 实现编写一个网站页面 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; } } } # 实现编写多个网站页面==编写多个虚拟主机(等于一个网站) # 第一步:编写配置文件 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.com; location / { root html/www; index index.html index.htm; } } server { listen 80; server_name bbs.etiantian.com; location / { root html/bbs; index index.html index.htm; } } server { listen 80; server_name blog.etiantian.com; location / { root html/blog; index index.html index.htm; } } } # 第二步:创建站点目录: [root@m01 ~]# mkdir -p /application/nginx/html/{www,bbs,blog} # 第三步: 创建站点目录下首页文件: [root@m01 ~]# for name in www bbs blog;do echo "10.0.0.7 $name.etiantian.org" >/application/nginx/html/$name/index.html;done [root@m01 ~]# 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文件,进行解析 [root@m01 ~]# tail -1 /etc/hosts 10.0.0.7 www.etiantian.com bbs.etiantian.com blog.etiantian.com [root@m01 ~]# for domain in www bbs blog;do curl $domain.etiantian.com;done 10.0.0.7 www.etiantian.org 10.0.0.7 bbs.etiantian.org 10.0.0.7 blog.etiantian.org # 把每个 nginx.conf文件中的 server 放到单独的文件中 [root@web01 conf]# mkdir extra # 创建一个 extra 的目录 [root@web01 conf]# sed -n "10,17p" nginx.conf>extra/www.conf # 在 extra 目录下为每个 server 做单独的配置 [root@web01 conf]# sed -n "18,25p" nginx.conf>extra/bbs.conf # 在 extra 目录下为每个 server 做单独的配置 [root@web01 conf]# sed -n "26,33p" nginx.conf>extra/blog.conf # 在 extra 目录下为每个 server 做单独的配置 # 把 nginx.conf 修改为如下: [root@web01 conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; include extra/www.conf; # include 指令:把 extra/www.conf 配置文件引入到 nginx.conf 中 include extra/bbs.conf; # include 指令:把 extra/bbs.conf 配置文件引入到 nginx.conf 中 include extra/blog.conf; # include 指令:把 extra/blog.conf 配置文件引入到 nginx.conf 中 } # 虚拟主机配置文件编写方法: ①. 基于域名的虚拟主机配置方法(最常用) ②. 基于端口的虚拟主机配置方法 说明:当你访问的网站域名在虚拟主机配置中不存在时,默认会将第一个虚拟主机的配置页面响应给用户 ③. 基于IP地址的虚拟主机配置方法 说明:nginx服务中只要涉及IP地址的修改,都需要重启nginx服务,而不能采用平滑重启
9. Nginx服务日志信息
错误日志 访问日志 # 01. 错误日志 Syntax: error_log file [level]; # 语法格式 Default: error_log logs/error.log error; # 默认错误日志 Context: main, http, mail, stream, server, location # 能够使用的区块 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; vim nginx.conf # 自己配置的错误日志示例 error_log logs/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级别时,错误日志记录的内容会更加丰富 =========================================================================================== # 02. 访问日志(重点关注) 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 [root@web01 conf]# vim nginx.conf 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/www_access.log main; # 调用上面配置好的 main # 03. 日志要进行切割 # 利用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 # 重启 nginx 服务重新生成 日志文件 # cut nginx log cron * */6 * * * /bin/sh /server/scripts/cut_log.sh &>/dev/null
10. Nginx服务 location 区块说明:
# 利用 location 区块可以用于定位或者匹配网站资源信息 企业需要解决: 搭建好一台nginx的web服务器,配置好内网网卡地址与外网网卡地址; web服务的网站域名为 www.etiantian.org ,站点目录为 html/www 需求内网用户可以访问网站 http://www.etiantian.org/AV 资源信息, 需求外网用户禁止访问网站 http://www.etiantian.org/AV 资源信息。 # 1. 利用 nginx 进行访问控制: deny allow ngx_http_access_module --- 实现访问控制模块 官方链接:http://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; } # 2. 定位站点目录资源信息: location 区块进行定位站点目录下资源信息: Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Default: — Context: server, location 官方链接:http://nginx.org/en/docs/http/ngx_http_core_module.html#location # 第一步:编写 nginx 配置文件 [root@web01 ~]# cd /application/nginx/conf/extra/ [root@web01 extra]# vim www.conf # www.conf 修改为如下: server { listen 80; server_name www.etiantian.org; root html/www; index index.html index.htm; location /AV { # location /AV 用于定位资源 allow 172.16.1.0/24; # 内网用户能访问 # deny 10.0.0.0/24; # 外网网段不能访问 } } server { listen 80; server_name www.etiantian.org; root html/www; index index.html index.htm; location / { deny 172.16.1.0/24; allow 10.0.0.0/24; } } # 第二步:创建测试访问资源 [root@web01 www]# pwd /application/nginx/html/www [root@web01 www]# mkdir AV [root@web01 www]# echo "AV info" >AV/oldboy.html [root@web01 www]# cat AV/oldboy.txt AV info # 第三步:重启 nginx 服务: [root@web01 www]# /application/nginx/sbin/nginx -s reload # 第四步:用浏览器测试 用浏览器访问: http://www.etiantian.org/AV/oldboy.html 返回403 # 用其他主机测试:(需要先把该主机的 hosts 文件修改:172.16.1.7 www.etiantian.org) [root@m01 ~]# curl www.etiantian.org/AV/oldboy.html AV info # location 区块的用法: Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Default: — Context: server, location = 表示精确匹配网站 uri 资源信息 ~ 表示区分大小写匹配网站 uri 资源信息 ~* 不区分地大小写匹配网站 uri 资源信息 ^~ 优先匹配网站 uri 资源信息 /AV/ 指定匹配网站资源目录信息 / 默认匹配网站资源信息 ! 对匹配的内容进行取反 # 示例: location = / { # = 的优先级最高 (优先级:1) [ configuration A ] } location / { # 当其它的所有匹配都不满足时候,则匹配这个默认的 location (优先级别:4) [ configuration B ] } location /documents/ { # 根据资源目录进行匹配 (优先级别:3) [ configuration C ] } location ^~ /images/ { # ^~ 优先匹配(优先级别:2) [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { # 不区分大小写匹配网站资源 (优先级别:3) [ configuration E ] }
11. nginx服务 rewrite 指定说明
# 1. 实现域名地址信息跳转 # 2. 用于做伪静态 www.etiantian.org/oldboy?edu.html # --- 动态资源 www.etiantian.org/oldboy-edu.html # --- 伪静态 # 实现类似百度重写域名的功能: baidu.com ===> www.baidu.com etiantian.org ===> www.etiantian.org # rewrite 用法: Syntax: rewrite regex replacement [flag]; # rewrite 正则 替换成什么 [标识] Default: — Context: server, location, if An optional flag parameter can be one of: 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. # 修改 www.conf 配置文件的内容为如下: server { # 新添加一个 server 区块 listen 80; server_name etiantian.org; root html/www; index index.html index.htm; rewrite ^/(.*) http://www.etiantian.org/$1 permanent; # ^/ ---> 表示 url ;(.*) 表示所有 uri 信息; $1 表示 后向引用 } server { listen 80; server_name www.etiantian.org; root html/www; index index.html index.htm; }
LNMP架构
1. LNMP架构说明
1)使前端web服务和后端存储服务进行串联 2)主要实现处理PHP程序动态请求 L Linux N nginx M mysql P php
2. LNMP架构部署
2.1 安装LNMP相关软件 (包括部署 mysql )
①. 部署Linux系统 基础优化操作要完成(防火墙关闭 关闭selinux /tmp权限为1777) ②. 部署nginx服务 暂时忽略 # ③. 部署mysql服务 # 1、yum部署软件 2、编译安装软件 3、二进制包方式部署mysql服务 #第一个步:下载并解压mysql软件程序 #mysql官方下载链接地址:ftp://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/ # 上传mysql软件程序,进行利用xftp软件进行上传 [root@web01 tools]# tar xf mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz [root@web01 tools]# mv mysql-5.6.34-linux-glibc2.5-x86_64 /application/mysql-5.6.34 # 第二个步:创建软件程序软链接 [root@web01 ~]# ln -sf /application/mysql-5.6.34/ /application/mysql # 第三个步:创建数据库管理用户,并授权数据目录 [root@web01 ~]# useradd mysql -M -s /sbin/nologin [root@web01 ~]# chown -R mysql.mysql /application/mysql/data/ # 第四个步:对数据库服务进行初始化 [root@web01 ~]# /application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data/ --user=mysql # 第五个步:启动mysql服务 [root@web01 ~]# cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld # 创建 mysql 启动入口 [root@web01 ~]# sed -ri 's#/usr/local#/application#g' /etc/init.d/mysqld /application/mysql/bin/mysqld_safe # 修改这两个文件中的 程序目录 [root@web01 ~]# cp /application/mysql/support-files/my-default.cnf /etc/my.cnf # 把 mysql 的默认配置文件由 系统默认的/etc/my.cnf 改成 mysql 自带的 my-default.cnf /etc/init.d/mysqld start # 启动 mysql 服务 # 第六个步:设置数据库root用户登录密码 [root@web01 ~]# /application/mysql/bin/mysqladmin -uroot password "oldboy123" # mysqladmin 为设置密码的命令 [root@web01 ~]# /application/mysql/bin/mysql -uroot -poldboy123 # 进入 mysql 的命令 ④. PHP软件安装部署过程 # 第一步:解决PHP软件的依赖关系 [root@web01 ~]# 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软件安装---字符集转换库(默认可以不进行安装了) [root@web01 ~]# cd /server/tools #wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz [root@web01 tools]# tar zxf libiconv-1.14.tar.gz [root@web01 tools]# cd libiconv-1.14 [root@web01 libiconv-1.14]# ./configure --prefix=/usr/local/libiconv [root@web01 libiconv-1.14]# make [root@web01 libiconv-1.14]# make install #wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo [root@web01 ~]# yum -y install libmcrypt-devel mhash mcrypt [root@web01 ~]# rpm -qa libmcrypt-devel mhash mcrypt # 第二步:下载解压PHP软件 # php官方网站下载:php.net [root@web01 ~]# cd /server/tools/ [root@web01 tools]# tar xf php-5.5.32.tar.gz [root@web01 tools]# cd php-5.5.32 # 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 ##防错(以下信息可以不进行配置了) [root@web01 php-5.5.32]# ln -s /application/mysql/lib/libmysqlclient.so.18 /usr/lib64/ [root@web01 php-5.5.32]# touch ext/phar/phar.phar [root@web01 php-5.5.32]# make [root@web01 php-5.5.32]# make install [root@web01 php-5.5.32]# ln -s /application/php-5.5.32/ /application/php # 创建 软链接 # 第三步:设置PHP程序配置文件:php.ini php-fpm.ini [root@web01 php-5.5.32]# cp php.ini-production /application/php-5.5.32/lib/ [root@web01 php-5.5.32]# cd /application/php/etc/ [root@web01 php-5.5.32]# cp php-fpm.conf.default php-fpm.conf # 第四步:启动php程序服务 [root@web01 ~]# /application/php/sbin/php-fpm [root@web01 ~]# netstat -lntup|grep php tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 6251/php-fpm
2.2 进行软件直接的结合
# nginx与php结合:编写 nginx 配置文件 [root@web01 ~]# cd /application/nginx/conf/extra/ [root@web01 extra]# vim blog.conf [root@web01 extra]# cat blog.conf server { listen 80; server_name blog.etiantian.org; root html/blog; index index.html index.htm; location ~* .*\.(php|php5)?$ { # nginx 与 php 程序结合的部分 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 extra]# cd /application/nginx/html/blog/ [root@web01 blog]# \rm -rf ./* [root@web01 blog]# vim test_info.php [root@web01 blog]# cat test_info.php [root@web01 blog]# # php与mysql结合:编写php程序代码 [root@web01 blog]# pwd /application/nginx/html/blog [root@web01 blog]# vim test_mysql.php [root@web01 blog]# cat test_mysql.php [root@web01 blog]#
2.3 部署一个真的网站
# 第一步:下载与上传网站代码 # 第二步:解压程序代码,将程序代码保存到站点目录并进行授权 tar xf wordpress-4.7.3-zh_CN.tar.gz mv wordpress/* /application/nginx/html/blog/ chown -R www.www /application/nginx/html/blog/ # 第三步:直接访问blog网站,进行初始化操作 创建数据库: create database wordpress; show databases; # 创建连接数据库用户信息 mysql> grant all on wordpress.* to 'wordpress'@'localhost' identified by 'oldboy123'; mysql> select user,host from mysql.user;
nginx 反向代理负载均衡
1. 数据库服务数据迁移
# 迁移数据库:利用数据库备份命令(mysql mysqladmin mysqldump) # 1.1 备份数据库数据库信息 [root@web01 ~]# /application/mysql/bin/mysqldump -uroot -p123456 --all-databases >/tmp/bak.sql # 数据库迁移 [root@web01 ~]# scp /tmp/bak.sql 172.16.1.51:/tmp/ # 把 bak.sql 文件远程复制到 51主机(db01)上 # 1.2 恢复数据库数据库信息 # 利用 bak.sql 文件把数据在51主机上恢复 [root@db01 tmp]# /application/mysql/bin/mysql -uroot -p123456grant all on wordpress.* to 'wordpress'@'172.16.1.0/255.255.255.0' identified by '123456'; # 1. grant all on wordpress.* ---> 授予所有的权限给 wordpress数据库中的所有表; # 2. to 'wordpress'@'172.16.1.0/255.255.255.0' ---> 授权给 wordpress 用户, wordpress 这个用户只能在 172.16.1.0/255.255.255.0 这个网段的主机上登陆 # 3. identified by '123456' ---> 登陆密码是 123456 mysql> flush privileges; # 在 172.16.1.7 这台主机上登陆 172.16.1.51 主机上的 MySQL [root@web01 ~]# /application/mysql/bin/mysql -uwordpress -p123456 -h 172.16.1.51 # -h 参数表示登陆的 MySQL的远程地址 # 1.3 数据库迁移完毕,修改网站连接数据库的配置文件 [root@web01 ~]# mysql -uwordpress -poldboy123 -h 172.16.1.51 <-- 修改配置文件之前,先测试网站web服务器与迁移后的数据库连通性 [root@web01 ~]# cd /application/nginx/html/blog/ [root@web01 blog]# vim wp-config.php <-- 修改wordpress上的数据库连接参数信息 # 修改远程主机地址 /** MySQL主机 */ define('DB_HOST', '172.16.1.51'); [root@web01 blog]# /etc/init.d/mysqld stop # 关闭 172.16.1.7 主机上的 mysql 服务 <--- web服务器数据库此时可以关闭了 # 1.4 停止nginx服务器上MySQL服务 [root@web01 blog]# /etc/init.d/mysqld stop
2. 数据迁移到NFS存储
# 2.1:先将原有目录中数据移出 [root@web01 ~]# cd /application/nginx/html/blog/wp-content/uploads [root@web01 ~]# mkdir /tmp/wordpress_backup -p [root@web01 uploads]# mv ./* /tmp/wordpress_backup/ # 把 uploads 目录下所有的文件 移动到 /tmp/wordpress_backup/ 下面 # 数据存储到本地什么位置,获取方法: # ①. 通过网站页面右键点击,获取资源地址信息 ②. find命令利用-mmin 5 ③. 利用inotify服务监控目录数据变化 # 2.2:NFS服务器上配置创建共享目录: # nfs详细配置过程参考前面章节 [root@web01 ~]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24 ... [root@web01 wp-content]# pwd /application/nginx/html/blog/wp-content [root@web01 wp-content]# mount -t nfs 172.16.1.31:/data/ ./uploads/ # 把 该web01主机上的 /application/nginx/html/blog/wp-content/uploads/ 目录挂载到 远程31主机上的 /data/ 目录下 [root@web01 wp-content]# cd uploads [root@web01 uploads]# mv /tmp/wordpress_backup/* ./ # 把 /tmp/wordpress_backup/ 目录下存储的所有文件再移动到 uploads 目录下 # 把 /application/nginx/html/blog/wp-content/uploads 改成 777
3. nginx反向代理负载均衡
# 客户端 --- 代理服务器 --- 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
3.1. 部署web服务器:
# 第一步:安装部署nginx软件 (7、8、9主机都要部署nginx) 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 # 第二步:编辑nginx配置文件 # 修改 nginx.conf 文件为如下: [root@web01 ~]# cat /application/nginx/conf/nginx.conf worker_processes 1; error_log logs/www_error.log error; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; 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/www_access.log main; server { # 这个 server 是新添加的 listen 80; server_name www.etiantian.org; root html/www; index index.html index.htm; } server { # 这个 server 也是新添加的 listen 80; server_name bbs.etiantian.org; root html/bbs; index index.html index.htm; } } [root@web01 ~]# scp -rp /application/nginx/conf/nginx.conf 172.16.1.8:/application/nginx/conf/ # 把修改后的配置文件复制到远程的 8 主机 [root@web01 ~]# scp -rp /application/nginx/conf/nginx.conf 172.16.1.8:/application/nginx/conf/ # 把修改后的配置文件复制到远程的 9 主机 # 第三步:创建模拟测试环境 [root@web01 ~]# mkdir /application/nginx/html/{www,bbs} -p [root@web01 ~]# for name in www bbs;do echo "$(hostname) $name.etiantian.org" >/application/nginx/html/$name/oldboy.html;done [root@web01 ~]# for name in www bbs;do cat /application/nginx/html/$name/oldboy.html;done # 第四步:在负载均衡服务器上,进行测试访问 [root@web01 ~]# curl -H host:www.etiantian.org 10.0.0.7/oldboy.html web01 www.etiantian.org [root@web01 ~]# curl -H host:bbs.etiantian.org 10.0.0.7/oldboy.html web01 bbs.etiantian.org [root@web01 ~]# curl -H host:www.etiantian.org 10.0.0.8/oldboy.html web02 www.etiantian.org [root@web01 ~]# curl -H host:bbs.etiantian.org 10.0.0.8/oldboy.html web02 bbs.etiantian.org [root@web01 ~]# curl -H host:www.etiantian.org 10.0.0.9/oldboy.html web03 www.etiantian.org [root@web01 ~]# curl -H host:bbs.etiantian.org 10.0.0.9/oldboy.html web03 bbs.etiantian.org
3.2 部署负载均衡服务器
# 第一步:安装部署nginx软件 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 # 第二步:编写nginx反向代理配置文件 [root@lb01 conf]# pwd /application/nginx/conf [root@lb01 conf]# grep -Ev "#|^$" nginx.conf.default >nginx.conf # 官方链接:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream Syntax: upstream name { ... } Default: — Context: http # 例如: upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; } # 说明:upstream模块就类似定一个一个地址池或者说定一个web服务器组 # 官方链接: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模块中的相应节点服务器 [root@lb01 conf]# pwd /application/nginx/conf [root@lb01 conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream oldboy { # upstream 模块 是定义一个集群节点的池子(组) 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; # 进行调试;表示用 oldboy 这个集群组;当用户访问到负载均衡器时,通过 proxy_pass 把请求发送到 相应的集群组中,发送到集群组后,再分配到集群中的每个节点中 } } } # 重启 nginx /application/nginx/sbin/nginx -t /application/nginx/sbin/nginx -s reload # 第三步:进行访问负载均衡服务器测试 # 1)利用浏览器进行测试 # 进行hosts解析:此时的 hosts文件 域名解析 应该是 10.0.0.5 这台负载均衡器主机,因为用户访问的是 负载均衡服务器(05主机) http://www.etiantian.org/oldboy.html <--利用ctrl+F5刷新测试,检查是否进行负载调度 # 2)利用curl命令进行测试 [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
注:日1000-2000W PV 或 并发请求1万以下都可以考虑用 haproxy/Nginx (LVS的NAT模式)
4. Nginx反向代理负载均衡模块功能详述
4.1 ngx_http_upstream_module 模块
链接:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream
# 4.1.1 模块常用功能说明: # 1)定义后端集群web节点信息,定义一个地址的池子 upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; } # 2)实现权重值负载访问功能 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; } # 3)定义后端访问的失败次数-max_fails upstream oldboy { server 10.0.0.7:80 weight=3 max_fails=3; server 10.0.0.8:80 weight=1 max_fails=3; server 10.0.0.9:80 weight=1 max_fails=3; } # 4)定义后端失败重试的间隔-fail_timeout upstream oldboy { server 10.0.0.7:80 weight=3 max_fails=3 fail_timeout=10s; server 10.0.0.8:80 weight=1 max_fails=3; server 10.0.0.9:80 weight=1 max_fails=3; } # 说明:在尝试多次失败后,在超时时间过去之后,会再给相应节点一次机会 # 5)定义后端服务的热备节点-backup upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80 backup; } # 4.1.1 模块常用调度算法: # 1)定义轮询调度算法-rr-默认调度算法 采取平均分配 # 2)定义权重调度算法-wrr 能者多劳 # 3)定义静态调度算法-ip_hash upstream oldboy { ip_hash; server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80 backup; } # 说明:配置ip_hash时,一定不能和backup与weight参数同时出现 # 4)定义最小的连接数-least_conn upstream oldboy { least_conn; server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80 backup; }
4.2 ngx_http_proxy_module 模块
# 模块常用功能:proxy_set_header # (1) proxy_set_header ---> 设置反向代理服务器到web服务器的HTTP请求报文中的头部信息 # 10.0.0.5 负载均衡服务器(05主机)上的 nginx.conf 文件的 server 修改为如下: server { listen 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 设置请求头信息;host 表示请求头中的 host ; $host 表示 用户访问反向代理服务器时的请求头中的 host 的值 } } server { listen 80; server_name bbs.etiantian.org; proxy_set_header host $host; root html; index index.html index.htm; location / { proxy_pass http://oldboy; proxy_set_header host $host; } } # 说明:通过以上配置,可以实现访问负载均衡看到不同虚拟主机页面信息 # 不设置proxy_set_header host $host 、只设置 proxy_pass http://oldboy 时,proxy_pass 会以 oldboy 这个集群组的名字去群集池中分配后端web服务器,此时用的是 IP地址(如10.0.0.7)访问web服务器,由于web服务器上没有IP对应的虚拟主机,此时不管用户要访问哪个主机,都会默认会匹配到第一个虚拟主机 # (2) proxy_set_header ---> 实现用户访问反向代理服务,让web服务器日志中记录真实用户IP地址信息 # 10.0.0.5 负载均衡服务器(05主机)上的 nginx.conf 文件的 server 修改为如下: server { listen 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; # $remote_addr 表示 用户访问反向代理服务器时的请求头中的 远程IP地址(即用户的IP地址);不设置该配置时,web服务器上的日志中只能记录到 负载均衡服务器(10.0.0.5主机)的IP地址 } } server { listen 80; server_name bbs.etiantian.org; root html; index index.html index.htm; location / { proxy_pass http://oldboy; proxy_set_header X-Forwarded-For $remote_addr; } }
示例运用:
# 需求一:负载均衡反向代理根据请求地址分配 # 先进行企业案例需求梳理: 当用户请求www.etiantian.org/upload/xx 地址时,实现由upload上传服务器池处理请求。 当用户请求www.etiantian.org/static/xx 地址时,实现由静态服务器池处理请求。 除此以外,对于其他访问请求,全都由默认的动态服务器池处理请求。 用户请求(URI) 处理请求服务器 站点目录 功能 /upload 10.0.0.8:80 html/www/upload upload服务器 /static 10.0.0.7:80 html/www/static static静态服务器 / 10.0.0.9:80 html/www 默认 # 1)完成 nginx网站服务器 配置 # 第一步:创建测试环境 # 10.0.0.8 主机上创建upload目录,然后生成网站测试页面文件 [root@web02 html]# cd /application/nginx/html/www/ [root@web02 www]# mkdir uploads [root@web02 www]# cp ./oldboy.html uploads/ [root@web02 www]# ll uploads/ total 4 -rw-r--r-- 1 root root 24 Jun 10 00:01 oldboy.html # 10.0.0.7 主机上创建static目录,然后生成网站测试页面文件 [root@web01 ~]# cd /application/nginx/html/www/ [root@web01 www]# mkdir static [root@web01 www]# cp oldboy.html static/ [root@web01 www]# ll static/ total 4 -rw-r--r-- 1 root root 24 Jun 10 00:04 oldboy.html # 10.0.0.9 主机上创建默认测试页面文件即可 # 第二步:利用lb01进行访问测试 [root@lb01 ~]# curl -H host:www.etiantian.org 10.0.0.8/oldboy.html web02 www.etiantian.org [root@lb01 ~]# curl -H host:www.etiantian.org 10.0.0.7/oldboy.html web01 www.etiantian.org [root@lb01 ~]# curl -H host:www.etiantian.org 10.0.0.9/oldboy.html web03 www.etiantian.org # 2)完成 nginx反向代理服务器 配置 # 第一步:配置upstream模块信息 # 修改 nginx.conf 文件中关于 upstream 的配置为如下: upstream static { # 指定 static 集群组的 web服务器为 07主机 server 10.0.0.7:80; } upstream uploads { # 指定 static 集群组的 web服务器为 08主机 server 10.0.0.8:80; } upstream default { # 指定 static 集群组的 web服务器为 09主机 server 10.0.0.9:80; } # 第二步:配置 proxy_pass 模块信息 server { listen 80; server_name www.etiantian.org; root html; index index.html index.htm; location /static { # 定位 /static proxy_pass http://static; # 分配到 static 集群组 proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } location /uploads { # 定位 /uploads proxy_pass http://uploads; # 分配到 uploads 集群组 proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } location / { # 默认定位 proxy_pass http://default; # 分配到 default 集群组 proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } } # 需求二:负载均衡反向代理根据访问软件分配 # 根据用户请求客户端软件(如PC端和手机访问等),显示不同页面信息 # 1)nginx 网站服务器 配置 # 第一步:创建测试环境 (与上面的大致相同) # 在 07、08、09 主机上 创建网站测试页面文件 oldboy.html # 测试访问 # 2)nginx 反向代理服务器 配置 # 第一步:配置upstream模块信息 # upstream 配置修改为如下: upstream android { server 10.0.0.7:80; } upstream iphone { server 10.0.0.8:80; } upstream pc { server 10.0.0.9:80; } # 第二步:配置proxy_pass模块信息 # proxy_pass 的配置为如下: location / { if ($http_user_agent ~* "android"){ # $http_user_agent 表示 用户终端的设置 proxy_pass http://android; } if ($http_user_agent ~* "iphone"){ proxy_pass http://iphone; } proxy_pass http://pc; # 其它情况则分配给 pc 这个集群组 proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } }