nginx
安装nginx需要用到gcc,zlib-devel,openssl-devel,pcre-devel
想省事的话可以直接yum安装,
我用yum安装了gcc,zlib-devel,openssl-devel
然后源码安装pcre-devel
./configure && make && make install
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig
利用TCMalloc优化nginx性能
TCMalloc全称为Thread-Caching Malloc,是谷歌开发的开源工具google-perftools中的一个成员。与标准的glibc库的Malloc相比,TCMalloc库在内存分配效率和速度上要高很多,这在很大程度上提高了服务器在高并发情况下的性能,从而降低了系统的负载。
要安装TCMalloc要安装libunwind(32位操作系统不需要安装)和google-perftools两个软件包,libunwind库为基于64位CPU和操作系统的程序提供了基本函数调用链和函数调用寄存器功能。
libunwind下载地址http://download-mirror.savannah.gnu.org/releases/libunwind/
安装libunwind方法:
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
安装google-perftools:
./configure #默认安装路径/usr/lcoal/bin /usr/local/lib
make && make install
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf #建立动态链接库
ldconfig 刷新一下动态链接库
nginx安装方法:
进入nginx源码包,进入auto/cc/gcc文件,找到
# debug
CFLAGS = "$CFLAGS -g" 把它注释掉或者删除掉优化编译参数
进入nginx源码根目录用以下指令安装,把TCMalloc编译进nginx
./configure --prefix=/usr/local/nginx --with-pcre=/usr/lcoal/src/pcre-8.38 --with-http_stub_status_moduel --with-http_gzip_static_module --with-google_perftools_module
make && make install
--with-pcre后面要跟pcre源码包的路径,不是安装路径
为google-perftools添加一个线程目录:
mkdir /tmp/tcmalloc
chmod 0777 /tmp/tcmalloc
修改/usr/local/nginx/conf/nginx.conf:
#pid logs/nginx.pid;
google_perftools_profiles /tmp/tcmalloc #添加此行
然后把echo "PATH=/usr/local/nginx/sbin:$PATH" >> /etc/bashrc
成功之后,source /etc/bahsrc重新加载一下
把nginx加入环境变量,就可以直接使用nginx启动进程了
可以用nginx -t来进行nginx启动前检测
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
看到这种提示,表示可以正常启动用lsof -n | grep tcmalloc查看是否正常启动tcmalloc
[root@localhost ~]# lsof -n | grep tcmalloc
nginx 12030 nobody 10w REG 8,5 0 2490448 /tmp/tcmalloc.12030
nginx 12031 nobody 12w REG 8,5 0 2490450 /tmp/tcmalloc.12031
nginx 12032 nobody 14w REG 8,5 0 2490451 /tmp/tcmalloc.12032
nginx 12033 nobody 16w REG 8,5 0 2490453 /tmp/tcmalloc.12033
此处我开了4个nginx进程,所以tcmalloc有四个linux系统下针对nginx应用的内核参数优化,把以下参数加入/etc/sysctl.conf中
net.ipv4.tcp_max_tw_buckets =6000 #设定timewait的数量,默认是180000,这里设为6000
net.ipv4.ip_local_pore_range =1024 65000 #用来设定允许系统打开的端口范围
net.ipv4.tcp_tw_recycle =1#设置启用timewait快速回收
net.ipv4.tcp_tw_reuse =1#设置开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_syncookies = 1#用于设置开启SYN Cookies,当出现SYN等待队列溢出时,启动cookies进行处理
net.core.somaxconn =262144#默认值是128,这个参数用于调节系统同时发起的tcp连接数,在高并发的请求中,默认的值可能会导致连接超时或者重传,因#此,需要结合并发请求数来调节此值
net.core.netdev_max_backlog =262144#表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目
net.ipv4.tcp_max_orphans =262144#用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立连接将立即被复位并#打印出警告信息。这个限制只是为了防止简单的DoS攻击。不能过分依靠这个限制甚至人为减少这个值,更多的情况下应该增#加这个值
net.ipv4.tcp_max_syn_backlog =262144#用于记录那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,此参数的默认值是1024,对小内#存的系统则是128
net.ipv4.tcp_syn_retries =1#决定了内核放弃建立连接之前发送SYN包的数量
net.ipv4.tcp_synack_retries =1#决定了内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_fin_timeout =1#决定了套接字保持在FIN-WAIT-2状态的时间。默认值是60秒。正确设置这个值非常重要,有时即使一个负载很小的Web服务#器,也会出现大量的死套接字而产生内存溢出的风险。FIN-WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能消耗1.5KB的#内存,但是其生存期长些
net.ipv4.tcp_keepalive_time =30#表示当keepalive启用的时候,TCP发送keppalive消息的频度。默认值是2(单位是小时)。
然后执行/sbin/sysctl -p使之生效
php7.1.12安装
需要的软件
yum -y install gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel
此版本的php已经把php-fpm整合进去,可以直接编译安装 --enable-fpm
./configure --prefix=/usr/local/php --enable-fpm
make && make install
cp php.ini.development /usr/local/php/lib/php.ini
然后
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
在/etc/bashrc文件末尾加上PATH=/usr/local/php/bin:/usr/local/php/sbin:$PATH
然后可以执行php -v 查看版本 php-fpm启动fpm进程
还需要配置nginx的主配置文件让它支持fastcgi
把下面这些行取消掉注释 路径换成自己需要的
location ~ \.php$ {
root /usr/local/nginx/html/adminer;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/adminer$fastcgi_script_name;
include fastcgi_params;
}
在http层级加入如下fastcgi优化参数
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
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;
fastcgi_cache TEST;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
memcached安装
需要先安装libevent
./configure && make && make install
下载memcached
./configure && make && make install
export PATH=/usr/local/bin/memcached:$PATH
启动方式:
memcached -m 32m -p 11211 -d -u root -P /var/run/memcached.pid -c 256 -vv
关闭方式
kill `cat /var/run/memcached.pid`
安装php的memcache扩展
pecl官方的memcache已经很久没更新了,我试了最新的版本,总是报错
到这个地址下载:https://github.com/websupport-sk/pecl-memcache/archive/php7.zip
unzip pecl-memcache-php7.zip
cd pecl-memcache-php7
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache
make && make install
vim /usr/local/php/lib/php.ini
找到extension_dir="./"
替换为
extension_dir="
/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303
"添加extension=memcache.so
php -m查看是否有memcache扩展
测试是否成功
touch /usr/local/nginx/html/testmemcache.php #创建文件
内容如下:
$mem = new Memecache;
$mem->connect('127.0.0.1',11211);
$mem->set('test','Hello World!',0,12);
$val = $mem->get('test');
echo $val;
?>
memcached -m 32m -p 11211 -d -u root -P /var/run/memcached.pid -c 256 -vv
以上命令打开memcached
输入地址localhost/testmemcache.php
如果出现Hello World!表示成功!
UDFs实现Memcached和MySQL的自动更新
需要用到libevent->memcached->libmemcached-0.34->memcached_functions_mysql-1.1 MySQL
libevent,memcached已经安装好了,都是默认安装路径/usr/local
libmemcached安装方法
./configure --with-memcached && make && make install
memcached_functions_mysql-1.1安装方法
./configure --prefix=/usr/local/memcached_mysql --with-mysql=/usr/local/mysql/bin/mysql_config --with-libmemcached && make && make install
cp /usr/local/memcached_mysql/lib/libmemcached_functions_mysql.* /usr/local/mysql/lib/plugin/
打开mysql
source /usr/local/src/memcached_functions_mysql-1.1/sql/install_functions.sql;
select name,dl from mysql.func;查看是否写入成功
设置UDFs操作memcached服务器的ip地址和端口,此处我安装在本地,用127.0.0.1
mysql>select memc_servers_set('127.0.0.1:11211'); #显示0
查看memcached服务器的数量
mysql>select memc_server_count(); #显示1
列出可以修改Memcached参数的行为
mysql>select memc_list_behaviors() \G
设置MEMCACHED_BEHAVIOR_NO_BLOCK为打开状态,这样在Memcached出现问题(不能连接)时,数据可以继续插入MySQL中,但有报错提示:如果不设置此值,那么Memcached失败时,数据需要等到Memcached失败超时后才可以插入到表中。通过以下设置可以避免这种情况发生
mysql>select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1');
mysql>select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1');