天天看點

LAMP架構更新版--LNMMP

簡介

LNMMP=Linux+Nginx+MySQL+Memcache+PHP;

利用Nginx的高性能特點做前端反向代理伺服器,分發使用者請求,并在能夠利用緩存的地方使用Memcache緩存服務,以加速緩存效率,具體架構圖如下;

具體部署

代理層:Nginx

編譯安裝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

<code>yum </code><code>install</code> <code>gcc openssl-devel pcre-devel zlib-devel</code>

<code>groupadd -r nginx</code>

<code>useradd</code> <code>-r -g nginx -M nginx</code>

<code>.</code><code>/configure</code> <code>\</code>

<code>  </code><code>--prefix=</code><code>/usr/local/nginx</code> <code>\</code>

<code>  </code><code>--sbin-path=</code><code>/usr/sbin/nginx</code> <code>\</code>

<code>  </code><code>--conf-path=</code><code>/etc/nginx/nginx</code><code>.conf \</code>

<code>  </code><code>--error-log-path=</code><code>/var/log/nginx/error</code><code>.log \</code>

<code>  </code><code>--http-log-path=</code><code>/var/log/nginx/access</code><code>.log \</code>

<code>  </code><code>--pid-path=</code><code>/var/run/nginx/nginx</code><code>.pid  \</code>

<code>  </code><code>--lock-path=</code><code>/var/lock/nginx</code><code>.lock \</code>

<code>  </code><code>--user=nginx \</code>

<code>  </code><code>--group=nginx \</code>

<code>  </code><code>--with-http_ssl_module \</code>

<code>  </code><code>--with-http_flv_module \</code>

<code>  </code><code>--with-http_stub_status_module \</code>

<code>  </code><code>--with-http_gzip_static_module \</code>

<code>  </code><code>--http-client-body-temp-path=</code><code>/var/tmp/nginx/client/</code> <code>\</code>

<code>  </code><code>--http-proxy-temp-path=</code><code>/var/tmp/nginx/proxy/</code> <code>\</code>

<code>  </code><code>--http-fastcgi-temp-path=</code><code>/var/tmp/nginx/fcgi/</code> <code>\</code>

<code>  </code><code>--http-uwsgi-temp-path=</code><code>/var/tmp/nginx/uwsgi</code> <code>\</code>

<code>  </code><code>--http-scgi-temp-path=</code><code>/var/tmp/nginx/scgi</code> <code>\</code>

<code>  </code><code>--with-pcre</code>

<code>make</code> <code>&amp;&amp; </code><code>make</code> <code>install</code>

<code>vi</code> <code>/etc/init</code><code>.d</code><code>/nginx</code> <code># 編輯服務腳本</code>

<code>#!/bin/sh</code>

<code>#</code>

<code># nginx - this script starts and stops the nginx daemon</code>

<code># chkconfig:   - 85 15</code>

<code># description:  Nginx is an HTTP(S) server, HTTP(S) reverse \</code>

<code>#               proxy and IMAP/POP3 proxy server</code>

<code># processname: nginx</code>

<code># config:      /etc/nginx/nginx.conf</code>

<code># config:      /etc/sysconfig/nginx</code>

<code># pidfile:     /var/run/nginx.pid</code>

<code># Source function library.</code>

<code>. </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code>

<code># Source networking configuration.</code>

<code>. </code><code>/etc/sysconfig/network</code>

<code># Check that networking is up.</code>

<code>[ </code><code>"$NETWORKING"</code> <code>= </code><code>"no"</code> <code>] &amp;&amp; </code><code>exit</code> <code>0</code>

<code>nginx=</code><code>"/usr/sbin/nginx"</code>

<code>prog=$(</code><code>basename</code> <code>$nginx)</code>

<code>NGINX_CONF_FILE=</code><code>"/etc/nginx/nginx.conf"</code>

<code>[ -f </code><code>/etc/sysconfig/nginx</code> <code>] &amp;&amp; . </code><code>/etc/sysconfig/nginx</code>

<code>lockfile=</code><code>/var/lock/subsys/nginx</code>

