Nginx反向代理 实现Web负载均衡

释放双眼,带上耳机,听听看~!

Nginx反向代理 实现Web负载均衡

实现负载均衡的方式有很多种,DNS、反向代理、LVS负载均衡器(软件实现)、F5(负载均衡器,硬件,非常昂贵)这里我们只提到基于DNS,以及反向代理的方式来实现负载均衡Web服务

**      DNS服务器实现负载均衡的原理是基于轮询的方式实现的,直接由
DNS
解析系统进行随机分配。除了性能分配不均之外,还有更可怕的就是如果一台服务器
down
了,
DNS
服务器因为是基于轮询方式的负载均的,所以它并不能够探测到或者没有对付这种情况的动作,所以会继续向这台服务器分配流量,导致访问超时,给用户带来不便。并且基于DNS服务实现负载均衡web集群,需要3个公网IP,代价可想而知。现在IPv4的资源及其紧张,铺张浪费不是一个好的运维工程师,你懂得.
**

**      如果说使用
nginx
实现负载均衡的话**

如图所示:内网有三台
web server
(两台Apache,一台Nginx),管理员可以根据服务器的性能,设置
权重
,来分配服务器的使用几率
。如果某台服务器反回超时或者挂掉了,Nginx反向代理会基于max_fails这样的机制,使其不再把用户分配到那台服务器,这样比
DNS
服务器直接进行随机分配好的多。可靠性和利用率大大提高。你懂得.

**     并且基于nginx反向代理:只要有一个
IP
地址来绑定就可以实现
nginx
负载均衡,大大节省购买
IP
地址时的代价。当用户访问公司域名时,请求直接被发送到
Nginx Server
上,
Nginx Server
根据
weight
值和
fail_timeout
来进行合理分配服务器资源。注释:
**

更加人性化。
反向代理还经常被称为网关服务器,因为它能够防止了
公司内网Web server
直接暴露在外网的环境下,在一定程度上保证了
web server
的安全。

**    NFS 全称:Network file system NFS由SUN公司开发,目前已经成为文件服务的一种标准。我们在这里,通过NFS实现存储.**

**    NFS 跟PHP-FPM服务器为同一台都为(172.16.251.215)
**

**一、配置Nginx反向代理
**

1、创建用户和组

2、编译安装Nginx


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1# groupadd nginx
2# useradd -g nginx -s /bin/false -M nginx
3./configure \
4  --prefix=/usr \
5  --sbin-path=/usr/sbin/nginx \
6  --conf-path=/etc/nginx/nginx.conf \
7  --error-log-path=/var/log/nginx/error.log \
8  --http-log-path=/var/log/nginx/access.log \
9  --pid-path=/var/run/nginx/nginx.pid  \
10  --lock-path=/var/lock/nginx.lock \
11  --user=nginx \
12  --group=nginx \
13  --with-http_ssl_module \
14  --with-http_flv_module \
15  --with-http_stub_status_module \
16  --with-http_gzip_static_module \
17  --http-client-body-temp-path=/var/tmp/nginx/client/ \
18  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
19  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
20  --with-pcre
21make && make install
22

