Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12419
  • 博文数量: 3
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 52
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-27 14:16
个人简介

工作只是生活的一小组成部分。

文章分类

分类: 架构设计与优化

2014-03-03 17:55:34


版本:CentOS6.5_64bit + tomcat7.0 + MySQL5.5 + nginx1.2.8 + php5.4.15 + memcached-1.4.15

 

I.安装 JAVA 容器
1.安装依赖包
  1. yum -y install gcc gcc-c++ gcc-g77 flex bison autoconf automake libxml2 libxml2-devel curl curl-devel libtool make bzip2-devel zlib-devel ncurses-devel libjpeg-devel libpng-devel libtiff-devel openssh-clients freetype-devel pam-devel wget vim mysql-devel cmake openldap openldap-devel ntpdate unzip zip
  2. yum update -y bash glibc
2.安装 JDK
  1. rpm -ivh jdk-7-linux-x64.rpm
安装完成后用命令 java -version 验证是否安装成功
3.安装 tomcat 到 /usr/local/tomcat 下
  1. yum -y install apr-devel
  2. tar zxf apache-tomcat-6.0.35.tar.gz -C /usr/local/
  3. mv /usr/local/apache-tomcat-6.0.35/ /usr/local/tomcat
  4. cd /usr/local/tomcat/bin/tomcat-native-1.1.22-src/jni/native
  5. make && make install
  6. export LD_LIBRARY_PATH="/usr/local/apr/lib"
启动tomcat,访问 http:IP:8080

4.配置 tomcat

管理管理员用户,增加角色并将角色给予tomcat用户,否则在进入管理web页面的时候会提示403没有权限

  1. vim conf/tomcat-users.xml

5.配置tomcat和java的环境变量

vim /etc/profile

  1. PATH="$PATH:/usr/local/tomcat/bin:/usr/java/jdk1.7.0/bin:/usr/java/jdk1.7.0/jre/bin"
  2. JAVA_HOME=/usr/java/jdk1.7.0
  3. export JAVA_HOME
  4. CLASSPATH=/usr/java/jdk1.7.0/lib:/usr/java/jdk1.7.0/jre/lib
  5. export CLASSPATH
  6. export CATALINA_HOME=/usr/local/tomcat
  7. export CATALINA_BASE=/usr/local/tomcat
配置 Tomcat 访问端口,和优化连接数:
  1. maxHttpHeaderSize="8192" useBodyEncodingForURI="true"
  2. maxThreads="2000" redirectPort="8443" enableLookups="false"
  3. compression="on" compressionMinSize="2048"
  4. compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
  5. connectionTimeout="300000" disableUploadTimeout="true"/>

在文件最后添加以下两行代码
  1. vi /conf/catalina.properties
  2. org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false
  3. org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true
JVM优化 大型网站实例:
在tomcat 的bin 下catalina.sh 里,位置cygwin=false前添加:JAVA_OPTS="-server -Xmx3550m -Xms3550m -Xmn1256m -Xss128k -XX:SurvivorRatio=6 -XX:MaxPermSize=256m -XX:ParallelGCThreads=8 -XX:MaxTenuringThreshold=0 -XX:+UseConcMarkSweepGC"
调优说明:
-Xmx 与 -Xms 相同以避免JVM反复重新申请内存。-Xmx 的大小约等于系统内存大小的一半,即充分利用系统资源,又给予系统安全运行的空间。
-Xmn1256m 设置年轻代大小为1256MB。此值对系统性能影响较大,Sun官方推荐配置年轻代大小为整个堆的3/8。
-Xss128k 设置较小的线程栈以支持创建更多的线程,支持海量访问,并提升系统性能。
-XX:SurvivorRatio=6 设置年轻代中Eden区与Survivor区的比值。系统默认是8,根据经验设置为6,则2个Survivor区与1个Eden区的比值为2:6,一个Survivor区占整个年轻代的1/8。
-XX:ParallelGCThreads=8 配置并行收集器的线程数,即同时8个线程一起进行垃圾回收。此值一般配置为与CPU数目相等。
-XX:MaxTenuringThreshold=0 设置垃圾最大年龄(在年轻代的存活次数)。如果设置为0的话,则年轻代对象不经过Survivor区直接进入年老代。对于年老代比较多的应用,可以提高效率;如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。根据被海量访问的动态Web应用之特点,其内存要么被缓存起来以减少直接访问DB,要么被快速回收以支持高并发海量请求,因此其内存对象在年轻代存活多次意义不大,可以直接进入年老代,根据实际应用效果,在这里设置此值为0。
-XX:+UseConcMarkSweepGC 设置年老代为并发收集。CMS(ConcMarkSweepGC)收集的目标是尽量减少应用的暂停时间,减少Full GC发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代内存,适用于应用中存在比较多的长生命周期对象的情况。"

