2012年11月12日 星期一

安裝 - FreeBSD + Nginx 環境搭建教程(推薦) [原創 2009-12-9 14:01:49]

安裝 - FreeBSD + Nginx 環境搭建教程(推薦) [原創 2009-12-9 14:01:49]   
資料來源:http://icandata.blog.hexun.com.tw/41806505_d.html

為什麽要選擇 FreeBSD?

官方網站www.freebsd.org 中文網站:http://www.freebsd.org/zh_CN/
FreeBSD是一個優秀的unix操作系統,基於寬松的BSD協議,是完美的企業級操作系統,以重點突出性能和安全而聞名,行業領先的企業多年以來一直使用FreeBSD服務器。具有同所有其它開源軟件操作系統競爭的高級性能。
  • Unix兼容性強
  • 速度快
  • 極其穩定、可靠
  • 強大的網絡功能
  • 用戶、多任務
  • 使用方便(按照極好的說明文件操作)


為什麽要選擇 Nginx?

Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的Rambler.ru 站點開發的,它已經在該站點運行超過四年多了。Igor 將源代碼以類BSD許可證的形式發布。自Nginx 發布四年來,Nginx 已經因為它的穩定性、豐富的功能集、 示例配置文件和低系統資源的消耗而聞名了。目前國內各大門戶網站已經部署了Nginx,如新浪、網易、騰訊等;國內幾個重要的視頻分享網站也部署了Nginx,如六房間、酷6等。 新近發現Nginx 技術在國內日趨火熱,越來越多的網站開始部署Nginx。
Nginx 是一個很牛的高性能Web和反向代理服務器, 它具有有很多非常優越的特性:

  • 在高連接並發的情況下,Nginx是Apache服務器不錯的替代品: Nginx在美國是做虛擬主機生意的老板們經常選擇的軟件平臺之一. 能夠支持高達 50,000 個並發連接數的響應, 感謝Nginx為我們選擇了 epoll and kqueue 作為開發模型;
  • 內存消耗少:在3萬並發連接下,開啟10個Nginx進程消耗150M左右內存(15M*10);
  • 不要錢:Nginx為開源軟件,可以免費使用。而購買F5 BIG-IP、NetScaler等硬件負載均衡交換機剛需要十多萬至幾十萬元人民幣;
  • Nginx作為負載均衡服務器: Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務, 也可以支持作為HTTP代理 服務器對外進行服務. Nginx采用C進行編寫, 不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多;
  • 作為郵件代理服務器: Nginx 同時也是一個非常優秀的郵件代理服務器(最早開發這個產品的目的之一也是作為郵件代理服務器),Last.fm描述了成功並且美妙的使用經驗
  • Nginx 是一個 [#installation 安裝] 非常的簡單 ,配置文件?非常簡潔(還能夠支持perl語法),Bugs非常少的服務器: Nginx 啟動特別容易, 並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動. 你還能夠不間斷服務的情況下進行軟件版本的升級;
  • 穩定性高:用於反向代理,宕機的概率微乎其微。
4GB內存的服務器+Apache(prefork模式)一般只能處理3000個並發連接,因為它們將占用3GB以上的內存,還得為系統預留1GB的內存。 Nginx 0.7.51 + PHP 5.2.8 (FastCGI) 服務器在3萬並發連接下,開啟的10個Nginx進程消耗150M內存(15M*10=150M),開啟的64個php-cgi進程消耗1280M內存(20M*64=1280M),加上系統自身消耗的內存,總共消耗不到2GB內存。如果服務器內存較小,完全可以只開啟25個php-cgi進程,這樣php-cgi消耗的總內存數才500M。
為什麽Nginx的性能要比Apache高得多?這得益於Nginx使用了最新的epoll(Linux 2.6內核)和kqueue(freebsd)網絡I/O模型,而Apache則使用的是傳統的select模型。目前Linux下能夠承受高並發訪問的Squid、Memcached都采用的是epoll網絡I/O模型。

處理大量的連接的讀寫,Apache所采用的select網絡I/O模型非常低效。下面用一個比喻來解析Apache采用的select模型和Nginx采用的epoll模型進行之間的區別:

假設你在大學讀書,住的宿舍樓有很多間房間,你的朋友要來找你。select版樓管大媽就會帶著你的朋友挨個房間去找,直到找到你為止。而epoll版樓管大媽會先記下每位同學的房間號,你的朋友來時,只需告訴你的朋友你住在哪個房間即可,不用親自帶著你的朋友滿大樓找人。如果來了10000個人,都要找自己住這棟樓的同學時,select版和epoll版樓管大媽,誰的效率更高,不言自明。同理,在高並發服務器中,輪詢I/O是最耗時間的操作之一,select和epoll的性能誰的性能更高,同樣不言自明了。 
安裝 FreeBSD7.2操作系統的安裝建議參考FreeBSD Handbook,在此僅給出鏈接,以避免不必要的重復勞動:

安裝時的註意事項
1. 磁盤分區
由於是WEB服務系統,網站目錄都放於/home目錄下,因此home分區要有足夠的空間。以一塊硬盤146G/內存4G的服務器為例,可做如下分區:
  /  1024M  
  swap 4096M
  /var 10G
  /usr 20G
  /home 110G
  /tmp 1024M  
2. 軟件包的選擇
我們的WEB服務系統是要對外服務的,所以盡可能少的選擇軟件包,安裝時建議選擇Minimal,然後進入Custom選擇doc,info,man,src即可。
配置 1. 編輯/etc/rc.conf確保有如下內容:
  sshd_enable="YES"  
  named_enable="YES"2.根據硬件的配置重新編譯內核,編譯內核的辦法參考FreeBSD Handbook,這裏只給出鏈接:
編譯後系統的性能將得到較大的提升。 

獲取相關開源軟件包本文中提到的所有開源軟件包為截止到2009年10月20日的最新穩定版,且均從官方網站下載。 mkdir -p /home/software
cd /home/software
fetch http://sysoev.ru/nginx/nginx-0.8.24.tar.gz
fetch ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.gz
fetch ftp://xmlsoft.org/libxml2/libxml2-2.7.6.tar.gz
fetch http://www.zlib.net/zlib-1.2.3.tar.gz
fetch ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.2.40.tar.gz
fetch http://www.ijg.org/files/jpegsrc.v7.tar.gz
fetch http://ftp.twaren.net/Unix/NonGNU/freetype/freetype-2.3.11.tar.gz
fetch http://www.libgd.org/releases/gd-2.0.35.tar.gz
fetch http://www.php.net/get/php-5.2.11.tar.gz/from/this/mirror
fetch http://php-fpm.org/downloads/php-5.2.11-fpm-0.5.13.diff.gz 
fetch http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz


安裝 Mysql5.1.40Mysql5.1.40 下載地址: [url]http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.40.tar.gz/from/pick [/url]pw groupadd mysql
pw useradd mysql -g mysql -d /dev/null -s /sbin/nologin
tar zxvf mysql-5.1.40.tar.gz
cd mysql-5.1.40
./configure --prefix=/usr/local/webserver/mysql/ --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile --with-plugins=innobase
make && make install clean
chmod +w /usr/local/webserver/mysql
chown -R mysql:mysql /usr/local/webserver/mysql
cp /usr/local/webserver/mysql/support-files/my-medium.cnf /usr/local/webserver/mysql/my.cnf
cd ..

以mysql用戶帳號的身份建立數據 /usr/local/webserver/mysql/bin/mysql_install_db --datadir=/usr/local/webserver/mysql/data --user=mysql

創建 Mysql 開機啟動腳本 cp /usr/local/webserver/mysql/share/mysql/mysql.server /usr/local/etc/rc.d/mysql.sh

為 mysql.sh 腳本設置可執行屬性 chmod +x /usr/local/etc/rc.d/mysql.sh

修改 /etc/rc.conf vi /etc/rc.conf

加入以下內容 mysql_enable="YES"

啟動 Mysql /usr/local/etc/rc.d/mysql.sh start

安裝 Nginx安裝Nginx所需的pcre庫tar zxvf pcre-8.00.tar.gz
cd pcre-8.00
./configure
make && make install clean
cd ..
安裝 Nginx0.8.24tar zxvf nginx-0.8.24.tar.gz
cd nginx-0.8.24
./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install clean
cd ..
創建 Nginx 日誌目錄mkdir -p /var/log/nginx
chmod +w /var/log/nginx
chown -R www:www /var/log/nginx
創建 Nginx 配置文件rm -f /usr/local/webserver/nginx/conf/nginx.conf
vi /usr/local/webserver/nginx/conf/nginx.conf
輸入以下內容: user  www www;worker_processes 8;error_log  /var/log/nginx/error.log;pid        /var/log/nginx/nginx.pid;worker_rlimit_nofile 51200;events {  use kqueue;  worker_connections 51200;}http {    include       mime.types;    default_type  application/octet-stream;    server_names_hash_bucket_size 128;    client_header_buffer_size 32k;    large_client_header_buffers 4 32k;    client_max_body_size 8m;    sendfile        on;    tcp_nopush     on;        keepalive_timeout  30;        tcp_nodelay on;    fastcgi_connect_timeout 300;    fastcgi_send_timeout 300;    fastcgi_read_timeout 300;    fastcgi_buffer_size 64k;    fastcgi_buffers 4 64k;    fastcgi_busy_buffers_size 128k;    fastcgi_temp_file_write_size 128k;    gzip  on;    gzip_min_length   1k;     gzip_buffers      4 16k;     gzip_http_version 1.1;     gzip_comp_level   2;    gzip_types text/plain application/x-javascript text/css application/xml      gzip_vary on;        server {        listen       80;        server_name  localhost;        root   /home/excms;        index  index.html index.htm index.php;        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;        }        location /nginx_status {            stub_status on;            access_log   off;        }    }}

