商用及企业级服务器搭建之三:Apache与Nginx,CDN,集群与分布

Apache与Nginx

作用:

位于用户请求与系统各功能模块之间,处理用户请求,并起到接连系统各功能模块的作用,有点像迎宾的作用。

原理:

  • Apache:多进程,每个进程派生多个线程执行任务,连接采用select 轮询模型,单个线程能处理多个连接,io访问通过等待,进程与线程间切换会浪费很多时间,稳定性好,但高并发是个问题,异常处理方式直接关掉对应的进程与线程。
  • Nginx:单进程单线程,异步执行任务,连接采用epoll 消息通知模型,io访问通过异步通知,一个进程处理多个连接,不存在进程与线程间切换浪费时间问题从而达到高并发性能,但这也导致稳定性是个问题,异常处理方式直接关掉对应的进程并重新开启新的进程,所以一般是一核一个进程,如果单核可以两个进程。

优缺点:

Apache:
  • 优点:
    比较早,性能稳定,扩展与支持相对多,操作系统支持相对多。
  • 缺点:
    占用内存cup等资源相对大,高并发相对差,对多核支持相对差。
Nginx:
  • 优点:
    比较新,占用内存cup等资源相对少,高并发,对多核支持好。
  • 缺点:
    性能相对不稳定,扩展与支持相对少,操作系统支持相对少。

推荐使用:Nginx

  • 原因:Nginx是Apache的升级版,高并发,占用资源少,服务器成本低。

处理请求的过程:

Apache:
  1. Post-Read-Request 读取请求头阶段:这个时候可以按规则注册一个功能给apache执行,也就是大家说的钩子。
  2. URI Translation 地址本地化阶段:将请求的URL映射到本地文件系统,由mod_alias mod_rewrite等担任。可以插入钩子
  3. Header Parsing 检查请求的头部阶段:由mod_setenvif等担任,可以插入钩子
  4. Access Control 允许访问控制阶段:由mod_authz_host等担任,可以插入钩子
  5. Authentication 认证授权阶段:由mod_authz_host等担任,可以插入钩子
  6. Authorization 执行请求授权阶段 : 由mod_authnz_ldap等担任,可以插入钩子
  7. MIME Type Checking mime 类型检查阶段:检查mime类型并处理 由mod_negotiation和mod_mime等担任,可以插入钩子
  8. FixUp 内容处理阶段:内容在内容生成器之前的处理,由mod_dir等担任,可以插入钩子
  9. Response 返回内容阶段:生成返回客户端的内容 ,由mod_headers等担任,可以插入钩子
  10. Logging 日志记录阶段:在回复已经发送给客户端之后记录事务,由mod_log_referer等担任,可以插入钩子
  11. CleanUp 清理阶段:清理本次请求事务处理完成之后遗留的环境,比如文件、目录的处理或者Socket的关闭等,由mod_cache等担任,可以插入钩子
Nginx:
  1. Nginx本身轻量,做的工作也少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。
  2. Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master父进程和多个子进程(包含多个worker进程,一个Cache manager进程,一个Cache loader进程)。其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求。Cache manager进程缓存管理。Cache loader进程缓存载入
  3. 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.*版本
  1. 下载所需软件包:
    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
  2. 先安装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
  3. 配置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 >:虚拟主机配置标签组 用于设置正向和反向代理服务器
  4. 静态资源服务器配置:(起一个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
  5. 代理服务器配置:(代理以数据流向服务器为目标点来分,流向服务器叫正向代理,流向客户端叫反向代理)
    #####正向代理配置:#####
    < 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.*版本
  1. 下载所需软件包:
    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
  2. 先安装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
  3. 配置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服务器,还有其它分流式的服务器,优点性能非常好(因为无中心式高并发读写操作,各个节点相互同步信息),缺点流量多

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值