II.安装 MySQL

1.建立 mysql 用户

  1. groupadd mysql
  2. useradd -g mysql mysql
2.安装 MySQL
  1. tar zxvf mysql-5.5.9.tar.gz
  2. MY_dir="/usr/local/mysql"
  3. cmake -DCMAKE_INSTALL_PREFIX="$MY_dir" -DDEFAULT_CHARSET=utf8 -DMYSQL_DATADIR="$MY_dir/"data/ -DCMAKE_INSTALL_PREFIX="$MY_dir" -DSYSCONFDIR="$MY_dir" -DDEFAULT_COLLATION=utf8_general_ci -DENABLE_DEBUG_SYNC=0 -DENABLED_LOCAL_INFILE=1 -DENABLED_PROFILING=1 -DWITH_READLINE=1 .
  4. make
  5. make install
  6. /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
3.配置 my.cnf

使用my-large.cnf模板
cp mysql/support-files/my-large.cnf ../my.cnf
添加慢查询日志及其他一些设置
[mysqld]
slow-query-log = 1
slow-query-log-file = /usr/local/mysql/data/slow.log
default-storage-engine = MyISAM
character-set-server = utf8 #如果不指定这个,程序连接可能导致乱码。查看mysql> show variables like '%character%'
wait_timeout = 300 #对当前连接有效。
interactive_timeout = 300 #对后续连接

 

启动

/usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/my.cnf --user=mysql &


4.选装 TCMalloc 库,提升 MySQL 在高并发情况下的性能
  1. wget
  2. tar zxvf libunwind-1.1.tar.gz
  3. cd libunwind-1.1
  4. CFLAGS=-fPIC ./configure
  5. make CFLAGS=-fPIC
  6. make CFLAGS=-fPIC install

  1. wget
  2. tar zxvf gperftools-2.0.tar.gz
  3. cd gperftools-2.0
  4. ./configure
  5. make && make install
  6. echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
  7. /sbin/ldconfig
修改MySQL启动脚本,在# executing mysqld_safe 下一行添加
  1. vi /usr/local/mysql/bin/mysqld_safe
  2. export LD_PRELOAD=/usr/local/lib/libtcmalloc.so
重启 MySQL 若看到如下信息,说明TCMalloc已经生效
  1. /usr/sbin/lsof -n | grep tcmalloc
  2. mysqld 19030 mysql mem REG 8,1 2213595 2239696 /usr/local/lib/libtcmalloc.so.4.1.0

III.安装 NGINX

1.创建 nginx 用户及 webapps 目录

  1. groupadd www
  2. useradd -g www www
  3. mkdir -p /usr/local/www/
  4. chown -R www:www /usr/local/www/
2.安装 PCRE
  1. tar zxvf pcre-8.13.tar.gz
  2. cd pcre-8.13
  3. ./configure
  4. make && make install
3.安装 NGINX
  1. tar zxf nginx-1.2.8.tar.gz
  2. cd nginx-1.2.8
  3. ./configure --user=www --group=www --prefix=/usr/local/nginx/
  4. make && make install