創建 Nginx 開機啟動腳本 vi /usr/local/etc/rc.d/nginx.sh

加入以下內容#!/bin/shnginx=/usr/local/webserver/nginx/sbin/nginxconf=/usr/local/webserver/nginx/conf/nginx.confcase $1 in       start)              echo -n "Starting Nginx"              $nginx -c $conf              echo " done"       ;;       stop)              echo -n "Stopping Nginx"              killall -9 nginx              echo " done"       ;;       test)              $nginx -t -c $conf       ;;        reload)              echo -n "Reloading Nginx"              ps auxww | grep nginx | grep master | awk '{print $2}' | xargs kill -HUP              echo " done"       ;;        restart)                $nginx stop                $nginx start       ;;       show)              ps -aux|grep nginx       ;;       *)              echo -n "Usage: $0 {start|restart|reload|stop|test|show}"       ;;        esac

為 nginx.sh 腳本設置可執行屬性 chmod +x /usr/local/etc/rc.d/nginx.sh

修改 /etc/rc.conf vi /etc/rc.conf

加入以下內容 nginx_enable="YES"

啟動 Nginx /usr/local/etc/rc.d/nginx.sh start

在不停止 Nginx 服務的情況下平滑變更 Nginx 配置
修改 /usr/local/webserver/nginx/conf/nginx.conf 配置文件後,請執行以下命令檢查配置文件是否正確: /usr/local/etc/rc.d/nginx.sh test
  如果屏幕顯示以下兩行信息,說明配置文件正確:
the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok
the configuration file /usr/local/webserver/nginx/conf/nginx.conf was tested successfully

平滑變更 Nginx 配置 /usr/local/etc/rc.d/nginx.sh reload
安裝 GD安裝 zlibtar zxvf zlib-1.2.3.tar.gzcd zlib-1.2.3./configuremake && make install cleancd ..
安裝 libpngtar zxvf libpng-1.2.40.tar.gzcd libpng-1.2.40./configuremake && make install cleancd ..
安裝 jpegtar zxvf jpegsrc.v7.tar.gzcd jpeg-7./configure –prefix=/usr/local/jpeg7 -enable-shared -enable-staticmake && make install cleancd ..
安裝 freetypetar zxvf freetype-2.3.11.tar.gzcd freetype-2.3.11./configuremake && make install cleancd ..
安裝 gd2.0.35tar zxvf gd-2.0.35.tar.gzcd gd-2.0.35./configure --prefix=/usr/local/gd2 --with-jpeg=/usr/local/jpeg7 --width-png --width-zlib --width-freetypemake && make install cleancd ..
安裝 libxml2tar -zxvf libxml2-2.7.6.tar.gzcd libxml2-2.7.6./configuremake && make install cleancd ..
安裝 PHP5.2.11編譯安裝PHP 5.2.11所需的支持庫 libiconvtar zxvf libiconv-1.13.tar.gz
cd libiconv-1.13
./configure --prefix=/usr/local
make && make install clean
cd ..
編譯安裝PHP(FastCGI模式)tar zxvf php-5.2.11.tar.gz
gzip -cd php-5.2.11-fpm-0.5.13.diff.gz | patch -d php-5.2.11 -p1
cd php-5.2.11
./configure --prefix=/usr/local/webserver/php --with-config-file-path=/usr/local/webserver/php/etc --with-mysql=/usr/local/webserver/mysql --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-gd --enable-gd-native-ttf --with-libxml-dir --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-openssl --enable-pcntl --enable-sockets
make ZEND_EXTRA_LIBS='-liconv'
make install clean
cp php.ini-dist /usr/local/webserver/php/etc/php.ini
cd ..
安裝 ZendOptimizerZendOptimizer 官方下載地址: http://www.zend.com/en/products/guard/downloads tar zxvf ZendOptimizer-3.3.9-freebsd6.0-i386.tar.gzcd ZendOptimizer-3.3.3-freebsd6.0-i386ln -s /usr/lib/libc.so /usr/lib/libc.so.6 ln -s /usr/lib/libcrypt.so /usr/lib/libcrypt.so.3 ln -s /usr/lib/libutil.so /usr/lib/libutil.so.5 ln -s /usr/lib/libm.so /usr/lib/libm.so.4 ./install-ttycd ..
安裝過程中的提示全默認就可以,指定php.ini文件路徑 /usr/local/webserver/php/etc,到Apache Web Server選no
修改php-fpm配置文件php-fpm是為PHP打的一個FastCGI管理補丁,可以平滑變更php.ini配置而無需重啟php-cgi vi /usr/local/webserver/php/etc/php-fpm.conf
nobodynobody 中的 nobody 改為 www, 並去掉前後的註釋標簽
如要顯示PHP調試的錯誤信息將 0 修改為 1 ,並去掉前後的註釋標簽 , 以顯示PHP錯誤信息,否則,Nginx 會報狀態為500的空白錯誤頁。 
創建 PHP-fpm 開機啟動腳本 vi /usr/local/etc/rc.d/php-fpm.sh