<code>make_dirs() {</code>

<code>   </code><code># make required directories</code>

<code>   </code><code>user=`nginx -V 2&gt;&amp;1 | </code><code>grep</code> <code>"configure arguments:"</code> <code>| </code><code>sed</code> <code>'s/[^*]*--user=\([^ ]*\).*/\1/g'</code> <code>-`</code>

<code>   </code><code>options=`$nginx -V 2&gt;&amp;1 | </code><code>grep</code> <code>'configure arguments:'</code><code>`</code>

<code>   </code><code>for</code> <code>opt </code><code>in</code> <code>$options; </code><code>do</code>

<code>       </code><code>if</code> <code>[ `</code><code>echo</code> <code>$opt | </code><code>grep</code> <code>'.*-temp-path'</code><code>` ]; </code><code>then</code>

<code>           </code><code>value=`</code><code>echo</code> <code>$opt | </code><code>cut</code> <code>-d </code><code>"="</code> <code>-f 2`</code>

<code>           </code><code>if</code> <code>[ ! -d </code><code>"$value"</code> <code>]; </code><code>then</code>

<code>               </code><code># echo "creating" $value</code>

<code>               </code><code>mkdir</code> <code>-p $value &amp;&amp; </code><code>chown</code> <code>-R $user $value</code>

<code>           </code><code>fi</code>

<code>       </code><code>fi</code>

<code>   </code><code>done</code>

<code>}</code>

<code>start() {</code>

<code>    </code><code>[ -x $nginx ] || </code><code>exit</code> <code>5</code>

<code>    </code><code>[ -f $NGINX_CONF_FILE ] || </code><code>exit</code> <code>6</code>

<code>    </code><code>make_dirs</code>

<code>    </code><code>echo</code> <code>-n $</code><code>"Starting $prog: "</code>

<code>    </code><code>daemon $nginx -c $NGINX_CONF_FILE</code>

<code>    </code><code>retval=$?</code>

<code>    </code><code>echo</code>

<code>    </code><code>[ $retval -</code><code>eq</code> <code>0 ] &amp;&amp; </code><code>touch</code> <code>$lockfile</code>

<code>    </code><code>return</code> <code>$retval</code>

<code>stop() {</code>

<code>    </code><code>echo</code> <code>-n $</code><code>"Stopping $prog: "</code>

<code>    </code><code>killproc $prog -QUIT</code>

<code>    </code><code>[ $retval -</code><code>eq</code> <code>0 ] &amp;&amp; </code><code>rm</code> <code>-f $lockfile</code>

<code>restart() {</code>

<code>    </code><code>configtest || </code><code>return</code> <code>$?</code>

<code>    </code><code>stop</code>

<code>    </code><code>sleep</code> <code>1</code>

<code>    </code><code>start</code>

<code>reload() {</code>

<code>    </code><code>echo</code> <code>-n $</code><code>"Reloading $prog: "</code>

<code>    </code><code>killproc $nginx -HUP</code>

<code>    </code><code>RETVAL=$?</code>

<code>force_reload() {</code>

<code>    </code><code>restart</code>

<code>configtest() {</code>

<code>  </code><code>$nginx -t -c $NGINX_CONF_FILE</code>

<code>rh_status() {</code>

<code>    </code><code>status $prog</code>

<code>rh_status_q() {</code>

<code>    </code><code>rh_status &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>case</code> <code>"$1"</code> <code>in</code>

<code>    </code><code>start)</code>

<code>        </code><code>rh_status_q &amp;&amp; </code><code>exit</code> <code>0</code>

<code>        </code><code>$1</code>

<code>        </code><code>;;</code>

<code>    </code><code>stop)</code>

<code>        </code><code>rh_status_q || </code><code>exit</code> <code>0</code>

<code>    </code><code>restart|configtest)</code>

<code>    </code><code>reload)</code>

<code>        </code><code>rh_status_q || </code><code>exit</code> <code>7</code>

<code>    </code><code>force-reload)</code>

<code>        </code><code>force_reload</code>

<code>    </code><code>status)</code>

<code>        </code><code>rh_status</code>

<code>    </code><code>condrestart|try-restart)</code>

<code>            </code><code>;;</code>

<code>    </code><code>*)</code>

<code>        </code><code>echo</code> <code>$</code><code>"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"</code>

<code>        </code><code>exit</code> <code>2</code>

<code>esac</code>

配置Nginx

<code>upstream memcached {</code>

<code>        </code><code>server    172.16.25.111:11211;</code>

<code>        </code><code>keepalive 1024;</code>

<code>    </code><code>}</code>