4.配置 nginx.conf
  1. #修改好配置文件,启动就可以访问到Welcome to nginx!
  2. #修改好配置文件,启动就可以访问到Welcome to nginx!
  3. user www www;
  4. worker_processes 8;
  5. error_log logs/error.log;
  6. pid nginx.pid;
  7. events{
  8. use epoll;
  9. worker_connections 65535;}
  10. http {
  11. include mime.types;
  12. default_type application/octet-stream;
  13. #charset utf-8;
  14. server_names_hash_bucket_size 128;
  15. client_header_buffer_size 32k;
  16. large_client_header_buffers 4 32k;
  17. client_max_body_size 8m;
  18. sendfile on;
  19. tcp_nopush on;
  20. keepalive_timeout 60;
  21. tcp_nodelay on;
  22. fastcgi_connect_timeout 300;
  23. fastcgi_send_timeout 300;
  24. fastcgi_read_timeout 300;
  25. fastcgi_buffer_size 64k;
  26. fastcgi_buffers 8 128k;
  27. fastcgi_busy_buffers_size 128k;
  28. fastcgi_temp_file_write_size 128k;
  29. gzip on;
  30. gzip_min_length 1k;
  31. gzip_buffers 4 16k;
  32. gzip_http_version 1.0;
  33. gzip_comp_level 2;
  34. gzip_types text/plain application/x-javascript text/css application/xml;
  35. gzip_vary on;
  36. #limit_zone crawler $binary_remote_addr 10m;
  37. fastcgi_intercept_errors on;
  38. error_page 404
  39. proxy_temp_path /usr/local/nginx/proxy_temp_path;
  40. proxy_cache_path /usr/local/nginx/proxy_cache_path levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=20g;
  41. # 设置反向代理缓存区名称为 cache_one,内存大小500M,自动清除超过一天未被访问的缓存数据,硬盘缓存空间大小20G。

  42. upstream test.xxx.com {
    ip_hash;
    server 61.145.222.222:8090 max_fails=5 fail_timeout=10s weight=9;
    server 61.145.222.233:8091 max_fails=5 fail_timeout=10s weight=9;}

  43. server {
  44. listen 80;
  45. server_name g.wubolu.com;
  46. root /usr/local/www/;
  47. index index.php index.html index.htm;
  48. #access_log off;
  49. location ~* ^.+.(jpg|jpeg|gif|css|png|js|html|htm)$ {
  50. expires 1d;
  51. break;}
  52. location ~* ^/(images|javascript|js|css|flash|media|static)/ {
  53. expires 1d;}
  54. location ~ .*\.(php|php5)?$ {
  55. fastcgi_pass 127.0.0.1:9000;
  56. fastcgi_index index.php;
  57. fastcgi_param SCRIPT_FILENAME /usr/local/www/$fastcgi_script_name;
  58. include fastcgi_params;}
  59. location ~ .*\.(jsp|cgi|shtml|xml)?$ {
  60. proxy_pass
  61. include /usr/local/nginx/conf/proxy.conf;}
  62. }
  63. # 反向代理TOMCAT配置范例
  64. server {
  65. listen 80;
  66. server_name test.xxx.com;
  67. root /usr/local/www/test/;
  68. index index.jsp index.html index.htm;
  69. #access_log off;
  70. error_page 404 /no.html;
  71. error_page 500 502 503 504 /50x.html;
  72. if ($host = 'test.xxx.com'){
  73. rewrite ^/$ permanent;}
  74. location ~* .*\.(action|class|xml|dwr|jsp|cgi|shtml|swf|js|css)?$ {
  75. proxy_next_upstream error timeout invalid_header http_500 http_503 http_502 http_504;
    proxy_pass
    include /usr/local/nginx/conf/proxy.conf;}

    location ~* .*\.(jpg|jpeg|gif|png|bmp)?$ {
    proxy_cache cache_one;
    proxy_cache_valid 200 304 1h;
    proxy_cache_valid 301 302 1m;
    proxy_cache_valid any 1m;
    proxy_cache_key $host$uri$is_args$args;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass ;}
  76. }
  77. }
  78. --------------------- HTTP Proxy 模块,此模块能代理请求到其它服务器 -----------------
  79. # vim /usr/local/nginx/conf/proxy.conf
  80. proxy_redirect ofize 8k;
  81. proxy_buffering on;
  82. proxy_buffers 8 128k;
  83. proxy_buffer_size 128k;
  84. proxy_busy_buffers_size 256k;
  85. proxy_temp_file_write_size 512m;
  86. proxy_send_timeout 30;
  87. proxy_read_timeout 30;
  88. proxy_connect_timeout 60;
  89. proxy_redirect off;
  90. proxy_set_header Host $host;
  91. proxy_set_header X-Real-IP $remote_addr;
  92. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  93. client_max_body_size 50m;
  94. client_body_buffer_size 256k;
  95. proxy_max_temp_file_size 128m;
  96. proxy_connect_timeout :后端服务器连接的超时时间_发起握手等候响应超时时间,官方说最大不得超过75秒
  97. proxy_read_timeout:连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
  98. proxy_send_timeout :后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
  99. 了解更多参考:
  100. http://www.cnblogs.com/hsapphire/archive/2010/04/04/1704052.html
  101. 配置php-fpm配置文件,如fastcgi.conf或fcgi.conf
  102. 配置好 nginx.conf
  103. # 创建反向代理目录,必须在同一分区上。
  104. mkdir -p /usr/local/nginx/proxy_temp_path
  105. mkdir -p /usr/local/nginx/proxy_cache_path
  106. # 提示:清空反向代理的缓存则删除 proxy_cache_path 下内容即可。或者安装第三方插件ngx_cache_purge则可以用URL方式删除指定