加入以下內容 
#! /bin/shphp_fpm_BIN=/usr/local/webserver/php/bin/php-cgi
php_fpm_CONF=/usr/local/webserver/php/etc/php-fpm.conf
php_fpm_PID=/usr/local/webserver/php/logs/php-fpm.pid
php_opts="--fpm-config $php_fpm_CONF"
wait_for_pid () {        try=0        while test $try -lt 35 ; do                case "$1" in                        'created')                        if [ -f "$2" ] ; then                                try=''                                break                        fi                        ;;                        'removed')                        if [ ! -f "$2" ] ; then                                try=''                                break                        fi                        ;;                esac                echo -n .                try=`expr $try + 1`                sleep 1        done}case "$1" in        start)                echo -n "Starting php_fpm "                $php_fpm_BIN --fpm $php_opts                if [ "$?" != 0 ] ; then                        echo " failed"                        exit 1                fi                wait_for_pid created $php_fpm_PID                if [ -n "$try" ] ; then                        echo " failed"                        exit 1                else                        echo " done"                fi        ;;        stop)                echo -n "Shutting down php_fpm "                if [ ! -r $php_fpm_PID ] ; then                        echo "warning, no pid file found - php-fpm is not running ?"                        exit 1                fi                kill -TERM `cat $php_fpm_PID`                wait_for_pid removed $php_fpm_PID                if [ -n "$try" ] ; then                        echo " failed"                        exit 1                else                        echo " done"                fi        ;;        quit)                echo -n "Gracefully shutting down php_fpm "                if [ ! -r $php_fpm_PID ] ; then                        echo "warning, no pid file found - php-fpm is not running ?"                        exit 1                fi                kill -QUIT `cat $php_fpm_PID`                wait_for_pid removed $php_fpm_PID                if [ -n "$try" ] ; then                        echo " failed"                        exit 1                else                        echo " done"                fi        ;;        restart)                $0 stop                $0 start        ;;        reload)                echo -n "Reload service php-fpm "                if [ ! -r $php_fpm_PID ] ; then                        echo "warning, no pid file found - php-fpm is not running ?"                        exit 1                fi                kill -USR2 `cat $php_fpm_PID`                echo " done"        ;;        logrotate)                echo -n "Re-opening php-fpm log file "                if [ ! -r $php_fpm_PID ] ; then                        echo "warning, no pid file found - php-fpm is not running ?"                        exit 1                fi                kill -USR1 `cat $php_fpm_PID`                echo " done"        ;;        *)                echo "Usage: $0 {start|stop|quit|restart|reload|logrotate}"                exit 1        ;;esac