<code>    </code><code>upstream webserver {</code>

<code>        </code><code>server    172.16.25.112:80;</code>

<code>        </code><code>server    172.16.25.113:80;</code>

<code>    </code><code>upstream phpserver {</code>

<code>        </code><code>server    172.16.25.112:9000;</code>

<code>        </code><code>server    172.16.25.113:9000;</code>

<code>    </code><code>server {</code>

<code>        </code><code>listen       80;</code>

<code>        </code><code>server_name  xxrenzhe.lnmmp.com;</code>

<code>    </code><code>access_log      </code><code>/var/log/nginx/lnmmp</code><code>.access.log;</code>

<code>    </code><code>error_log       </code><code>/var/log/nginx/lnmmp</code><code>.errors.log notice;</code>

<code>    </code><code>root              </code><code>/www/lnmmp</code><code>.com;</code>

<code>    </code><code>index       index.php index.html;</code>

<code>    </code><code>location / {</code>

<code>        </code><code>set</code> <code>$memcached_key $request_uri;</code>

<code>        </code><code>add_header X-mem-key $memcached_key;</code>

<code>        </code><code>memcached_pass memcached;</code>

<code>        </code><code>default_type </code><code>test</code><code>/html</code><code>;</code>

<code>        </code><code>error_page 404 500 502 504 = @webnocache;</code>

<code>    </code><code>location @webnocache {</code>

<code>        </code><code>rewrite ^(\/)?$ </code><code>/index</code><code>.php last; </code><code># 配置直接通路域名或IP位址時,重定向至index.php檔案</code>

<code>        </code><code>rewrite ^/.*$ </code><code>/set_mem</code><code>.php?$request_uri last; </code><code># 将靜态通路重定向至後端set_mem.php,以實作set memcache的功能</code>

<code>        </code><code>proxy_pass http:</code><code>//webserver</code><code>;</code>

<code>    </code><code>location ~* \.php(\?.*)?$ {</code>

<code>        </code><code>fastcgi_pass phpserver;</code>

<code>        </code><code>fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;</code>

<code>        </code><code>include fastcgi_params;</code>

啟動服務

<code>chmod</code> <code>+x </code><code>/etc/init</code><code>.d</code><code>/nginx</code>

<code>chkconfig --add nginx</code>

<code>chkconfig nginx on</code>

<code>service nginx start</code>

緩存層:Memcache+NFS

安裝配置memcache

<code># 安裝libevent</code>

<code>tar</code> <code>xf libevent-2.0.21-stable.</code><code>tar</code><code>.gz</code>

<code>cd</code> <code>libevent-2.0.21</code>

<code>.</code><code>/configure</code> <code>--prefix=</code><code>/usr/local/libevent</code>

<code>echo</code> <code>"/usr/local/libevent/lib"</code> <code>&gt; </code><code>/etc/ld</code><code>.so.conf.d</code><code>/libevent</code><code>.conf</code>

<code>ldconfig</code>

<code># 安裝memcache</code>

<code>tar</code> <code>xf memcached-1.4.15.</code><code>tar</code><code>.gz</code>

<code>cd</code> <code>memcached-1.4.15</code>

<code>.</code><code>/configure</code> <code>--prefix=</code><code>/usr/local/memcached</code> <code>--with-libevent=</code><code>/usr/local/libevent</code>

<code># 編輯服務腳本 # 一次啟動了2個memcache執行個體,一個用于Nginx,一個用于後端PHP服務</code>

<code>vi</code> <code>/etc/init</code><code>.d</code><code>/memcached</code>

<code>#!/bin/bash</code>

<code># Init file for memcached</code>

<code># chkconfig: - 86 14</code>

<code># description: Distributed memory caching daemon</code>

<code># processname: memcached</code>

<code># config: /etc/sysconfig/memcached</code>

<code>## Default variables</code>

<code>PORT1=</code><code>"11211"</code>

<code>PORT2=</code><code>"11311"</code>

<code>USER=</code><code>"nobody"</code>

<code>MAXCONN=</code><code>"1024"</code>

<code>CACHESIZE=</code><code>"64"</code>

<code>OPTIONS=</code><code>""</code>

<code>RETVAL=0</code>

<code>prog=</code><code>"/usr/local/memcached/bin/memcached"</code>

<code>desc=</code><code>"Distributed memory caching"</code>

<code>lockfile1=</code><code>"/var/lock/subsys/memcached_$PORT1"</code>

<code>lockfile2=</code><code>"/var/lock/subsys/memcached_$PORT2"</code>

<code>        </code><code>echo</code> <code>-n $</code><code>"Starting $desc (memcached): "</code>

<code>        </code><code>daemon $prog -d -p $PORT1 -u $USER -c $MAXCONN -m $CACHESIZE -o </code><code>"$OPTIONS"</code>

<code>daemon $prog -d -p $PORT2 -u $USER -c $MAXCONN -m $CACHESIZE -o </code><code>"$OPTIONS"</code>

<code>        </code><code>RETVAL=$?</code>

<code>        </code><code>[ $RETVAL -</code><code>eq</code> <code>0 ] &amp;&amp; success &amp;&amp; </code><code>touch</code> <code>$lockfile1 &amp;&amp; </code><code>touch</code> <code>$lockfile2 || failure</code>

<code>        </code><code>echo</code>

<code>        </code><code>return</code> <code>$RETVAL</code>

<code>        </code><code>echo</code> <code>-n $</code><code>"Shutting down $desc (memcached): "</code>

<code>        </code><code>killproc $prog</code>

<code>        </code><code>[ $RETVAL -</code><code>eq</code> <code>0 ] &amp;&amp; success &amp;&amp; </code><code>rm</code> <code>-f $lockfile1 &amp;&amp; </code><code>rm</code> <code>-f $lockfile2 | failure</code>

<code>        </code><code>stop</code>

<code>        </code><code>start</code>

<code>        </code><code>echo</code> <code>-n $</code><code>"Reloading $desc ($prog): "</code>

<code>        </code><code>killproc $prog -HUP</code>

<code>        </code><code>[ $RETVAL -</code><code>eq</code> <code>0 ] &amp;&amp; success || failure</code>

<code>  </code><code>start)</code>

<code>  </code><code>stop)</code>

<code>  </code><code>restart)</code>

<code>        </code><code>restart</code>

<code>  </code><code>condrestart)</code>

<code>        </code><code>[ -e $lockfile1 ] &amp;&amp; [ -e $lockfile1 ] &amp;&amp; restart</code>

<code>  </code><code>reload)</code>

<code>        </code><code>reload</code>

<code>  </code><code>status)</code>