3、提供Nginx服务脚本


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
11 #!/bin/sh
2  2 #
3  3 # nginx - this script starts and stops the nginx daemon
4  4 #
5  5 # chkconfig:   - 85 15
6  6 # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
7  7 #               proxy and IMAP/POP3 proxy server
8  8 # processname: nginx
9  9 # config:      /etc/nginx/nginx.conf
10 10 # config:      /etc/sysconfig/nginx
11 11 # pidfile:     /var/run/nginx.pid
12 12  
13 13 # Source function library.
14 14 . /etc/rc.d/init.d/functions
15 15  
16 16 # Source networking configuration.
17 17 . /etc/sysconfig/network
18 18  
19 19 # Check that networking is up.
20 20 [ "$NETWORKING" = "no" ] && exit 0
21 21  
22 22 nginx="/usr/sbin/nginx"
23 23 prog=$(basename $nginx)
24 24  
25 25 NGINX_CONF_FILE="/etc/nginx/nginx.conf"
26 26  
27 27 [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
28 28  
29 29 lockfile=/var/lock/subsys/nginx
30 30  
31 31 make_dirs() {
32 32    # make required directories
33 33    user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
34 34    options=`$nginx -V 2>&1 | grep 'configure arguments:'`
35 35    for opt in $options; do
36 36        if [ `echo $opt | grep '.*-temp-path'` ]; then
37 37            value=`echo $opt | cut -d "=" -f 2`
38 38            if [ ! -d "$value" ]; then
39 39                # echo "creating" $value
40 40                mkdir -p $value && chown -R $user $value
41 41            fi
42 42        fi
43 43    done
44 44 }
45 45  
46 46 start() {
47 47     [ -x $nginx ] || exit 5
48 48     [ -f $NGINX_CONF_FILE ] || exit 6
49 49     make_dirs
50 50     echo -n $"Starting $prog: "
51 51     daemon $nginx -c $NGINX_CONF_FILE
52 52     retval=$?
53 53     echo
54 54     [ $retval -eq 0 ] && touch $lockfile
55 55     return $retval
56 56 }
57 57  
58 58 stop() {
59 59     echo -n $"Stopping $prog: "
60 60     killproc $prog -QUIT
61 61     retval=$?
62 62     echo
63 63     [ $retval -eq 0 ] && rm -f $lockfile
64 64     return $retval
65 65 }
66 66  
67 67 restart() {
68 68     configtest || return $?
69 69     stop
70 70     sleep 1
71 71     start
72 72 }
73 73  
74 74 reload() {
75 75     configtest || return $?
76 76     echo -n $"Reloading $prog: "
77 77     killproc $nginx -HUP
78 78     RETVAL=$?
79 79     echo
80 80 }
81 81  
82 82 force_reload() {
83 83     restart
84 84 }
85 85  
86 86 configtest() {
87 87   $nginx -t -c $NGINX_CONF_FILE
88 88 }
89 89  
90 90 rh_status() {
91 91     status $prog
92 92 }
93 93  
94 94 rh_status_q() {
95 95     rh_status >/dev/null 2>&1
96 96 }
97 97  
98 98 case "$1" in
99 99     start)
100100         rh_status_q && exit 0
101101         $1
102102         ;;
103103     stop)
104104         rh_status_q || exit 0
105105         $1
106106         ;;
107107     restart|configtest)
108108         $1
109109         ;;
110110     reload)
111111         rh_status_q || exit 7
112112         $1
113113         ;;
114114     force-reload)
115115         force_reload
116116         ;;
117117     status)
118118         rh_status
119119         ;;
120120     condrestart|try-restart)
121121         rh_status_q || exit 0
122122             ;;
123123     *)
124124         echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
125125         exit 2
126126 esac
127

