ubuntu11.10下安装nginx+php+mysql

18 篇文章 0 订阅

这是在网上搜索的一篇文章,其中有很多地方做了调整,之前一直在fedora下开发,今天给公司电脑安装了ubuntu11.10,实在受不了windows7,用于提高系统性能的很多软件没有windows版本。

首先安装这些,都是需要的,即使你现在不用,未来也要用.

sudo apt-get install build-essential libpcre3-dev libssl-dev libxslt-dev libgd2-xpm-dev libgeoip-dev zlib1g-dev

下载源码包,没办法,debian包目前还不能随意安装扩展

wget http://www.nginx.org/download/nginx-0.8.35.tar.gz

解压之后,进入目录运行以下命令,有一些是多余的,自己调整吧.我觉得以后要用,就懒得弄了
注意一下–with-cpu-opt 参数

./configure --conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_image_filter_module \
--with-sha1=/usr/include/openssl \
--with-md5=/usr/include/openssl \
--with-cpu-opt=intel32
 
make && make install

手工建立一下目录

mkdir -p /var/lib/nginx

建立shell 脚本 /etc/init.d/nginx

#! /bin/sh
 
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO
 
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC=nginx
 
test -x $DAEMON || exit 0
 
# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
        . /etc/default/nginx
fi
 
set -e
 
case "$1" in
  start)
        echo -n "Starting $DESC: "
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
                --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
  stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
                --exec $DAEMON
        echo "$NAME."
        ;;
  restart|force-reload)
        echo -n "Restarting $DESC: "
        start-stop-daemon --stop --quiet --pidfile \
                /var/run/$NAME.pid --exec $DAEMON
        sleep 1
        start-stop-daemon --start --quiet --pidfile \
                /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
  reload)
      echo -n "Reloading $DESC configuration: "
      start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
          --exec $DAEMON
      echo "$NAME."
      ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart|force-reload}" >& 2
        exit 1
        ;;
esac
 
exit 0

执行命令:

sudo update-rc.d -f nginx defaults

配置nginx.conf

比较关键的下面的几个,自己查文档,根据自己情况来调整,需要计算一下,因为用了epoll,要调整文件描述符的地方也不止这里一处,下面还有几处,需要留意了.
worker_processes
worker_rlimit_nofile
worker_cpu_affinity
worker_connections

通常来说,worker_connections* worker_processes = worker_rlimit_nofile ,worker_cpu_affinity根据worker_processes来调整.

若你要做大文件上传,可以参考这篇文章 点击这里

其他参数也要根据自己的需要进行调整.

 
#user  www-data www-data;
worker_processes  4;
 
error_log   /var/log/nginx/error.log info;
 
pid        /var/run/nginx.pid;
 
worker_rlimit_nofile 32768;
 
worker_cpu_affinity 0001 0010 0100 1000;
 