<code>        </code><code>status $prog</code>

<code>   </code><code>*)</code>

<code>        </code><code>echo</code> <code>$</code><code>"Usage: $0 {start|stop|restart|condrestart|status}"</code>

<code>        </code><code>RETVAL=1</code>

<code>exit</code> <code>$RETVAL</code>

啟動memcache服務

<code>chmod</code> <code>+x </code><code>/etc/init</code><code>.d</code><code>/memcached</code>

<code>chkconfig --add memcached</code>

<code>chkconfig memcached on</code>

<code>service memcached start</code>

安裝配置NFS

<code>yum -y </code><code>install</code> <code>nfs-utils</code>

<code>vi</code> <code>/etc/exports</code>

<code>/www/lnmmp</code><code>.com 172.16.0.0</code><code>/16</code><code>(rw,no_root_squash)</code>

<code>exportfs -ar </code><code># 導出NFS共享目錄</code>

<code>cd</code> <code>/www/lnmmp</code><code>.com</code>

<code>unzip phpwind_v9.0_utf8.zip</code>

<code>mv</code> <code>phpwind_v9.0_utf8</code><code>/upload/</code><code>* .</code>

<code>chmod</code> <code>-R 777 attachment conf data html res src themes windid</code>

Web層:Apache

配置PHP支援memcache

<code>tar</code> <code>xf memcache-2.2.5.tgz</code>

<code>cd</code> <code>memcache-2.2.5</code>

<code>/usr/local/php/bin/phpize</code>

<code>.</code><code>/configure</code> <code>--with-php-config=</code><code>/usr/local/php/bin/php-config</code> <code>--</code><code>enable</code><code>-memcache</code>

<code># 上述安裝完後會有類似這樣的提示:</code>

<code>Installing shared extensions:     </code><code>/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/</code>

<code>vi</code> <code>/usr/local/php/lib/php</code><code>.ini </code><code># 配置memcache子產品位置及php會話儲存至memcache中</code>

<code>extension=</code><code>/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/memcache</code><code>.so</code>

<code>session.save_handler = memcache</code>

<code>session.save_path = </code><code>"tcp://172.16.25.111:11311"</code>