4、配置Nginx实现反向代理


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
1#使用的用户和组
2#user  nobody;
3#指定工作衍生进程数(一般等于CPU的总核数或者总和数)
4worker_processes  1;
5
6#指定错误日志存放的路径,错误日志记录级别可选项[debug|info|notice|warn|error|crit]
7#error_log  logs/error.log;
8#error_log  logs/error.log  notice;
9#error_log  logs/error.log  info;
10
11#指定pid存放的路径
12#pid        logs/nginx.pid;
13
14events {
15#默认使用的网络I/O模型,Linux系统推荐采用epoll模型,FreeBSD推荐采用kqueue模型
16#use epoll;
17    worker_connections  1024;  #允许的连接数
18
19}
20
21
22http {
23    include       mime.types;
24    default_type  application/octet-stream;
25    #设置使用的字符集,如果一个网站多种字符集,请不要随便设置。
26     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
27                      '$status $body_bytes_sent "$http_referer" '
28                      '"$http_user_agent" "$http_x_forwarded_for"';
29#通过$remote_addr:可以获取Nginx反向代理服务器的IP地址
30#X-Forwarded-For:用以记录原有的客户端ip和原来客户端请求的服务器地址.
31#$remote_user:用于记录远程客户端用户名称
32#$time_local:用于记录访问时间与时区
33#$request:用于记录请求URL与http协议
34#$status:用于记录请求状态,列如成功状态为200,,页面找不到时状态404
35#$body_bytes_sent:用于记录发送客户端的文件主体内容的大小;
36#$http_referer:用于记录是从哪个页面链接访问过来的;
37#$http_usr_agent:用于记录客户端浏览器的相关信息.
38#采用日志格式combined记录的日志的格式是非常广泛和流行的
39access_log path [format [buffer=size | off]]
40    access_log  logs/access.log  main;
41    sendfile        on;
42    #tcp_nopush     on;                                                                            
43    #keepalive_timeout  0;
44    keepalive_timeout  65;
45    #gzip  on;
46    #proxy_cache_path /nginx/cache levels=1:2 keys_zone=mycache:16m
47#           inactive=24h max_size=1g;
48    upstream backend
49    server 172.16.251.253  weight=1 max_fails=2  fail_timeout=30s;
50    server 172.16.251.244  weight=1 max_fails=2  fail_timeout=30s;
51    server 172.16.251.208  weight=1 max_fails=2  fail_timeout=30s;
52}
53#upstream:该指令用于设置可以再proxy_pass和fastcgi_pass指令中使用的代理服务器
54#weight:设置服务器的权重,权重数值越高,被分配到的客户端请求数越多.默认为1
55#max_fails:指定的时间内对后端服务器请求失败的次数,如果检测到后端服务器无法连接及发生服务器错误(404错误除外),则标记为失败.默认为1,设为数值0将关闭这项检测
56#fail_timeout:在经历参数max_fails设置的失败次数后,暂停的时间.
57#down:标记服务器为永久离线状态,用于ip_hash指令
58#backup:仅仅非在backup服务器全部繁忙的时候才会启用.
59    server {
60        listen       80;
61    server_name www.nginx.com  220.2.2.2;
62#server_name 绑定域名,以及IP地址
63    location /  {
64    proxy_pass http://backend;
65    proxy_set_header host www.nginx.com;
66    #proxy_cache mycache;
67    #proxy_cache_valid 200 301 1d;
68    #proxy_cache_valid 404 1m;
69}
70#proxy_pass:指定后端被代理的服务器
71#proxy_connect_timeout:跟后端服务器连接的超时时间_发起握手等候响应超时时间
72#proxy_read_timeout:连接成功后_等待后端服务器响应时间_其实已经进入后端的排队之中等候处理。
73#proxy_send_timeout:后端服务器数据回传时间_就是规定时间内后端服务器必须传完所有的数据
74#proxy_buffer_size:代理请求缓存_这个缓存区间会保存用户的头部信息以供Nginx进行规则处理_一般只能保存下头信息即可
75#proxy_buffers:同上 告诉nginx保存单个用的几个buffer最大可用空间
76#proxy_busy_buffers_size:如果系统很忙的时候可以申请更大的Proxy_buffers
77#proxy_temp_file_write_size:缓存临时文件的大小;
78#        location / {
79#            root   html;
80#            index   index.php index.html index.htm;
81#        }
82        error_page  404              /404.html;
83        # redirect server error pages to the static page /50x.html
84        #
85        error_page   500 502 503 504  /50x.html;
86        location = /50x.html {
87            root   html;
88        }
89        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
90        #
91        #location ~ \.php$ {
92        #    proxy_pass   http://127.0.0.1;
93        #}
94        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
95        #
96        #location ~ \.php$ {
97        #    root           html;
98        #    fastcgi_pass   172.16.251.215:9000;
99        #    fastcgi_index  index.php;
100        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
101        #    include        fastcgi_params;
102        #}
103        # deny access to .htaccess files, if Apache's document root
104        # concurs with nginx's one
105        #
106        #location ~ /\.ht {
107        #    deny  all;
108        #}
109    }
110    # another virtual host using mix of IP-, name-, and port-based configuration
111    #
112    #server {
113    #    listen       8000;
114    #    listen       somename:8080;
115    #    server_name  somename  alias  another.alias;
116    #    location / {
117    #        root   html;
118    #        index  index.html index.htm;
119    #    }
120    #}
121    # HTTPS server
122    #
123    #server {
124    #    listen       443;
125    #    server_name  localhost;
126    #    ssl                  on;
127    #    ssl_certificate      cert.pem;
128    #    ssl_certificate_key  cert.key;
129    #    ssl_session_timeout  5m;
130    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
131    #    ssl_ciphers  HIGH:!aNULL:!MD5;
132    #    ssl_prefer_server_ciphers   on;
133    #    location / {
134    #        root   html;
135    #        index  index.html index.htm;
136    #    }
137    #}
138}    
139