5.检测配置文件是否正确
  1. /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx//conf/nginx.conf syntax is ok


IV.安装 PHP

程序员们在编写代码程序时,除了要保证代码的高性能之外,还有一点是非常重要的,那就是程序的安全性保障。PHP除了自带的几种加密函数外,还有功能更全面的PHP加密扩展 mcrypt, mcrypt软件依赖libmcrypt和mhash两个库。

1.安装Libmcrypt
  1. tar jxvf libmcrypt-2.5.8.tar.bz2
  2. cd libmcrypt-2.5.8
  3. ./configure
  4. make &&make install
  5. cd libmcrypt-2.5.8/libltdl/
  6. ./configure --enable-ltdl-install
  7. make && make install
2.安装mhash
  1. tar -zxvf mhash-0.9.9.9.tar.gz
  2. cd mhash-0.9.9.9
  3. ./configure
  4. make && make install
3.安装mcrypt
  1. tar -zxvf mcrypt-2.6.8.tar.gz
  2. cd mcrypt-2.6.8
  3. LD_LIBRARY_PATH=/usr/local/lib ./configure
  4. make && make install
如果不加环境变量LD_LIBRARY_PATH=/usr/local/lib的话,会提示找不到libmcrypt链接库
4.安装libiconv
  1. tar zxvf libiconv-1.13.1.tar.gz
  2. /configure --prefix=/usr/local/
  3. make
  4. make install
  5. ln -s /usr/local/mysql/lib/ /usr/lib64/
  6. ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/
  7. cp -frp /usr/lib64/libldap* /usr/lib/
32位系统在/usr/lib/,注:这里到 mysql 是从其他机器CP过来已经安装好的文件包,编译PHP的时候为了不安装MYSQL也能找到MYSQL的支持库和所需文件。
5.安装 PHP
  1. tar zxf php-5.4.15.tar.gz
  2. cd php-5.4.15
  3. ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-pdo --with-pdo-mysql=/usr/local/mysql --with-png-dir --with-libxml-dir=/usr --enable-safe-mode --enable-ftp --enable-zip --with-bz2 --with-png-dir --with-libxml-dir=/usr --with-jpeg-dir --with-png-dir=/usr/local/png --with-freetype-dir --with-iconv --enable-sysvsem --enable-inline-optimization --enable-xml --with-mcrypt --with-mhash -with-libxml-dir --enable-bcmath --enable-shmop --with-XMLrpc --with-zlib-dir --with-gd --enable-gd-native-ttf --with-curl --with-curlwrappers --with-pear --enable-mbregex --enable-calendar --enable-mbstring --enable-sockets --enable-exif --enable-magic-quotes --disable-rpath --disable-debug --enable-fpm --enable-sqlite-utf8 --enable-soap --with-ldap --with-ldap-sasl --enable-pcntl --with-openssl --enable-fastcgi --enable-pic --with-xml --enable-sysvshm --enable-xslt --enable-memcache --with-pcre-regex
  4. make ZEND_EXTRA_LIBS='-liconv'
  5. make install