<code># 自定義set memcache的程式</code>

<code>vi</code> <code>/www/lnmmp</code><code>.com</code><code>/set_mem</code><code>.php</code>

<code>&lt;?php</code>

<code>    </code><code>$fn = </code><code>dirname</code><code>(__FILE__).$_SERVER[</code><code>'QUERY_STRING'</code><code>];</code>

<code>    </code><code>if</code> <code>(file_exists($fn)) {</code>

<code>        </code><code>$data = file_get_contents($fn);</code>

<code>        </code><code>$mem = new Memcache();</code>

<code>        </code><code>$mem-&gt;connect(</code><code>"172.16.25.111"</code><code>,11311) or die(</code><code>"Could not connect"</code><code>);</code>

<code>        </code><code>$mem-&gt;</code><code>set</code><code>($_SERVER[</code><code>'QUERY_STRING'</code><code>],$data,0,600) or die(</code><code>"Failed to save data at the memcached server"</code><code>);</code>

<code>        </code><code>header(</code><code>'Content-Length: '</code><code>.filesize($fn).</code><code>"\r\n"</code><code>);</code>

<code>        </code><code>header(</code><code>'Content-Type: text/html'</code><code>.</code><code>"\r\n"</code><code>);</code>

<code>        </code><code>header(</code><code>'X-cache: MISS'</code><code>.</code><code>"\r\n"</code><code>);</code>

<code>        </code><code>print </code><code>"$data"</code><code>;</code>

<code>    </code><code>} </code><code>else</code> <code>{</code>

<code>        </code><code>header(</code><code>'Location: http://xxrenzhe.lnmmp.com'</code><code>.</code><code>"\r\n"</code><code>);</code>

<code>        </code><code>header(</code><code>'X-cache: '</code><code>.$fn.</code><code>"\r\n"</code><code>);</code>

<code>?&gt;</code>

Apache配置

<code>vi</code> <code>/etc/httpd/httpd</code><code>.conf</code>

<code># DocumentRoot "/usr/local/apache/htdocs" # 注釋掉此行</code>

<code>Include </code><code>/etc/httpd/extra/httpd-vhosts</code><code>.conf </code><code># 取消此行注釋</code>

<code>vi</code> <code>/etc/httpd/extra/httpd-vhosts</code><code>.conf</code>

<code>&lt;VirtualHost *:80&gt;</code>

<code>    </code><code>DocumentRoot </code><code>"/www/lnmmp.com"</code>

<code>    </code><code>ServerName xxrenzhe.lnmmp.com</code>

<code>    </code><code>ErrorLog </code><code>"logs/lnmmp.com-error_log"</code>

<code>    </code><code>CustomLog </code><code>"logs/lnmmp.com-access_log"</code><code>common</code>

<code>    </code><code>&lt;Directory </code><code>"/www/lnmmp.com"</code><code>&gt;</code>

<code>        </code><code>Options Indexes FollowSymLinks</code>

<code>        </code><code>AllowOverride None</code>

<code>        </code><code>Require all granted</code>

<code>    </code><code>&lt;</code><code>/Directory</code><code>&gt;</code>

<code>&lt;</code><code>/VirtualHost</code><code>&gt;</code>

NFS目錄挂載

<code>mount</code> <code>-t nfs 172.16.25.111:</code><code>/www/lnmmp</code><code>.com </code><code>/www/lnmmp</code><code>.com</code>

服務啟動

<code>service httpd start</code>

<code>service php-fpm start</code>

資料庫層:Ameoba+MariaDB

測試驗證

Nginx利用memcache緩存小靜态檔案測試效果

<a href="http://s3.51cto.com/wyfs02/M02/25/70/wKioL1NfqcjQB2MUAAltUsxZWDs411.jpg" target="_blank"></a>

Nginx利用memcache緩存大靜态檔案測試效果

<a href="http://s3.51cto.com/wyfs02/M01/25/6F/wKiom1NfqhfQlrdbAAnjcLU_Wzo533.jpg" target="_blank"></a>

PHP利用memcache儲存session資料測試效果

<a href="http://s3.51cto.com/wyfs02/M01/25/70/wKioL1NfqhOjiODOAAm4zcc6NeM213.jpg" target="_blank"></a>

本文轉自 xxrenzhe11 51CTO部落格,原文連結:http://blog.51cto.com/xxrenzhe/1403784,如需轉載請自行聯系原作者