**二、安装web服务,编译安装Httpd     Web Server:172.16.251.208                   
**

** Web Server: 172.16.251.244
**

**1、编译安装http2.4.9,依赖于更高版本的apr和apr-util。apr全称为apache portable runtime **


1
2
3
4
5
1#tar xf apr-1.5.0.tar.bz2
2#cd apr-1.5.0
3#./configure --prefix=/usr/local/apr
4#make && make install
5

**2、编译安装
apr-util-1.5.2 **


1
2
3
4
5
1#tar xf apr-util-1.5.2.tar.bz2
2#cd apr-util-1.5.2
3#./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
4#make && make install
5

3、编译安装http2.4.9


1
2
3
4
5
11 # tar xf httpd-2.4.9.tar.bz2
22 # cd httpd-2.4.9
33 # ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=event
44 # make && make install
5

4、后续的配置:


1
2
3
4
5
6
11 #ln -sv /usr/local/apache/include/usr/include/httpd
22 #vim /etc/profile.d/httpd.sh
33 exportPATH=/usr/local/apache/bin:$PATH
44 #vim /etc/man.conf
55 #MANPATH  /usr/local/apache/man
6

5、修改httpd的主配置文件,设置其Pid文件的路径 vim /etc/httpd24/httpd.conf


1
2
1PidFile  "/var/run/httpd.pid"
2

6、补充:
(1)构建MPM为静态模块
在全部平台中,MPM都可以构建为静态模块。在构建时选择一种MPM,链接到服务器中。如果要改变MPM,必须重新构建。为了使用指定的MPM,请在执行configure脚本 时,使用参数 –with-mpm=NAME。NAME是指定的MPM名称。编译完成后,可以使用 ./httpd -l 来确定选择的MPM。 此命令会列出编译到服务器程序中的所有模块,包括 MPM。
(2)构建 MPM 为动态模块
在Unix或类似平台中,MPM可以构建为动态模块,与其它动态模块一样在运行时加载。 构建 MPM 为动态模块允许通过修改LoadModule指令内容来改变MPM,而不用重新构建服务器程序。在执行configure脚本时,使用–enable-mpms-shared选项即可启用此特性。当给出的参数为all时,所有此平台支持的MPM模块都会被安装。还可以在参数中给出模块列表。默认MPM,可以自动选择或者在执行configure脚本时通过–with-mpm选项来指定,然后出现在生成的服务器配置文件中。编辑LoadModule指令内容可以选择不同的MPM。