6.配置 PHP
  1. cp php.ini-production /usr/local/php/lib/php.ini
  2. cp /home/installation/php-fpm.conf /usr/local/php/etc/php-fpm.conf
  3. cp /home/installation/php-5.4.15/sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
  4. chmod 755 /etc/rc.d/init.d/php-fpm
  5. sed -i '263a output_buffering = On' /usr/local/php/lib/php.ini
  6. sed -i '855a cgi.fix_pathinfo=0' /usr/local/php/lib/php.ini
最后两行设置防止NGINX文件类型错误解析漏洞。
7.php-fpm.conf 全部内容替换为:
  1. [global]
  2. pid = run/php-fpm.pid # 默认是none的,影响service php-fpm脚本
  3. [www]
  4. listen = 127.0.0.1:9000
  5. user = www #用户组和用户名跟NGINX的配置一致
  6. group = www
  7. pm = dynamic # static (设置为静态进程数)或者dynamic (设置为动态进程数)
  8. pm.max_children = 50 # 静态方式下开启的php-fpm进程数量
  9. pm.start_servers = 20 # 动态方式下的起始php-fpm进程数量
  10. pm.min_spare_servers = 5 # 动态方式下的最小php-fpm进程数量
  11. pm.max_spare_servers = 35 # 动态方式下的最大php-fpm进程数量
  12. rlimit_files = 10240 #设置PHP-FPM对打开文件描述符的限制,最终受LINUX内核打开最大文件数限制
  13. php_flag[display_errors] = on #打开报错,否则遇到错误只报500
  14. php_admin_value[session.save_path] = /tmp
  15. php_admin_value[date.timezone] = 'Asia/Chongqing'
启动:service php-fpm start 

V.安装 memcached
1.安装 PHP memcache 扩展(注意是memcache是php的扩展)
  1. tar zxf memcache-2.2.7.tgz
  2. cd /home/installation/memcache-2.2.7
  3. /usr/local/php/bin/phpize
  4. ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache
  5. make
  6. make install

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/

然后在/usr/local/php/lib/php.ini大概868行加入:

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/memcache.so

2.安装 memcached

  1. tar zxf libevent-2.0.21-stable.tar.gz
  2. cd libevent-2.0.21-stable
  3. ./configure --prefix=/usr/local/libevent
  4. make
  5. make install

  1. tar zxf memcached-1.4.15.tar.gz
  2. cd memcached-1.4.15
  3. ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
  4. make
  5. make install
启动 memcached
  1. /usr/local/memcached/bin/memcached -d -m 64 -l 192.168.1.201 -p 11211 -u root -P /usr/local/memcached/memcached.pid


VI.优化 CentOS 内核

1.增大打开文件数

  1. sed -i '$a * soft nofile 65535\n* hard nofile 65535' /etc/security/limits.conf
  2. sed -i '$a fs.file-max = 65536\nvm.swappiness = 0' /etc/sysctl.conf
2.定时校正服务器时间
  1. crontab -e
  2. 1 4 * * * ntpdate ntp.api.bz

3.TCP 调优

     http://wubolu.iteye.com/admin/blogs/794729

4.vim /etc/hosts  加入计算机名称,不然有时候会根据计算机名称找不到localhost
5.统一系统字符编码

  1. vim /etc/sysconfig/i18n
  2. LANG="en_US.UTF-8"
  3. SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en"
  4. SYSFONT="latarcyrheb-sun16"



阅读(1518) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:MySQL备份脚本

给主人留下些什么吧!~~