為 php-fpm.sh 腳本設置可執行屬性 chmod +x /usr/local/etc/rc.d/php-fpm.sh

修改 /etc/rc.conf vi /etc/rc.conf

加入以下內容 php_fpm_enable="YES"

啟動 PHP-fpm /usr/local/etc/rc.d/php-fpm.sh start

在不停止 PHP-fpm 服務的情況下平滑變更 php.ini 配置
修改 /usr/local/webserver/php/etc/php.ini 或者 /usr/loca/webserver/php/etc/php-fpm.conf 配置文件後,請執行以下命令檢查配置文件是否正確: /usr/local/etc/rc.d/php-fpm.sh reload
測試在/home/excms 目錄下新建 phpinfo.php vi /home/excms/phpinfo.php
加入如下文本
打開瀏覽器,在地址欄裏輸入 http://您服务器的IP/phpinfo.php 系統優化修改內核參數,編輯 /boot/loader.conf vi /boot/loader.conf
加入如下文本 kern.dfldsiz="2147483648"                # Set the initial data size limi

tkern.maxdsiz="2147483648"                # Set the max data size
kern.ipc.nmbclusters="0"                        # Set the number of mbuf clusterskern.ipc.nsfbufs="66560"                        # Set the number of sendfile(2) bufs
解釋:
 a.第一,第二行主要是為了突破1G內存設置的 
b. 第三行其實是bsd的一個bug,當系統並發達到一個數量級的時候,系統會crash,這個是非常糟糕的事情,所幸更改了這個參數後,在高並發的時候,基本可以沒有類似情況,當然非常bt的情況,還得進一步想辦法 
c.第四行是讀取的文件數,如果你下載的文件比較大,且比較多,加大這個參數,是非常爽的 防ddos攻擊Sysctl 修改vi /etc/rc.local
加入如下文本 sysctl kern.ipc.maxsockets=100000                ##增加並發的socket,對於ddos很有用sysctl kern.ipc.somaxconn=65535                ##打開文件數

sysctl net.inet.tcp.msl=2500                        ##timeout時

沒有留言:

張貼留言