7、提供SysV服务脚本/etc/rc.d/init.d/httpd,内容如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
11 #!/bin/bash
2 2 #
3 3 # httpd        Startup script for the Apache HTTP Server
4 4 #
5 5 # chkconfig: - 85 15
6 6 # description: Apache is a World Wide Web server.  It is used to serve \
7 7 #        HTML files and CGI.
8 8 # processname: httpd
9 9 # config: /etc/httpd/conf/httpd.conf
1010 # config: /etc/sysconfig/httpd
1111 # pidfile: /var/run/httpd.pid
1212 # Source function library.
1313 . /etc/rc.d/init.d/functions
1414 if [ -f /etc/sysconfig/httpd ]; then
1515         . /etc/sysconfig/httpd
1616 fi
1717 # Start httpd in the C locale by default.
1818 HTTPD_LANG=${HTTPD_LANG-"C"}
1919 # This will prevent initlog from swallowing up a pass-phrase prompt if
2020 # mod_ssl needs a pass-phrase from the user.
2121 INITLOG_ARGS=""
2222 # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
2323 # with the thread-based "worker" MPM; BE WARNED that some modules may not
2424 # work correctly with a thread-based MPM; notably PHP will refuse to start.
2525 # Path to the apachectl script, server binary, and short-form for messages.
2626 apachectl=/usr/local/apache/bin/apachectl
2727 httpd=${HTTPD-/usr/local/apache/bin/httpd}
2828 prog=httpd
2929 pidfile=${PIDFILE-/var/run/httpd.pid}
3030 lockfile=${LOCKFILE-/var/lock/subsys/httpd}
3131 RETVAL=0
3232 start() {
3333         echo -n $"Starting $prog: "
3434         LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
3535         RETVAL=$?
3636         echo
3737         [ $RETVAL = 0 ] && touch ${lockfile}
3838         return $RETVAL
3939 }
4040 stop() {
4141   echo -n $"Stopping $prog: "
4242   killproc -p ${pidfile} -d 10 $httpd
4343   RETVAL=$?
4444   echo
4545   [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
4646 }
4747 reload() {
4848     echo -n $"Reloading $prog: "
4949     if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
5050         RETVAL=$?
5151         echo $"not reloading due to configuration syntax error"
5252         failure $"not reloading $httpd due to configuration syntax error"
5353     else
5454         killproc -p ${pidfile} $httpd -HUP
5555         RETVAL=$?
5656     fi
5757     echo
5858 }
5959 # See how we were called.
6060 case "$1" in
6161   start)
6262   start
6363   ;;
6464   stop)
6565   stop
6666   ;;
6767   status)
6868         status -p ${pidfile} $httpd
6969   RETVAL=$?
7070   ;;
7171   restart)
7272   stop
7373   start
7474   ;;
7575   condrestart)
7676   if [ -f ${pidfile} ] ; then
7777     stop
7878     start
7979   fi
8080   ;;
8181   reload)
8282         reload
8383   ;;
8484   graceful|help|configtest|fullstatus)
8585   $apachectl $@
8686   RETVAL=$?
8787   ;;
8888   *)
8989   echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
9090   exit 1
9191 esac
9292 exit $RETVAL
93

8、而后为此脚本赋予执行权限:并且加入服务列表:


1
2
3
11 # chmod +x /etc/rc.d/init.d/httpd
22 # chkconfig --add httpd
3

9、配置Apache能够调用后端的PHP-FPM服务器(fastCIG服务器),因为默认编译安装的Httpd有许多模块都是被注释掉的,要启用之,去掉注释即可:并且在这里Apache是作为反向代理服务,代理PHP-FPM(fastCGI)服务器工作之.所以在这里需要启动代理模块


1
2
3
4
5
6
11 LoadModule proxy_module modules/mod_proxy.so
22 #LoadModule proxy_connect_module modules/mod_proxy_connect.so
33 #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
44 #LoadModule proxy_http_module modules/mod_proxy_http.so
55 LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
6

10、根据标准配置我们还应该启用虚拟主机,在Httpd2.4.9中配置文件被拆分了多个子配置文件,在/etc/httpd24/extra/此目录下众多的配置文件都是httpd的,前面说到要想启用虚拟主机也要去掉注释,表示将虚拟主机的配置文件包含之,实现的方法都是如此


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
11 460 # User home directories
2 2 461 #Include /etc/httpd24/extra/httpd-userdir.conf
3 3 462
4 4 463 # Real-time info on requests and configuration
5 5 464 #Include /etc/httpd24/extra/httpd-info.conf
6 6 465
7 7 466 # Virtual hosts
8 8 467 Include /etc/httpd24/extra/httpd-vhosts.conf
9 9 468
1010 469 # Local access to the Apache HTTP Server Manual
1111 470 #Include /etc/httpd24/extra/httpd-manual.conf
1212 471
1313 472 # Distributed authoring and versioning (WebDAV)
1414 473 #Include /etc/httpd24/extra/httpd-dav.conf
1515 474
1616 475 # Various default settings
1717 476 #Include /etc/httpd24/extra/httpd-default.conf
1818 477
19

11、配置虚拟主机,在httpd2.4.9中虚拟主机需要配置控制才能够访问,默认是拒绝访问的.DocumentRoot:定义虚拟主机网站的根目录(这里的根目录是NFS通过网络共享存储)我们将其挂载到本地,以及后端PHP Server的ip地址,Apache现在的角色是反向代理PHP-FPM应用成服务器


