商用及企业级服务器搭建之三:Apache与Nginx,CDN,集群与分布
Apache与Nginx
作用:
位于用户请求与系统各功能模块之间,处理用户请求,并起到接连系统各功能模块的作用,有点像迎宾的作用。
原理:
- Apache:多进程,每个进程派生多个线程执行任务,连接采用select 轮询模型,单个线程能处理多个连接,io访问通过等待,进程与线程间切换会浪费很多时间,稳定性好,但高并发是个问题,异常处理方式直接关掉对应的进程与线程。
- Nginx:单进程单线程,异步执行任务,连接采用epoll 消息通知模型,io访问通过异步通知,一个进程处理多个连接,不存在进程与线程间切换浪费时间问题从而达到高并发性能,但这也导致稳定性是个问题,异常处理方式直接关掉对应的进程并重新开启新的进程,所以一般是一核一个进程,如果单核可以两个进程。
优缺点:
Apache:
- 优点:
比较早,性能稳定,扩展与支持相对多,操作系统支持相对多。 - 缺点:
占用内存cup等资源相对大,高并发相对差,对多核支持相对差。
Nginx:
- 优点:
比较新,占用内存cup等资源相对少,高并发,对多核支持好。 - 缺点:
性能相对不稳定,扩展与支持相对少,操作系统支持相对少。
推荐使用:Nginx
- 原因:Nginx是Apache的升级版,高并发,占用资源少,服务器成本低。
处理请求的过程:
Apache:
- Post-Read-Request 读取请求头阶段:这个时候可以按规则注册一个功能给apache执行,也就是大家说的钩子。
- URI Translation 地址本地化阶段:将请求的URL映射到本地文件系统,由mod_alias mod_rewrite等担任。可以插入钩子
- Header Parsing 检查请求的头部阶段:由mod_setenvif等担任,可以插入钩子
- Access Control 允许访问控制阶段:由mod_authz_host等担任,可以插入钩子
- Authentication 认证授权阶段:由mod_authz_host等担任,可以插入钩子
- Authorization 执行请求授权阶段 : 由mod_authnz_ldap等担任,可以插入钩子
- MIME Type Checking mime 类型检查阶段:检查mime类型并处理 由mod_negotiation和mod_mime等担任,可以插入钩子
- FixUp 内容处理阶段:内容在内容生成器之前的处理,由mod_dir等担任,可以插入钩子
- Response 返回内容阶段:生成返回客户端的内容 ,由mod_headers等担任,可以插入钩子
- Logging 日志记录阶段:在回复已经发送给客户端之后记录事务,由mod_log_referer等担任,可以插入钩子
- CleanUp 清理阶段:清理本次请求事务处理完成之后遗留的环境,比如文件、目录的处理或者Socket的关闭等,由mod_cache等担任,可以插入钩子
Nginx:
- Nginx本身轻量,做的工作也少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。
- Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master父进程和多个子进程(包含多个worker进程,一个Cache manager进程,一个Cache loader进程)。其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求。Cache manager进程缓存管理。Cache loader进程缓存载入
- Nginx的模块
从结构上分为核心模块、基础模块和第三方模块:
核心模块:HTTP模块、EVENT模块和MAIL模块
基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,
第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。
从功能上分为如下三类:
Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。
Filters (过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
Proxies (代理类模块)。此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。
接收和处理这些事件,如是接受到数据,则产生更高层的request对象。
安装,配置,启动
apache2.4.*版本
- 下载所需软件包:
wget http://www.apache.org/dist/httpd/httpd-2.4.*.tar.gz
wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz
wget http://archive.apache.org/dist/apr/apr-1.7.0.tar.gz
wget http://archive.apache.org/dist/apr/apr-util-1.6.1.tar.gz - 先安装gcc和gcc-c++ 因为后面编译包时要用,再安装pcre,apr,apr-util 最后安装httpd: (如果是新系统缺少的模块可以用ubuntun的命令apt-get安装) 安装流程中命令 configure 配置,make 编译,make install 安装, apachectl start 启动,apachectl stop 停止, apachectl restart 重启,配置开机自启动:在/etc/rc.local中配置加入一行/usr/local/安装目录/bin/apachectl start
- 配置httpd.conf:(找不到,可以用 find / -name httpd.conf 命令查找文件)
怎么配置:
ServerRoot :服务的根目录
ServerAdmin :管理员的邮箱号
ServerName :网站服务器的域名
Listen :监听ip地址及端口(Listen 80 是默认本机80端口)
User :httpd运行用户名
Group :httpd运行用户组
DocurmentRoot :网站的目录
DirectoryIndex :网站的首页的索引文件名。可以空格分开写多个索引文件。
ErrorLog :错误日志的文件
LogLevel :日志的级别(默认是warn级别)
CustomLog :访问日志的文件
Timeout :访问网页超时的时间
KeepAliveTimeout :等待后续请求超时的时间
ProxyTimeout :代理请求超时的时间
RequestReadTimeout :握手超时的时间
PidFile :保存httpd进程号的文件
AddDefaultCharset :网页默认使用的字符集编码
Include :导入别一个配置文件
< Directory > < /Directory >:区域配置标签组 只对指定的目录有效(其中根目录/表示的是ServerRoot设置的目录)其中有Options(操作选项),AllowOverride(rewrite修改权限),Order(指定allow和deny的先后次序),Allow(允许主机项),Deny(拒绝主机项),Require(访问控制项)六个属性
< IfDefine > < /IfDefine >:定义条件配置标签组 表示有某个定义的情况下有效,一般用于库加载,文件导入,资源导入和设定等
< IfModule > < /IfModule >:模块条件配置标签组 表示有某个模块的情况下有效,一般用于库加载,文件导入,资源导入和设定等
< VirtualHost > < /VirtualHost >:虚拟主机配置标签组 用于设置正向和反向代理服务器 - 静态资源服务器配置:(起一个staticFile.conf名的文件加入以下内容,在httpd.conf中通过Include 导入这个staticFile.conf文件)
DocumentRoot /var/www/static
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Listen 80
Listen 443 - 代理服务器配置:(代理以数据流向服务器为目标点来分,流向服务器叫正向代理,流向客户端叫反向代理)
#####正向代理配置:#####
< VirtualHost *:80 >
DocumentRoot “/var/www/xxx”
ServerName www.xxx.com
ErrorLog logs/www.xxx.com-error.log
CustomLog logs/www.xxx.com-access.log combined
< Directory “/var/www/xxx” >
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
ErrorDocument 404 www.xxx.com/404.html
</ Directory >
</ VirtualHost >
< VirtualHost default:443 >
DocumentRoot “/var/www/xxx”
ServerName www.xxx.com
ErrorLog logs/www.xxx.com-error.log
CustomLog logs/www.xxx.com-access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/www.xxx.com.crt
SSLCertificateKeyFile /etc/ssl/www.xxx.com.key
SSLCertificateChainFile /etc/ssl/www.xxx.com-root-bundle.crt
< Directory “/var/www/xxx” >
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
ErrorDocument 404 https://www.xxx.com/404.html
</ Directory >
</ VirtualHost >
#####反向代理配置:#####
< VirtualHost *:80 >
ServerName www.yyy.com
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://localhost:90/
ProxyPassReverse / http://localhost:90/
</ VirtualHost >
< VirtualHost default:443 >
ServerName www.yyy.com
SSLEngine on
SSLCertificateFile /etc/ssl/www.yyy.com.crt
SSLCertificateKeyFile /etc/ssl/www.yyy.com.key
SSLCertificateChainFile /etc/ssl/www.yyy.com-root-bundle.crt
ProxyPass / http://localhost:90/
ProxyPassReverse / http://localhost:90/
</ VirtualHost >
#####http从定向到https配置:#####
< VirtualHost :80 >
ServerName zzz.com
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.)?$ https://%{SERVER_NAME}$1 [L,R]
</ VirtualHost >
< VirtualHost *:80 >
ServerName zzz.com
Redirect permanent / https://www.proxy.com/
</ VirtualHost >
#####https从定向到http配置:#####
< VirtualHost default:443 >
ServerName www.zzz.com
SSLEngine on
SSLCertificateFile /etc/ssl/www.zzz.com.crt
SSLCertificateKeyFile /etc/ssl/www.zzz.com.key
SSLCertificateChainFile /etc/ssl/www.zzz.com-root-bundle.crt
ProxyPass / http://localhost:90/
ProxyPassReverse / http://localhost:90/
</ VirtualHost >
#####跨域配置:#####
< VirtualHost *:80 >
ServerName www.yyy.com
Header set Access-Control-Allow-Origin *
Header set Access-Control-Allow-Credentials true
Header set Access-Control-Allow-Headers “Origin, X-Requested-With, Content-Type, Accept”
</ VirtualHost >
#####负载均衡配置:#####
主要是起到分流的作用,也就是每个上游都可以访问每个下游的结构设计。
客户端-(DNS)->反向代理层-(nginx)->站点层-(服务连接池)->服务层-(范围或hash)->数据层
算法配置:
ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://www.xxx.com:80 loadfactor=7
BalancerMember http://www.yyy.com:80 loadfactor=2
BalancerMember http://www.zzz.com:80 loadfactor=1
</ Proxy>
ProxyPass / balancer://mycluster
ProxySet lbmethod=bytraffic
热备份配置:
ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://www.xxx.com:80
BalancerMember http://www.yyy.com:80 status=+H
</ Proxy>
ProxyPass / balancer://mycluster
#####集群配置:#####
整体架构是lvs(Linux虚拟服务器2台ip路由)+keepalived(高可用处理服务器2台主备模式防灾管理)+apache(N台代理分流)+tomcat(N台真正的应用服务器)
先在apache服务器安装JK插件,再在httpd.conf中Include文件mod_jk.conf,再配置mod_jk.conf,最后tomcat设置server.xml
nginx1.22.*版本
- 下载所需软件包:
wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz
wget http://nginx.org/download/nginx-1.22.0.tar.gz - 先安装pcre,再安装nginx:(如果是新系统缺少的模块可以用ubuntun的命令apt-get安装) 安装流程中命令 configure 配置,make 编译,make install 安装, /usr/local/nginx/sbin/nginx 启动,nginx停止采用的是进程停止(查进程号然后kill), nginx -s reload 重启,配置开机自启动:在/etc/rc.local中配置加入一行/etc/init.d/nginx start
- 配置nginx.conf:
nginx.conf主要由三部分组成:全局块,events块,http块(http块包含多个server块,server块包含多个location块)
全局块:
user:用户
worker_processes:服务器并发处理能力,以核数相同就可以了
error_log:日记
pid:记录PID文件
events块:
worker_connections:最大连接数
http块:
include:导入
default_type:文件类型
log_format:日志格式
access_log:访问日志
sendfile:用sendfile函数来输出文件
tcp_nopush:延时发送数据的包大小
tcp_nodelay:不用延时
keepalive_timeout:连接超时
gzip:gzip压缩
server块:
listen:监听端口
server_name:域名
charset:编码
access_log:访问日志
error_page:错误跳转页面
location块:
root:根目录
index:网站初始页
proxy_pass:代理
fastcgi_pass:FastCGI服务器监听端口与地址
fastcgi_index:FastCGI网站初始页
fastcgi_param:FastCGI参数
deny:拒绝某个ip或者一个ip段访问
allow:允许某个ip或者一个ip段访问
#####静态资源服务器配置:#####
server {
listen 80;
server_name www.xxx.com;
location / {
root /usr/local/image/;
autoindex on;
}
}
#####正向代理服务器配置:#####
server {
listen 443;
server_name www.xxx.com;
ssl on;
ssl_certificate /root/keys/www.xxx.com.pem;
ssl_certificate_key /root/keys/www.xxx.com.key;
location / {
root /usr/local/www/xxx/;
index index.html;
}
}
#####反向代理服务器配置:#####
server {
listen 80;
server_name localhost;
location / {
root html;
proxy_pass http://www.yyy.com;
index index.html;
}
}
#####http从定向到https配置:#####
server {
listen 80;
server_name www.xxx.com;
return 301 https://www.yyy.comKaTeX parse error: Expected 'EOF', got '}' at position 14: request_uri; }̲ #####https从定向到…request_method = ‘OPTIONS’) {
return 204;
}
}
}
#####负载均衡配置:#####
#nginx负载均衡的三种方式主要是轮询模式、weight权重模式、ip_hash
server {
listen 80;
server_name www.xxx.com;
upstream dynamic_zuoyu {
server localhost:8080; #tomcat 7.0
server localhost:8081; #tomcat 8.0
server localhost:8082; #tomcat 8.5
server localhost:8083; #tomcat 9.0
}
location ~ .*$ {
index index.jsp index.html;
proxy_pass http://dynamic_zuoyu;
}
}
#####集群配置:#####
整体架构是lvs(Linux虚拟服务器2台ip路由)+keepalived(高可用处理服务器2台主备模式防灾管理)+nginx(N台代理分流)+tomcat(N台真正的应用服务器)
CDN
原理:分发内容至最接近用户的节点缓存,用户就近读取内容,解决延迟问题。最简单的CDN网络由一个DNS服务器和几台缓存服务器组成(DNS服务器接到请求后以就近原则返回缓存服务器的ip给用户访问)。当然也可以通过购买大厂的CDN服务,这些服务有很多计费方式,一般分为:流量计费和峰值计费,配置也比较简单,性能肯定比自已搭建的CDN好很多。
集群与分布
集群:是多台服务器的位置,层次的关系
分布:是一个抽象的概念,分解工作(多人做同一样的事),分解职能(多人做不同的事)
常见的服务器架构模式
中心化模式:常见的主从服务器,还有其它中央管理式服务器,优点流量少,缺点性能有瓶颈(因为读虽然能做到多台分读,但是写操作只在一台主服务器上)
分布式模式:常见的cluster服务器,还有其它分流式的服务器,优点性能非常好(因为无中心式高并发读写操作,各个节点相互同步信息),缺点流量多