events {
    use epoll;
    worker_connections  8192;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
 
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
 
    access_log  /var/log/nginx/access.log main;
 
    sendfile         on;
    tcp_nopush    on;
    tcp_nodelay   on;
    keepalive_timeout  75 20;
    client_max_body_size 8m;
    large_client_header_buffers  4 8k;
 
 
    gzip  on;
    gzip_comp_level 3;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
 
    postpone_output  1460;
    output_buffers   4 32k;
 
  #  fastcgi_cache_path   /usr/local/nginx/fastcgi_cache  
  #                       levels=1:2
  #                       keys_zone=WEB:10m
  #                       inactive=5m;
 
    open_file_cache max=5000 inactive=20s; 
    open_file_cache_valid    30s; 
    open_file_cache_min_uses 2;
    open_file_cache_errors   on;
 
    server {
        listen       80;
        server_name  www.example.com;
        root  /var/www;
        #charset koi8-r;
 
 
        location / {
            index  index.html index.htm index.php;
        }
 
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
          expires      30d;
        }
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
        #    root   html;
        #}
 
 
        location ~ \.php  {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
            fastcgi_param  SERVER_SOFTWARE    web-server;
 
            fastcgi_param  QUERY_STRING       $query_string;
            fastcgi_param  REQUEST_METHOD     $request_method;
            fastcgi_param  CONTENT_TYPE       $content_type;
            fastcgi_param  CONTENT_LENGTH     $content_length;
 
            fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
            fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
            fastcgi_param  REQUEST_URI        $request_uri;
            fastcgi_param  DOCUMENT_URI       $document_uri;
            fastcgi_param  DOCUMENT_ROOT      $document_root;
            fastcgi_param  SERVER_PROTOCOL    $server_protocol;
 
            fastcgi_param  REMOTE_ADDR        $remote_addr;
            fastcgi_param  REMOTE_PORT        $remote_port;
            fastcgi_param  SERVER_ADDR        $server_addr;
            fastcgi_param  SERVER_PORT        $server_port;
            fastcgi_param  SERVER_NAME        $server_name;
 
            # PHP only, required if PHP was built with --enable-force-cgi-redirect
            fastcgi_param  REDIRECT_STATUS    200;
 
            #support PATH_INFO
            fastcgi_split_path_info ^(.+\.php)(.*)$;
            fastcgi_param  PATH_INFO         $fastcgi_path_info;
 
    #        fastcgi_cache   WEB;
    #       fastcgi_cache_valid   200 302  1h;
    #        fastcgi_cache_valid   301      1d;
    #        fastcgi_cache_valid   any      1m;
    #        fastcgi_cache_min_uses  1;
    #        fastcgi_cache_use_stale error  timeout invalid_header http_500;
 
    #        因为header过大造成502错误可以把下面两个参数设置大一点
    #        fastcgi_buffer_size 128k;
    #        fastcgi_buffers 4 256k;
 
        }
 
    }
 
  server {
    listen  80;
    server_name  status.example.com;
 
    location / {
    stub_status on;
    access_log   off;
    }
 }
 
}


下载 php-5.2.14.tar.gz和 php-5.2.14-fpm-0.5.14.diff.gz,一定要下载0.5.14这个版本以及以上版本,这个版本我的补丁已经提交到官方合并了,打了补丁就不用弄limit.conf配置或者ulimit

然后安装PHP,configure这里也要根据自己的需要调整一下.

sudo ln -s /usr/lib/i386-linux-gnu/libpng* /usr/lib/ 
sudo ln -s /usr/lib/i386-linux-gnu/libjpeg* /usr/lib/

tar zxvf php-5.2.14.tar.gz
gzip -cd php-5.2.14-fpm-0.5.14.diff.gz | patch -d php-5.2.14 -p1
 
 
./configure  --prefix=/usr/local --enable-fastcgi --enable-fpm --with-zlib --with-gd --enable-mbstring --enable-sockets --with-pear --with-freetype-dir  --with-jpeg-dir --with-png-dir --with-ttf --enable-force-cgi-redirect 
 
make && make install

配置php-fpm.conf,配置下面几个参数就可以了,其他的默认

max_requests即是说每个进程若超过这个数目(跟php进程有一点点关系,关系不大),就自动杀死..我这里应该设置512的,不过懒得压力测试了,设置大一点,不过也不要设置过大,是个结构体,没测试过,接近8K到9K大小.网上动辄设置100k,有点浪费内存了.一个进程浪费大小接近1M.按照网上常用配置的128个进程,大概浪费100M左右.好吧,我承认100M是白菜价,但也别这样浪费..= =

max_children基本就是进程数,跟nginx的进程没有想象中的那么大,因为FPM会自己管理进程(有待考证,起码我简单浏览了一下源码,认为是这个意思).参数不宜设置过大,很占内存,进程的消耗就不用我多说了.

max_children较好的设置方式根据req/s来设置,若程序是 100 req/s的处理能力..最大并发是10K,那么就设置 100比较好,这是动态来调整的.

不过你若用php 5.3,也可以把style设置为apache-like,那么设置start_servers,min_spare_servers,max_spare_servers三个参数就可以自动调整
很简单,具体看配置文件,这样的设置之后,在高负载和复杂的php程序会省事一点,毕竟测试req/s是可恶的体力活.

 
<value name="user">nobody</value>
 
<value name="group">nogroup</value>
 
<value name="max_children">64</value>
 
<value name="rlimit_files">32768</value>
 
<value name="max_requests">8192</value>