1
2
1# vim /etc/httpd24/extra/httpd-vhosts.conf
2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
11 ​# The first VirtualHost section is used for all requests that do not
2 2 # match a ServerName or ServerAlias in any <VirtualHost> block.
3 3 #
4 4 <VirtualHost *:80>
5 5     ServerAdmin Admin@aaa.com
6 6     DocumentRoot "/usr/html/"
7 7     ServerName www.aaa.com
8 8     Errorlog "logs/access.log"
9 9     CustomLog "logs/error.log" combined
1010   <Directory  "/usr/html/">
1111     Options None
1212     Require all granted
1313 </Directory>
1414     ProxyRequests Off
1515    ProxyPassMatch ^/(.*\.php)$  fcgi://172.16.251.215:9000/usr/html/$1
1616 </VirtualHost>
17

这里我们已经将其挂载之(NFS共享存储的文件系统),使用mount命令可查看之;


1
2
3
4
5
11 #mount -t nfs ServerIP:/ShareDirectory  /LocalDirectory
22 #mount -t nfs 172.16.251.215/usr/html   /usr/html
33 #mount
44 #172.16.251.215:/usr/html on /usr/html type nfs (rw,vers=4,addr=172.16.251.215
5

另外一台web服务器配置如上

 

**三、安装mysql DB  MysqlDB Server 172.16.251.243
**

1、准备数据存放的文件系统,新建一个逻 辑卷,并将其挂载至特定目录即可。这里不再给出过程。(实际生产环境下都是如此)这里假设其逻辑卷的挂载目录为/mydata

2、新建用户以安全方式运行进程:


1
2
3
4
1# groupadd -r mysql
2# useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql
3# chown -R mysql:mysql /mydata/data
4

3、安装mysql DB-5.5.33


1
2
3
4
5
11 # tar xf mysql-5.5.33-linux2.6-i686.tar.gz -C /usr/local
22 # cd /usr/local/
33 # ln -sv mysql-5.5.33-linux2.6-i686  mysql
44 # cd mysql
5

1
2
3
4
1# chown -R mysql:mysql  .
2# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
3# chown -R root  .
4

4、为mysql提供主配置文件:


1
2
3
1# cd /usr/local/mysql
2# cp support-files/my-large.cnf  /etc/my.cnf
3

并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行,另外还需要添加如下行指定mysql数据文件的存放位置:


1
2
3
11 #thread_concurrency = 2
22 #datadir = /mydata
3

5、为mysql提供sysv服务脚本:


1
2
3
4
1# cd /usr/local/mysql
2# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld
3# chmod +x /etc/rc.d/init.d/mysqld
4

**6、添加至服务列表: **


1
2
3
1# chkconfig --add mysqld
2# chkconfig mysqld on
3

为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤:
7、输出mysql的man手册至man命令的查找路径: 编辑/etc/man.config,添加如下行即可:


1
2
11 MANPATH  /usr/local/mysql/man
2

8、输出mysql的头文件至系统头文件路径/usr/include:这可以通过简单的创建链接实现


1
2
11 # ln -sv /usr/local/mysql/include  /usr/include/mysql
2

9、修改PATH环境变量,让系统可以直接使用mysql的相关命令。


1
2
3
4
5
11 # vim /etc/profile.d/mysql.sh
22 # export PATH=/usr/local/mysql/bin:$PATH
33 # .  /etc/profile.d/mysql.sh
44 # echo $PATH
5

(PHP-FPM)Application Server IP:172.16.251.215  NFS Server IP:172.16.251.215

四、编译安装php-5.4.26


1
2
3
11 # yum -y groupinstall "Desktop Platform Development"
22 # yum -y install bzip2-devel libmcrypt-devel
3

如果想让编译的php支持mcrypt、mhash扩展和libevent

另外,也可以根据需要安装libevent,系统一般会自带libevent,但版本有些低。因此可以编译安装之

说明:libevent是一个异步事件通知库文件,其API提供了在某文件描述上发生某事件时或其超时时执行回调函数的机制,它主要用来替换事件驱动的网络服务器上的event loop机制。目前来说, libevent支持/dev/poll、kqueue、select、poll、epoll及Solaris的event ports。

1、
libevent


1
2
3
4
5
6
11 # tar zxvf libevent-1.4.14b-stable.tar.gz
22 # cd libevent-1.4.14b-stable
33 # ./configure
44 # make && make install
55 # make verify
6

2、
libiconv


