1. 背景
介紹:
Nginx是一款高性能的HTTP和反向代理伺服器,能夠選擇高效的epoll(linux2.6核心)、kqueue(freebsd)、eventport(solaris10)作為網絡I/O模型,能夠支援高達50000個并發連接配接數的響應,而記憶體、CPU等系統資源消耗卻非常低、運作非常穩定。
選擇的理由:
* 支援高并發連接配接:nginx使用高效的多路複用模型(epoll/linux, kqueue/freebsd, eventport/solaris)
* 記憶體消耗少:在伺服器3W并發連接配接下,開啟10個Nginx程序消耗150MB記憶體(15MB*10)
* 成本低廉:購買F5 BIG-IP、NetScaler等負載均衡交換機需要幾十萬RMB,而開源Nginx替代這些商業裝置。
* 其他理由:網絡配置簡單;支援rewrite重寫規則,能夠根據域名、URL的不同、将HTTP請求分到不同的後端伺服器群組;内置的健康檢查功能;節省帶寬,支援GZIP壓縮,可以添加浏覽器本地緩存的Header頭;支援熱部署,能夠在不間斷服務的情況下、對軟體版本進行更新
應用範圍:
* Web服務: 設定多虛拟主機的服務并配合fast-cgi或tomcat支援動态網頁
Nginx是近年來比較火的一個www服務的軟體,與Apache和lighttpd以及tomcat等功能類似,但是nginx要比前者有着卓越的性能,比如:采用了epoll模型,記憶體消耗小等優點;
* 反向代理, 多虛拟主機的代理:
指以代理伺服器來接受Internet上的連接配接請求,然後将請求轉發給内部網絡上的伺服器,并将從伺服器上得到的結果傳回給Internet上請求連接配接的用戶端;
* 七層的負載均衡: 單多虛拟主機不同伺服器之間的通路;
負載均衡是由多台伺服器以對稱的方式組成一個伺服器集合,每台都是等價地位,通過某種負載分擔技術,将外部發送來的請求均勻配置設定到對稱結構中某一台伺服器上,來接收到請求的伺服器獨立地回應客戶的請求;
* 正向代理: 代理上網
代理内部網絡對Internet的連結請求,客戶機必須指定代理伺服器,并将本來要直接發送到web伺服器上的http請求發送到代理伺服器中,由代理伺服器請求并傳回響應内容;
* 緩存服務
為proxy和fastcgi做緩存服務,提高通路速度,相當于squid功能;
2. 環境
<code>[root@nginx ~]</code><code># cat /etc/redhat-release </code>
<code>CentOS release 6.8 (Final)</code>
<code>[root@nginx ~]</code><code># uname -r</code>
<code>2.6.32-504.el6.x86_64</code>
3. 安裝
* 臨時關閉selinux(可選)
<code>[root@nginx ~]</code><code># setenforce 0</code>
* 關閉iptables(可選)
<code>[root@nginx ~]</code><code># service iptables stop</code>
* 建立www使用者
<code>[root@nginx ~]</code><code># useradd -r -s /sbin/nologin -M www</code>
* 安裝pcre庫依賴
<code>[root@nginx ~]</code><code># yum install pcre pcre-devel -y</code>
* 安裝ssl庫依賴
<code>[root@nginx ~]</code><code># yum install openssl openssl-devel -y</code>
* 進入下載下傳目錄
<code>cd</code> <code>/usr/local/src</code>
* 下載下傳nginx源碼包
<code>wget http:</code><code>//nginx</code><code>.org</code><code>/download/nginx-1</code><code>.11.10.</code><code>tar</code><code>.gz</code>
* 解壓nginx源碼包
<code>tar</code> <code>zxvf nginx-1.11.10.</code><code>tar</code><code>.gz</code>
* 進入nginx包目錄
<code>cd</code> <code>nginx-1.11.10</code>
* 指定安裝目錄、使用者、子產品
<code>[root@nginx ~]</code><code># ./configure --prefix=/usr/local/nginx-1.11.10 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module</code>
* 編譯并安裝
<code>[root@nginx ~]</code><code># make && make install</code>
* 做nginx軟連結
<code>[root@nginx ~]</code><code># ln -s /usr/local/nginx-1.11.10 /usr/local/nginx</code>
4. 建立啟動腳本
* /etc/init.d/nginx
<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: /usr/local/nginx/conf/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>] && </code><code>exit</code> <code>0</code>
<code>nginx=</code><code>"/usr/local/nginx/sbin/nginx"</code>
<code>prog=$(</code><code>basename</code> <code>$nginx)</code>
<code>NGINX_CONF_FILE=</code><code>"/usr/local/nginx/conf/nginx.conf"</code>
<code>[ -f </code><code>/etc/sysconfig/nginx</code> <code>] && . </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>&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>if</code> <code>[ -z </code><code>"`grep $user /etc/passwd`"</code> <code>]; </code><code>then</code>
<code> </code><code>useradd</code> <code>-M -s </code><code>/bin/nologin</code> <code>$user</code>
<code> </code><code>fi</code>
<code> </code><code>options=`$nginx -V 2>&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 && </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 [ -f $NGINX_CONF_FILE ] || </code><code>exit</code> <code>6</code>
<code> </code><code>make_dirs </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 ] && </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 retval=$?</code>
<code> </code><code>[ $retval -</code><code>eq</code> <code>0 ] && </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 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 ></code><code>/dev/null</code> <code>2>&1</code>
<code>case</code> <code>"$1"</code> <code>in</code>
<code> </code><code>start)</code>
<code> </code><code>rh_status_q && </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>rh_status_q || </code><code>exit</code> <code>0 </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>[root@nginx ~]</code><code># chmod 755 /etc/init.d/nginx</code>
* 添加進service管理服務并設定開機啟動
<code>[root@nginx ~]</code><code># chkconfig --add nginx</code>
<code>[root@nginx ~]</code><code># chkconfig nginx on</code>
5. 服務啟動測試
<code>[root@nginx ~]</code><code># service nginx start</code>
可以看到80預設的80端口nginx已經開始監聽
6. 通路測試
* 通過浏覽器測試, 此nginx主控端ip為192.168.222.128
<a href="https://s3.51cto.com/wyfs02/M00/8E/CB/wKioL1jLZlbwzh8RAAAplQqofmk312.png" target="_blank"></a>
通路成功,nginx已經成功傳回頁面
7. 總結
以需求驅動技術,技術本身沒有優略之分,隻有業務之分。
本文轉自asd1123509133 51CTO部落格,原文連結:http://blog.51cto.com/lisea/1907590,如需轉載請自行聯系原作者