copy 源码包的php.ini到 /usr/local/lib,用php –ini可以验证是否加载通过.

修改php.ini几个地方:

你也可以这么做的,这样做可以避免硬盘IO
apc.shm_segments 可以设置的跟php-fpm的max_children相等,也不一定了,自己用apc.php查看着调整,主要是为了降低lock的时间.

apc.shm_size 自己考虑设置设置多少了,记住你用的APC内存是 shm_segments * shm_size ,比如 shm_segments为32 ,shm_size是默认的30,那么就是32*30,大概是960M..好大啊…= =

顺便说一下,可以调整一下kernel.shmmax的大小,php-fpm也用了不少shm..寒

output_buffering = On
extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613/"
 
extension = "memcached.so"
extension = "apc.so"
extension = "mongo.so"

执行pecl命令安装上面的扩展:

pecl install apc
pecl install memcached
pecl install mongo

调整内核参数,打开/etc/sysctl.conf,在末位加上.
详细的请看这里,本人还有不少参数没调整,自己研究了…我不是运维人员..= =

 
#Disabling the TCP options reduces the overhead of each TCP packet and might help to get the 
#These ensure that TIME_WAIT ports either get reused or closed fast.
 
#The tcp_fin_timeout variable tells kernel how long to keep sockets in the state FIN-WAIT-2 if you were the one closing the socket.
net.ipv4.tcp_fin_timeout = 1
 
#This variable enables the fast recycling function of TIME-WAIT sockets.
net.ipv4.tcp_tw_recycle = 1
 
#this allows reusing sockets in TIME_WAIT state for new connections when it is safe from protocol viewpoint.
net.ipv4.tcp_tw_reuse = 1
 
#TCP memory
 
#Maximum TCP Receive Window
net.core.rmem_max = 16777216
net.core.rmem_default = 16777216
 
#Maximum TCP Send Window
net.core.wmem_max = 16777216
net.core.wmem_default = 16777216
 
net.core.netdev_max_backlog = 30000 
net.core.somaxconn = 262144
 
# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1
 
#Maximal number of TCP sockets not attached to any user file handle, held by system.
net.ipv4.tcp_max_orphans = 262144
 
#Maximal number of remembered connection requests, which still did not receive an acknowledgment from connecting client.
net.ipv4.tcp_max_syn_backlog = 262144
 
#To open the other side of the connection, the kernel sends a SYN with a piggybacked ACK on it, to acknowledge the earlier received SYN. 
net.ipv4.tcp_synack_retries = 2
 
#Number of SYN packets the kernel will send before giving up on the new connection.
net.ipv4.tcp_syn_retries = 2
 
# increase Linux autotuning TCP buffer limits
# min, default, and max number of bytes to use
# set max to at least 4MB, or higher if you use very high BDP paths
 
net.ipv4.tcp_rmem = 4096 87380 16777216 
net.ipv4.tcp_wmem = 4096 65536 16777216
 
 
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
 
# pluggable congestion control algorithms
net.ipv4.tcp_congestion_control=cubic
 
# Maximum size of shared memory segment(bytes)
kernel.shmmax = 524288000
# Total amount of shared memory available (pages)
# see command: getconf PAGESIZE
# kernel.shmall = 2097152
 
# msgmnb specifies the maximum total size, in bytes, 
# of all messages that can be queued simultaneously on a message queue.
kernel.msgmnb = 65536
# This specifies the maximum size of a message 
# that can be sent from one process to another process. 
kernel.msgmax = 65536

最后还有几个命令要执行一下:

sysctl -p
 
cp /usr/local/sbin/php-fpm /etc/init.d/php-fpm
sudo update-rc.d -f php-fpm defaults

这样就做完了,然后就是启动 php-fpm和nginx就可以了.
另外,我没用mysql,所以就不贴MYSQL如何配置了..基本按照张宴的来安装就可以了.只是mysql的配置参数需要修改一下..因为他配的有点粗糙.

如果你跟我一样用mongodb,基本不需要怎么配置了,解压就能用,所以就不贴了

ps:还有很多优化参数,我没有加上..哥们我不是运维人员,所以各位自己研究了.= =..另外我以后也会补充的,等负载高了再说.当然,若有错误,请指正了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值