1
2
3
4
5
11 # tar zxvf libiconv-1.13.1.tar.gz
22 # cd libiconv-1.13.1
33 # ./configure
44 # make && make install
5

3、
libmcrypt


1
2
3
4
5
6
7
8
9
11 # tar zxvf libmcrypt-2.5.8.tar.gz
22 # cd libmcrypt-2.5.8
33 # ./configure
44 # make && make install
55 # ldconfig -v
66 # cd libltdl
77 # ./configure --with-gmetad --enable-gexec
88 # make && make install
9

4、
mhash


1
2
3
4
5
6
7
11 # tar jxvf mhash-0.9.9.9.tar.bz2
22 # cd mhash-0.9.9.9
33 # ./configure
44 # make && make install
55 # ln -sv /usr/local/lib/libmcrypt* /usr/lib/
66 # ln -sv /usr/local/lib/libmhash.* /usr/lib/
7

5、编译安装php5.4.26;

 


1
2
3
4
5
6
7
1# tar xf php-5.4.4.tar.bz2
2# cd php-5.4.4
3#  ./configure --prefix=/usr/local/php  --with-openssl --enable-fpm --enable-sockets --enable-sysvshm  --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd   --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-libxml-dir=/usr --enable-xml  --with-mhash --with-mcrypt  --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --with-curl
4# make
5# make test
6# make intall
7

 

 

 

说明:如果前面第1步解决依赖关系时安装mcrypt相关的两个rpm包,此./configure命令还可以带上–with-mcrypt选项以让php支持mycrpt扩展。–with-snmp选项则用于实现php的SNMP扩展,但此功能要求提前安装net-snmp相关软件包

为php提供配置文件:


1
2
11  cp php.ini-production /etc/php.ini
2

为php-fpm提供Sysv init脚本,并将其添加至服务列表:


1
2
3
4
5
11 # cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm
22 # chmod +x /etc/rc.d/init.d/php-fpm
33 # chkconfig --add php-fpm
44 # chkconfig php-fpm on
5

编辑php-fpm的配置文件:


1
2
11 # vim /usr/local/php/etc/php-fpm.conf
2

配置fpm的相关选项为你所需要的值,并启用pid文件(如下最后一行):注释:因为php-fpm默认只监听127.10.0.1:9000上;


1
2
3
4
5
6
7
11 pm.max_children = 150
22 pm.start_servers = 8
33 pm.min_spare_servers = 5
44 pm.max_spare_servers = 10
55 pid = /usr/local/php/var/run/php-fpm.pid
66 listen = 0.0.0.0:9000
7

接下来就可以启动php-fpm了:


1
2
1# service php-fpm start
2

使用如下命令来验正(如果此命令输出有中几个php-fpm进程就说明启动成功了):


1
2
11 # ps aux | grep php-fpm
2

默认情况下,fpm监听在127.0.0.1的9000端口,也可以使用如下命令验正其是否已经监听在相应的套接字。


1
2
3
11 # netstat -tnlp | grep php-fpm
22 tcp        0      0  0.0.0.0:9000              0.0.0.0:*                   LISTEN      689/php-fpm
3

五、NFS服务在Centos或者redhat系列发行版linux中默认已安装过啦!这里我们只要修改配置文件启用之就行啦!


1
2
3
11 # vim /etc/exports
22 #/usr/html          172.16.0.0/16(rw,no_root_squash)
3

 

 

六 、整合nginx和php5 ,因为在公司内部还有一台Nginx的webSercer

1、编辑/etc/nginx/nginx.conf,启用如下选项:


1
2
3
4
5
6
7
8
1location ~ \.php$ {
2root           html;
3fastcgi_pass   127.0.0.1:9000;
4fastcgi_index  index.php;
5fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
6include        fastcgi_params;
7}
8

