• FreeBSD + Nginx 环境搭建教程


    前言:本文是关于如何搭建基于“FreeBSD7.2 + Nginx0.8.24 + PHP5.2.11(FastCGI) + GD2.0.53 + ZendOptimizer3.3.9 + Mysql5.1.40 + 系统优化 + 防ddos攻击”高性能、高负载Web服务器的文章,安装方式为源代码安装。 

    Ports 方式安装请参考: http://www.excms.cn/manual/freebsd-nginx-php-mysql-ports.html
    文档目录

    为什么要选择 FreeBSD?
    为什么要选择 Nginx?
    安装 FreeBSD7.2
    获取相关开源软件包
    安装 Mysql5.1.40
    安装 Nginx
    安装 pcre8.00
    安装 Nginx0.8.24
    安装 libxml2-2.7.6
    安装 GD
    安装 zlib1.2.3
    安装 libpng1.2.40
    安装 jpeg7
    安装 freetype2.3.11
    安装 gd2.0.35
    安装 PHP
    安装 libiconv1.13
    安装 php5.2.11(FastCGI模式)
    安装 ZendOptimizer3.3.9
    测试
    系统优化
    防ddos攻击
    为什么要选择 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,在此仅给出链接,以避免不必要的重复劳动:
    英文版
    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.40

    Mysql5.1.40 下载地址: http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.40.tar.gz/from/pick
    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.24

    tar 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/sh

    nginx=/usr/local/webserver/nginx/sbin/nginx
    conf=/usr/local/webserver/nginx/conf/nginx.conf

    case $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

    安装 zlib

    tar zxvf zlib-1.2.3.tar.gz
    cd zlib-1.2.3
    ./configure
    make && make install clean
    cd ..
    安装 libpng

    tar zxvf libpng-1.2.40.tar.gz
    cd libpng-1.2.40
    ./configure
    make && make install clean
    cd ..
    安装 jpeg

    tar zxvf jpegsrc.v7.tar.gz
    cd jpeg-7
    ./configure –prefix=/usr/local/jpeg7 -enable-shared -enable-static
    make && make install clean
    cd ..
    安装 freetype

    tar zxvf freetype-2.3.11.tar.gz
    cd freetype-2.3.11
    ./configure
    make && make install clean
    cd ..
    安装 gd2.0.35

    tar zxvf gd-2.0.35.tar.gz
    cd gd-2.0.35
    ./configure --prefix=/usr/local/gd2 --with-jpeg=/usr/local/jpeg7 --width-png --width-zlib --width-freetype
    make && make install clean
    cd ..
    安装 libxml2

    tar -zxvf libxml2-2.7.6.tar.gz
    cd libxml2-2.7.6
    ./configure
    make && make install clean
    cd ..
    安装 PHP5.2.11

    编译安装PHP 5.2.11所需的支持库 libiconv

    tar 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 ..
    安装 ZendOptimizer

    ZendOptimizer 官方下载地址: http://www.zend.com/en/products/guard/downloads
    tar zxvf ZendOptimizer-3.3.9-freebsd6.0-i386.tar.gz
    cd ZendOptimizer-3.3.3-freebsd6.0-i386
    ln -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-tty
    cd ..
    安装过程中的提示全默认就可以,指定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
    将 <value name="user">nobody</value>和 <value name="group">nobody</value> 中的 nobody 改为 www, 并去掉前后的注释标签 <!-- , -->;
    如要显示PHP调试的错误信息将 <value name="display_errors">0</value> 修改为 <value name="display_errors">1</value> ,并去掉前后的注释标签 <!-- , -->, 以显示PHP错误信息,否则,Nginx 会报状态为500的空白错误页。 
    创建 PHP-fpm 开机启动脚本
    vi /usr/local/etc/rc.d/php-fpm.sh

    加入以下内容
    #! /bin/sh

    php_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
    加入如下文本
    <?
        phpinfo();
        ?>
    打开浏览器,在地址栏里输入 http://您服务器的IP/phpinfo.php
    系统优化

    修改内核参数,编辑 /boot/loader.conf
    vi /boot/loader.conf
    加入如下文本
    kern.dfldsiz="2147483648" # Set the initial data size limit
    kern.maxdsiz="2147483648" # Set the max data size
    kern.ipc.nmbclusters="0" # Set the number of mbuf clusters
    kern.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时间
  • 相关阅读:
    [转] 敏捷软件开发 Agile Software Development
    Concurrent Framework Synchronizer 同步器: Easy to use but easy to make dead lock as well
    Concurrent Framework Timer
    JavaScript Return Object.Type
    Js AJAX Event
    js Functor Copy
    多线程19-线程池批量插入线程
    多线程18-QueueUserWorkItem
    多线程17-Async Programming Model
    多线程16-SpinWait
  • 原文地址:https://www.cnblogs.com/top5/p/1837992.html
Copyright © 2020-2023  润新知