Apache

官网是 http://httpd.apache.org ,还可通过 http://www.netdcraft.com 来查看server占有量。

rz 命令可用来上传文件。

安装apache首先得先安装它的依赖包,这些安装包官网上都有下载链接。

  1. apr
  2. apr-util

安装 Apache 得先安装依赖软件包 apr/apr-util,你在安装 apr-util 时要注意 apr 跟 apr-util 是依赖关系,所以需要加上 --with-apr=/usr/local/apr

上面提到的依赖是手动编译安装需要注意的问题,不想这么麻烦也可使用 yum 来解决 apache 依赖包,为了练习安装以下操作还是手动进行。

yum -y install openssl-devel pcre-devel zlib-devel libtool expat expat-devel

安装 apr(Apache Portable Runtime)

tar xvzf apr-1.5.2.tar.gz -C /usr/src

cd /usr/src/apr-1.5.2

./configure --prefix=/usr/local/apr

make

make install

安装apr-util

tar xvzf apr-util-1.5.4.tar.gz -C /usr/src

cd /usr/src/apr-util-1.5.4

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr

make

make install

安装 apache2.4.27

tar xvzf httpd-2.4.27.tar.gz -C /usr/src

cp -rf /usr/src/apr-1.5.2/ /usr/src/httpd-2.4.27/srclib/apr

cp -rf /usr/src/apr-util-1.5.4/ /usr/src/httpd-2.4.27/srclib/apr-util

cd /usr/src/httpd-2.4.27

./configure --prefix=/usr/local/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --enable-deflate --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-included-apr -enable-proxy --enable-proxy-fcgi

make

make install

优化执行路径