2、编辑/etc/nginx/fastcgi_params,将其内容更改为如下内容:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
11 fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
2 2 fastcgi_param  SERVER_SOFTWARE    nginx;
3 3 fastcgi_param  QUERY_STRING       $query_string;
4 4 fastcgi_param  REQUEST_METHOD     $request_method;
5 5 fastcgi_param  CONTENT_TYPE       $content_type;
6 6 fastcgi_param  CONTENT_LENGTH     $content_length;
7 7 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
8 8 fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
9 9 fastcgi_param  REQUEST_URI        $request_uri;
1010 fastcgi_param  DOCUMENT_URI       $document_uri;
1111 fastcgi_param  DOCUMENT_ROOT      $document_root;
1212 fastcgi_param  SERVER_PROTOCOL    $server_protocol;
1313 fastcgi_param  REMOTE_ADDR        $remote_addr;
1414 fastcgi_param  REMOTE_PORT        $remote_port;
1515 fastcgi_param  SERVER_ADDR        $server_addr;
1616 fastcgi_param  SERVER_PORT        $server_port;
1717 fastcgi_param  SERVER_NAME        $server_name;
18

并在所支持的主页面格式中添加php格式的主页,类似如下:


1
2
3
4
5
11 location / {
22 root   html;
33 index  index.php index.html index.htm;
44 }
5

而后重新载入nginx的配置文件:


1
2
11 # service nginx reload
2

4、在/usr/html新建index.php的测试页面,测试php是否能正常工作:


1
2
3
4
5
11 # cat > /usr/html/index.php << EOF
22 <?php
33 phpinfo();
44 ?>
5

 

七、安装xcache,为php加速:

1、安装


1
2
3
4
5
6
11 # tar xf xcache-2.0.0.tar.gz
22 # cd xcache-2.0.0
33 # /usr/local/php/bin/phpize
44 # ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
55 # make && make install
6

安装结束时,会出现类似如下行:

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-zts-20100525/

2、编辑php.ini,整合php和xcache:

首先将xcache提供的样例配置导入php.ini


1
2
3
11 # mkdir /etc/php.d
22 # cp xcache.ini /etc/php.d
3

注意:如果php.ini文件中有多条zend_extension指令行,要确保此新增的行排在第一位。

3、重新启动php-fpm


1
2
11 # service php-fpm restart
2

 

 

八、搭建论坛


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
11、安装wordpress
2#Unzip  wordpress-3.0.5-zh_CN.zip
3# mv wordpress /www/htdoc2/mybbs
4# cp wp-config-sample.php wp-config.php
5#chmod  a+x wp-config.php
6# vim wp-config.php
7# mysql -uroot -pzhangxiaocen –hlocalhost
8mysql> create database wpdb
918 define('DB_NAME', 'wpdb');
10                                                                                                                                                                                                                                                                                                                                                                                            
1121 define('DB_USER', 'root');
12                                                                                                                                                                                                                                                                                                                                                                                            
1324 define('DB_PASSWORD', 'zhangxiaocen');
1427 define('DB_HOST', 'localhost');
15                                                                                                                                                                                                                                                                                                                                                                                              
1630 define('DB_CHARSET', 'utf8');
17

1
2
3
4
5
6
7
12、 安装Discuz_X2.5_SC_GBK
2# unzip Discuz_X2.5_SC_GBK.zip
3# mv upload    /www/htdoc3/bbs
4# chown -R daemon:daemon  ./*
5#mysql>create database discuz;
6#grant all on discuz.* to discuz@'172.16.251.243' identified by 'zhangxiaocen';
7

通过网页登上论坛发表帖子,并通过其他web服务器登录,查看帖子!这里就不再演示。负载均衡的话,写上三个不同的网页页面测试之.

 

 

9、基于DNS实现负载均衡

 


1
2
11 # yum -y install bind
2

1
2
3
4
5
6
7
8
9
10
11
12
13
1$TTL  664
2@       IN SOA   DNS.nginx.com.         admin.nginx.com. (
3                                        0       ; serial
4                                        1D      ; refresh
5                                        1H      ; retry
6                                        1W      ; expire
7                                        3H )    ; minimum
8                 IN          NS              DNS.nginx.com.
9DNS           IN          A               172.16.251.198
10www         IN          A               172.16.251.253
11www         IN          A               172.16.251.244
12www         IN          A               172.16.251.208
13

 

转载于:https://www.cnblogs.com/xiaocen/p/3625170.html

给TA打赏
共{{data.count}}人
人已打赏
安全运维

WordPress网站专用docker容器环境带Waf

2020-7-18 20:04:44

安全运维

运维安全-Gitlab管理员权限安全思考

2021-9-19 9:16:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索