資料來源:http://icandata.blog.hexun.com.tw/41806505_d.html
為什麽要選擇 FreeBSD?
官方網站:www.freebsd.org 中文網站:http://www.freebsd.org/zh_CN/ FreeBSD是一個優秀的unix操作系統,基於寬松的BSD協議,是完美的企業級操作系統,以重點突出性能和安全而聞名,行業領先的企業多年以來一直使用FreeBSD服務器。具有同所有其它開源軟件操作系統競爭的高級性能。
|
為什麽要選擇 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不間斷運行,即使運行數個月也不需要重新啟動. 你還能夠不間斷服務的情況下進行軟件版本的升級;
- 穩定性高:用於反向代理,宕機的概率微乎其微。
為什麽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,在此僅給出鏈接,以避免不必要的重復勞動:
- 英文版
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/install.html - 中文版
http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/install.html
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,這裏只給出鏈接:
- 英文版
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html - 中文版
http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/kernelconfig.html
獲取相關開源軟件包本文中提到的所有開源軟件包為截止到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
將
如要顯示PHP調試的錯誤信息將
創建 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時間
沒有留言:
張貼留言