ln -s /usr/local/httpd/bin/* /usr/bin/

添加httpd系统服务

[root@www ~]# cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd
[root@www ~]# vi /etc/init.d/httpd

# !/bin/bash
# chkconfig: 35 85 15
# description: Startup script for the Apache HTTP Server
.....


增加到系统服务中
[root@www ~]# chkconfig --add httpd
[root@www ~]# chkconfig --list httpd

配置文件

默认配置文件位于/etc/httpd/conf/httpd.conf

启用 conf.d 下以.conf的文件只需启动下面语句。

IncludeOptional conf.d/*.conf

关键设置

port 80 #默认设为80
DirectoryIndex index.html #默认值是index.html

#来设置访问出错时返回哪些页面。
ErrorDocument 500 "The server made a boo boo."
ErrorDocument 404 /missing.html
ErrorDocument 404 "/cgi-bin/missing_handler.pl"
ErrorDocument 402 http://www.example.com/subscription_info.html

如果需要配置虚拟主机只需删除注释。

# Virtual hosts
#Include conf/extra/httpd-vhosts.conf

接着编辑 conf/extra/httpd-vhosts.conf

<VirtualHost *:80>
    DocumentRoot /var/www/cn #指定网站目录
    ServerName blog.farmsec.cn #设置FQDN
    DirectoryIndex #在这里可以设置默认读取的首页,不设置它也不会默认读取httpd.conf中的设置。
    ErrorLog /var/log/httpd/hosts_error.log #定义错误日志位置
    CustomLog /var/log/httpd/hosts_access.log common #定义访问日志位置    
</VirtualHost>
<Directory '/var/www/cn'>
    AllowOverride None #要不要从.htaccess中读取规则,.htaccess有些危险,一般禁止。
    Require all granted #设置所有人都可以访问cn中内容
    Options FollowSymLinks #配置Apache不显示目录列表,当目录中找不到定义的首页文件index.html就会显示当前网站目录列表。
</Directory>

当配置虚拟主机后,访问一个不存在的 FQDN,Apache 虚拟主机会将第一个虚拟主机配置的内容返回,不会返回默认 DocumentRoot 内容。

Nginx

yum源的方式安装稳定版。

/etc/yum.repos.d/创建nginx.repo内容如下↓

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

直接yum -y install nginx

nginx一些选项

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -T            : test configuration, dump it and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /etc/nginx/)
  -c filename   : set configuration file (default: /etc/nginx/nginx.conf)
  -g directives : set global directives out of configuration file

配置文件

  • nginx.conf #主要配置文件
  • fastcgi #用于连接PHP

nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

Nginx搭建php环境

设置 /etc/php-fpm.conf 配置文件中用户名与 nginx 配置文件一致,避免权限问题。

设置Nginx配置文件将.php后缀的请求转发到 fastcgi。

server {
    listen 80;
    root 站点目录绝对路径;
    index index.php index.html; #配置默认首页
    access_log  logs/host.access.log  main; #配置你站点访问日志,注意更改日志名称。

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

Nginx搭建java环境(未解决)

参考资料:http://tomcat.apache.org/tomcat-8.5-doc/appdev/installation.html

配置反向代理+负载均衡

所有请求都先经过反向代理,再由它将请求转发给内部服务器。

另外负载均衡在Nginx中是软件负载(LVS负载均衡),还有硬件设备支持负载均衡(F5)。

关于硬件/软件负载区别可参考这边文章的介绍:浅谈Nginx负载均衡与F5的区别

http {
    upstream name { #这里的name是可自定义的。
        server domain; #在内网设有dns服务器指向本地域名(我觉得写域名更优雅)。
        server ip_address fail_timeout=10s max_fails=2; #timeout不填这个选项也是10s,fails最多尝试几次,到达限制后就判定这台服务器挂了,下次请求不转给它。    
        server ip_address:port weight=1; #weight是权重,越高拿到的任务越多(称作轮询)
        server ip_address weight=1; #这两个IP多个用户访问到会随机访问到其中一个地址它们页面内容是一致的,至于怎么把内容发布上去,这事儿运维管(代码托管平台)。
        ip_hash; #每个用户访问到一个地址后用hash计算用户ip地址是否一致,一致的话会一直把它交给这个地址进行访问,是为了避免session不存在用户重新认证的问题。
        least_conn; #看那个服务器连接数最少就把请求发送给它。
    }
    server{ #如果有多个server
            listen [ip_address:]80;
            server_name domain; #用户要访问的域名(这个域名是访问反向代理哦),用于匹配http_request中host字段,一直就交给这台server去处理请求,匹配不到就交给第一台server去处理,要是某台server设置default_server字段就交指给写这个字段的server处理。
            access_log  /var/log/nginx/yourdomain_access.log; #设置访问日志路径
            location / {
                proxy_pass http://name; #去调用上面定义的name配置,将请求转发给定义的server。
                proxy_read_timeout 300; #代理服务器300s没读取到内容就关闭连接,默认值60s。
                proxy_connect_timeout 300; #300s内没建立连接就显示超时,官方说一般不会超过75s,默认值60s。
                proxy_redirect     off;
                proxy_set_header   X-Forwarded-Proto $scheme; #这条往下全部是设置HttpRequestHeaders中的字段
                proxy_set_header   Host              $http_host;
                proxy_set_header   Host              $host; #传入一个不存在的headers字段就把值设置成ServerName字段的值(可能是防止攻击)。
                proxy_set_header   X-Real-IP         $remote_addr;
            }
        }
}

配置虚拟主机

server {
    servername hostname.domain;
    access_log  /var/log/nginx/host.access.log  main;
    location / {
        root   站点绝对路径;
        index  index.html index.htm;
    }
}
server {
    servername hostname.domain;
    access_log  /var/log/nginx/host.access.log  main;
    location / {
        root   站点绝对路径;
        index  index.html index.htm;
    }
}

配置高可用反向代理(未解决邮件发送)

keepalived配置文件

vrrp_instance VI_1 { #VI_1名字是可选的
    state MASTER #主力机器设为MASTER,具体谁是master要看它们那个priority值最大。
    interface eth0 #将virtual_ip绑定到本机那张网卡
    virtual_router_id 51 #master和backup需要一致,0-255主要是为了区分几台反代是不是在同一个集群内。
    priority 100 #谁的值越大谁就是master
    advert_int 1 #不填默认0.92秒一次
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.12.100/16 #定义对外提供访问的vip,主从一致,地址要和本地网卡在同一网段。
    }
}

keepalived只会判断本身服务是否挂了,并不关心ngxin或其他Web服务器运行状况。只有主用反代keepalive挂了才会切换到备用反代。
这种情况用脚本检测nginx运行状态stop了就把keepalived也停掉,另几种方法下面贴出。(参考资料贴下面了)。

一、 使用脚本检测

#!/bin/bash
# 简介:如果进程中没有nginx则将keepalived进程停掉
A=`ps -C nginx | wc -l`  ## 查看是否有nginx进程把值赋给变量A
if [ $A -eq 1 ]; then  ## 如果没有进程值是为1(显示标题为1行)
    systemctl stop keepalived  ## 则结束 keepalived 进程
fi

完整示例如下所述

vrrp_script check_nginx {
    ##监控脚本路径
    script "/etc/keepalived/check_nginx_dead.sh" #执行脚本
    interval 1 #每秒检查一次
    weight 2 #权重        
}
vrrp_instance VI_1 {
    ...
    track_script { #把要监控的脚本写在里面,不然报错。
        check_nginx
    }
}

二、 利用killall检测nginx服务状态

这也是最佳方案。

yum -y install psmisc #安装killall

keepalived配置文件中加上

vrrp_script check_nginx {
    script "killall -0 nginx" #返回结果是0就代表nginx存在,不存在就执行降权。
    interval 2 #每2秒允许上面code一次
    weight -5  #将权重降低,备用反代将成为master。
}

vrrp_instance VI_1 {
    ...
    track_script { #这里调用前面脚本
        check_nginx
    }
}

限制并发量

问题:

  1. 反代负载过高怎么让用户传输的数据不受影响
  2. 有人恶意CC,Nginx限制并发访问

https://www.cnblogs.com/dion-90/articles/8570601.html

参考链接

标签: none

讨论讨论讨论!