LTMP手动编译安装以及全自动化部署实践(附详细代码)

大家使用LNMP架构,一般可以理解为Linux Shell为CentOS/RadHat/Fedora/Debian/Ubuntu/等平台安装LNMP(Nginx/MySQL /PHP),LNMPA(Nginx/MySQL/PHP/Apache),LAMP(Apache/MySQL/PHP)等类似的开发或生产环境。本文 较为详细的描述了基于LTMP架构的部署过程。

AD:

一、前言

现在很多朋友都了解或者已经在使用LNMP架构,一般可以理解为Linux Shell为CentOS/RadHat/Fedora/Debian/Ubuntu/等平台安装LNMP(Nginx/MySQL /PHP),LNMPA(Nginx/MySQL/PHP/Apache),LAMP(Apache/MySQL/PHP)等类似的开发或生产环境。我自 己是从SuSE/Oracle商业化环境走出来的,对于开源的部署方案也是在一点一点摸索,我相信其中也必然包含某些坑爹的配置。这篇文章较为详细的描述 了基于LTMP架构的部署过程,之后会再考虑独立各个模块分享细节和技巧,如果大家有更合适的配置实践手册欢迎一起分享,文章中的错误和改进点也请帮忙指 点下哈。

LTMP(CentOS/Tengine/MySQL/PHP)

二、LTMP版本

  1. CentOS_6.5_64
  2. Tengine-2.1.0
  3. MySQL_5.6.25
  4. PHP_5.5.27
  5. Apache_2.2.31(酱油)

三、准备工作

如果允许公网访问会方便很多

    1. #优化History历史记录 
    2. vi /etc/bashrc 
    3.  
    4. #设置保存历史命令的文件大小 
    5. export HISTFILESIZE=1000000000 
    6. #保存历史命令条数 
    7. export HISTSIZE=1000000 
    8. #实时记录历史命令,默认只有在用户退出之后才会统一记录,很容易造成多个用户间的相互覆盖。 
    9. export PROMPT_COMMAND="history -a" 
    10. #记录每条历史命令的执行时间 
    11. export HISTTIMEFORMAT="%Y-%m-%d_%H:%M:%S " 
    12.  
    13. #设置时区(可选) 
    14. rm -rf /etc/localtime 
    15. ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
    16.  
    17. #禁用NetworkManager(可选) 
    18. /etc/init.d/NetworkManager stop 
    19. chkconfig NetworkManager off 
    20. /etc/init.d/network restart 
    21.  
    22. #关闭iptables(可选)  
    23. /etc/init.d/iptables stop 
    24. chkconfig iptables off 
    25.  
    26. #设置dns(可选) 
    27. echo "nameserver 114.114.114.114" > /etc/resolv.conf  
    28.  
    29. #关闭maildrop 
    30. #cd /var/spool/postfix/maildrop;ls | xargs rm -rf;  
    31. sed 's/MAILTO=root/MAILTO=""/g' /etc/crontab 
    32. service crond restart 
    33.  
    34. #关闭selinux 
    35. setenforce 0 
    36. sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config   
    37.  
    38.  
    39. #文件打开数量, 
    40. echo ulimit -SHn 65535 >> /etc/profile 
    41. source /etc/profile 
    42.  
    43. #修改最大进程和最大文件打开数限制 
    44. vi /etc/security/limits.conf 
    45. * soft nproc 11000 
    46. * hard nproc 11000 
    47. * soft nofile 655350 
    48. * hard nofile 655350 
    49.  
    50. sed -i -e '/# End of file/i* soft  nofile 65535 * hard nofile 65535'  /etc/security/limits.conf 
    51.  
    52. #优化TCP 
    53. vi /etc/sysctl.conf 
    54.  
    55. net.ipv4.ip_forward = 0   
    56. net.ipv4.conf.default.rp_filter = 1   
    57. net.ipv4.conf.default.accept_source_route = 0   
    58. kernel.sysrq = 0   
    59. kernel.core_uses_pid = 1   
    60. #开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理 
    61. net.ipv4.tcp_syncookies = 1   
    62. kernel.msgmnb = 65536   
    63. kernel.msgmax = 65536   
    64. kernel.shmmax = 68719476736   
    65. kernel.shmall = 4294967296   
    66. #timewait的数量,默认是180000 
    67. net.ipv4.tcp_max_tw_buckets = 6000   
    68. net.ipv4.tcp_sack = 1   
    69. net.ipv4.tcp_window_scaling = 1   
    70. net.ipv4.tcp_rmem = 4096 87380 4194304    
    71. net.ipv4.tcp_wmem = 4096 16384 4194304    
    72. net.core.wmem_default = 8388608   
    73. net.core.rmem_default = 8388608   
    74. net.core.rmem_max = 16777216   
    75. net.core.wmem_max = 16777216   
    76. #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目 
    77. net.core.netdev_max_backlog = 262144   
    78. #web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值 
    79. net.core.somaxconn = 262144   
    80. #系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)      
    81. net.ipv4.tcp_max_orphans = 3276800   
    82. #记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128 
    83. net.ipv4.tcp_max_syn_backlog = 262144   
    84. #时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉 
    85. net.ipv4.tcp_timestamps = 0   
    86. #为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量 
    87. net.ipv4.tcp_synack_retries = 1   
    88. #在内核放弃建立连接之前发送SYN包的数量 
    89. net.ipv4.tcp_syn_retries = 1   
    90. #启用timewait快速回收      
    91. net.ipv4.tcp_tw_recycle = 1   
    92. #开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接 
    93. net.ipv4.tcp_tw_reuse = 1   
    94. net.ipv4.tcp_mem = 94500000 915000000 927000000    
    95. #如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。 
    96. net.ipv4.tcp_fin_timeout = 1   
    97. #当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。 
    98. net.ipv4.tcp_keepalive_time = 30   
    99. #允许系统打开的端口范围 
    100. net.ipv4.ip_local_port_range = 1024 65000  
    101. #表示文件句柄的最大数量 
    102. fs.file-max = 102400 
    103.  
    104. #云主机上的优化 
    105.  
    106. # Kernel sysctl configuration file for Red Hat Linux 
    107. For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and 
    108. # sysctl.conf(5) for more details. 
    109.  
    110. # Controls IP packet forwarding 
    111. net.ipv4.ip_forward = 0 
    112.  
    113. # Controls source route verification 
    114. net.ipv4.conf.default.rp_filter = 1 
    115.  
    116. # Do not accept source routing 
    117. net.ipv4.conf.default.accept_source_route = 0 
    118.  
    119. # Controls the System Request debugging functionality of the kernel 
    120.  
    121. # Controls whether core dumps will append the PID to the core filename. 
    122. # Useful for debugging multi-threaded applications. 
    123. kernel.core_uses_pid = 1 
    124.  
    125. # Controls the use of TCP syncookies 
    126. net.ipv4.tcp_syncookies = 1 
    127.  
    128. # Disable netfilter on bridges. 
    129. net.bridge.bridge-nf-call-ip6tables = 0 
    130. net.bridge.bridge-nf-call-iptables = 0 
    131. net.bridge.bridge-nf-call-arptables = 0 
    132.  
    133. # Controls the default maxmimum size of a mesage queue 
    134. kernel.msgmnb = 65536 
    135.  
    136. # Controls the maximum size of a message, in bytes 
    137. kernel.msgmax = 65536 
    138.  
    139. # Controls the maximum shared segment size, in bytes 
    140. kernel.shmmax = 68719476736 
    141.  
    142. # Controls the maximum number of shared memory segments, in pages 
    143. kernel.shmall = 4294967296 
    144. net.ipv4.conf.all.send_redirects = 0 
    145. net.ipv4.conf.default.send_redirects = 0 
    146. net.ipv4.conf.all.secure_redirects = 0 
    147. net.ipv4.conf.default.secure_redirects = 0 
    148. net.ipv4.conf.all.accept_redirects = 0 
    149. net.ipv4.conf.default.accept_redirects = 0 
    150. net.ipv4.conf.all.send_redirects = 0 
    151. net.ipv4.conf.default.send_redirects = 0 
    152. net.ipv4.conf.all.secure_redirects = 0 
    153. net.ipv4.conf.default.secure_redirects = 0 
    154. net.ipv4.conf.all.accept_redirects = 0 
    155. net.ipv4.conf.default.accept_redirects = 0 
    156. net.netfilter.nf_conntrack_max = 1000000 
    157. kernel.unknown_nmi_panic = 0 
    158. kernel.sysrq = 0 
    159. fs.file-max = 1000000 
    160. vm.swappiness = 10 
    161. fs.inotify.max_user_watches = 10000000 
    162. net.core.wmem_max = 327679 
    163. net.core.rmem_max = 327679 
    164. net.ipv4.conf.all.send_redirects = 0 
    165. net.ipv4.conf.default.send_redirects = 0 
    166. net.ipv4.conf.all.secure_redirects = 0 
    167. net.ipv4.conf.default.secure_redirects = 0 
    168. net.ipv4.conf.all.accept_redirects = 0 
    169. net.ipv4.conf.default.accept_redirects = 0 
    170.  
    171. /sbin/sysctl -p 
    172.  
    173. #自动选择最快的yum源 
    174. yum -y install yum-fastestmirror 
    175.  
    176. #移除系统自带的rpm包的http mysql php 
    177. #yum remove httpd* php* 
    178. yum remove httpd mysql mysql-server php php-cli php-common php-devel php-gd  -y 
    179.  
    180. #升级基础库 
    181. yum install -y wget gcc gcc-c++ openssl* curl curl-devel libxml2 libxml2-devel glibc glibc-devel glib2 glib2-devel gd gd2 gd-devel gd2-devel libaio autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel  
    182.  
    183. #yum安装基础必备环境包,可以先将yum源更换为阿里云的源 
    184. 阿里:http://mirrors.aliyun.com/  
    185. 搜狐:http://mirrors.sohu.com/  
    186. 网易:http://mirrors.163.com/ 
    187.  
    188. #备份原先的yum源信息 
    189. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 
    190.  
    191. #从阿里云镜像站下载centos6的repo 
    192. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo 
    193.  
    194. #最后yum重新生成缓存 
    195. yum makecache 
    196.  
    197. #yum安装软件包(可选) 
    198. yum -y install tar zip unzip openssl* gd gd-devel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel openldap-clients openldap-servers make libmcrypt libmcrypt-devel fontconfig fontconfig-devel libXpm* libtool* libxml2 libxml2-devel t1lib t1lib-devel 
    199.  
    200.  
    201.  
    202. #定义目录结构,下载安装包 
    203. mkdir -p /app/{local,data} 
    204. cd /app/local 
    205.  
    206. #PCRE - Perl Compatible Regular Expressions 
    207. wget "ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.37.tar.gz" 
    208. #Tengine 
    209. wget "http://tengine.taobao.org/download/tengine-2.1.0.tar.gz" 
    210. #MySQL 
    211. wget "https://downloads.mariadb.com/archives/mysql-5.6/mysql-5.6.25-linux-glibc2.5-x86_64.tar.gz" 
    212. #PHP 
    213. wget "http://cn2.php.net/distributions/php-5.6.11.tar.gz" 
    214. #Mhash 
    215. wget "http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz" 
    216. #libmcrypt 
    217. wget "http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz" 
    218. #Mcrypt 
    219. wget "http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.8.tar.gz"

      四、配置Tengine

      1.安装PCRE

      1. tar zxvf pcre-8.37.tar.gz 
      2. cd pcre-8.37 
      3. ./configure 
      4. make && make install 
      5. cd ../ 

      2.安装Tengine

      1. #添加www用户和组 
      2. groupadd www 
      3. useradd -g www www 
      4. #安装Tengine 
      5. tar zxvf tengine-2.1.0.tar.gz 
      6. cd tengine-2.1.0 
      7.  
      8. ./configure --user=www --group=www  
      9. --prefix=/app/local/nginx  
      10. --with-http_stub_status_module  
      11. --with-http_ssl_module  
      12. --with-pcre=/app/local/pcre-8.37 
      13.  
      14. make && make install 
      15. cd ../ 

      3.配置Nginx

      Nginx配置文件的优化很重要,理解每一步的意义。

      1. #修改nginx.conf 
      2. vi /app/local/nginx/conf/nginx.conf 
      3.  
      4. #用户和用户组 
      5. user  www www; 
      6. #工作进程,一般可以按CPU核数设定 
      7. worker_processes  auto; 
      8. worker_cpu_affinity auto; 
      9. #全局错误日志级别 
      10. # [ debug | info | notice | warn | error | crit ] 
      11. error_log  logs/error.log  error; 
      12. #PID文件位置 
      13. pid  logs/nginx.pid; 
      14. #更改worker进程的最大打开文件数限制,避免"too many open files" 
      15. worker_rlimit_nofile 65535; 
      16.  
      17. #events事件指令是设定Nginx的工作模式及连接数上限 
      18. events{ 
      19.      #epoll是Linux首选的高效工作模式 
      20.      use epoll; 
      21.      #告诉nginx收到一个新连接通知后接受尽可能多的连接 
      22.      multi_accept on; 
      23.      #用于定义Nginx每个进程的最大连接数 
      24.      worker_connections      65536; 
      25.  
      26. #HTTP模块控制着nginx http处理的所有核心特性 
      27. http { 
      28.     include       mime.types; 
      29.     #设置文件使用的默认的MIME-type 
      30.     default_type  application/octet-stream; 
      31.      
      32.  
      33.     #对日志格式的设定,main为日志格式别名 
      34.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' 
      35.                       '$status $body_bytes_sent "$http_referer" ' 
      36.                       '"$http_user_agent" "$http_x_forwarded_for"'; 
      37.     #设置nginx是否将存储访问日志。关闭这个选项可以让读取磁盘IO操作更快 
      38.     access_log off; 
      39.     # access_log logs/access.log main buffer=16k; 
      40.  
      41.     #开启gzip压缩,实时压缩输出数据流 
      42.     gzip on; 
      43.     #设置IE6或者更低版本禁用gzip功能 
      44.     gzip_disable "MSIE [1-6]."; 
      45.     #前端的缓存服务器缓存经过gzip压缩的页面 
      46.     gzip_vary on; 
      47.     #允许压缩基于请求和响应的响应流 
      48.     gzip_proxied any; 
      49.     #设置数据的压缩等级 
      50.     gzip_comp_level 4; 
      51.     #设置对数据启用压缩的最少字节数 
      52.     gzip_min_length 1k; 
      53.     #表示申请16个单位为64K的内存作为压缩结果流缓存 
      54.     gzip_buffers 16 64k; 
      55.     #用于设置识别HTTP协议版本 
      56.     gzip_http_version 1.1; 
      57.     #用来指定压缩的类型 
      58.     gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 
      59.       
      60.  
      61.     #打开缓存的同时也指定了缓存最大数目,以及缓存的时间 
      62.     open_file_cache max=200000 inactive=20s; 
      63.     #在open_file_cache中指定检测正确信息的间隔时间 
      64.     open_file_cache_valid 30s; 
      65.     #定义了open_file_cache中指令参数不活动时间期间里最小的文件数 
      66.     open_file_cache_min_uses 2; 
      67.     #指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件 
      68.     open_file_cache_errors on;  
      69.   
      70.     #设置允许客户端请求的最大的单个文件字节数 
      71.     client_max_body_size 30M; 
      72.     #设置客户端请求主体读取超时时间 
      73.     client_body_timeout 10; 
      74.     #设置客户端请求头读取超时时间 
      75.     client_header_timeout 10; 
      76.     #指定来自客户端请求头的headerbuffer大小 
      77.     client_header_buffer_size 32k; 
      78.     #设置客户端连接保持活动的超时时间 
      79.     keepalive_timeout 60; 
      80.     #关闭不响应的客户端连接 
      81.     reset_timedout_connection on; 
      82.     #设置响应客户端的超时时间 
      83.     send_timeout 10; 
      84.     #开启高效文件传输模式 
      85.     sendfile on; 
      86.     #告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送 
      87.     tcp_nopush on; 
      88.     #告诉nginx不要缓存数据,而是一段一段的发送 
      89.     tcp_nodelay on; 
      90.     #设置用于保存各种key(比如当前连接数)的共享内存的参数 
      91.     limit_conn_zone $binary_remote_addr zone=addr:5m;  
      92.     #给定的key设置最大连接数,允许每一个IP地址最多同时打开有100个连接 
      93.     limit_conn addr 100;  
      94.   
      95.     #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度 
      96.     fastcgi_buffers 256 16k; 
      97.     fastcgi_buffer_size 128k; 
      98.     fastcgi_connect_timeout 3s; 
      99.     fastcgi_send_timeout 120s; 
      100.     fastcgi_read_timeout 120s; 
      101.     server_names_hash_bucket_size 128; 
      102.     #不在error_log中记录不存在的错误 
      103.     log_not_found off; 
      104.     #关闭在错误页面中的nginx版本数字,提高安全性 
      105.     #server_tag Apache; 
      106.     server_tokens off; 
      107.     #tengine 
      108.     server_tag off; 
      109.     server_info off; 
      110.  
      111.     #添加虚拟主机的配置文件 
      112.     include vhosts/*.conf; 
      113.  
      114.     #负载均衡配置(暂时略过) 
      115.     #upstream test.com 
      116.  
      117.     #设定虚拟主机配置 
      118.     server { 
      119.         #侦听80端口 
      120.         listen       80; 
      121.         #定义使用localhost访问 
      122.         server_name  localhost; 
      123.         #定义首页索引文件的名称 
      124.         index index.html index.htm index.php; 
      125.         #定义服务器的默认网站根目录位置 
      126.         root    /app/data/localhost/; 
      127.   
      128.         #定义错误提示页面 
      129.         error_page  404              /404.html; 
      130.         error_page  500 502 503 504  /50x.html; 
      131.         location = /50x.html { 
      132.             root   html; 
      133.         } 
      134.   
      135.         #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.      
      136.         location ~ .*.(php|php5)?$ { 
      137.             fastcgi_pass   127.0.0.1:9000; 
      138.             fastcgi_index  index.php; 
      139.             include        fastcgi.conf; 
      140.         } 
      141.          
      142.         #静态文件 
      143.         location ~ .*.(gif|jpg|jpeg|png|bmp|swf|ico)$ 
      144.         { 
      145.             #过期30天,频繁更新可设置小一点 
      146.             expires      30d; 
      147.         } 
      148.   
      149.         location ~ .*.(js|css)?$ 
      150.         { 
      151.             #过期1小时,不更新可设置大一些 
      152.             expires      1h; 
      153.         } 
      154.         #禁止访问 
      155.         location ~ /. { 
      156.             deny all; 
      157.         } 
      158.     } 
      159. }

        简化配置文件

        vi /app/local/nginx/conf/nginx.conf

        1. user  www www; 
        2. worker_processes auto; 
        3. worker_cpu_affinity auto; 
        4.  
        5. error_log  logs/error.log  crit; 
        6. pid        logs/nginx.pid; 
        7.  
        8. worker_rlimit_nofile 51200; 
        9. events 
        10.     use epoll; 
        11.     multi_accept on; 
        12.     worker_connections 51200; 
        13.  
        14. http 
        15.     include       mime.types; 
        16.     default_type  application/octet-stream; 
        17.  
        18.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' 
        19.                       '$status $body_bytes_sent "$http_referer" ' 
        20.                       '"$http_user_agent" "$http_x_forwarded_for"'; 
        21.  
        22.     access_log off; 
        23.     #access_log logs/access.log main buffer=16k; 
        24.  
        25.     server_names_hash_bucket_size 128; 
        26.     client_header_buffer_size 32k; 
        27.     large_client_header_buffers 4 32k; 
        28.     client_max_body_size 50M;  
        29.  
        30.     sendfile on; 
        31.     tcp_nopush on; 
        32.     tcp_nodelay on; 
        33.     keepalive_timeout 60;  
        34.     server_tokens off; 
        35.     server_tag off; 
        36.     server_info off; 
        37.  
        38.     fastcgi_connect_timeout 300; 
        39.     fastcgi_send_timeout 300; 
        40.     fastcgi_read_timeout 300; 
        41.     fastcgi_buffer_size 64k; 
        42.     fastcgi_buffers 4 64k; 
        43.     fastcgi_busy_buffers_size 128k; 
        44.     fastcgi_temp_file_write_size 256k; 
        45.  
        46.     #gzip on; 
        47.     #gzip_min_length  1k; 
        48.     #gzip_buffers     4 16k; 
        49.     #gzip_http_version 1.1; 
        50.     #gzip_comp_level 5; 
        51.     #gzip_types       text/plain application/x-javascript text/css application/xml; 
        52.     #gzip_vary on; 
        53.  
        54.     include vhosts/*.conf; 

        分离server写入vhosts

        mkdir -p /app/local/nginx/conf/vhosts/

        vi /app/local/nginx/conf/vhosts/localhost.conf

        1. server { 
        2.     listen       80; 
        3.     server_name  localhost; 
        4.     index index.php index.html index.htm; 
        5.     access_log  logs/localhost.log  main; 
        6.  
        7.     root    /app/data/localhost/; 
        8.  
        9.     location / { 
        10.         index  index.php index.html index.htm; 
        11.     } 
        12.  
        13.     #error_page  404              /404.html; 
        14.     #error_page  500 502 503 504  /50x.html; 
        15.  
        16.     location = /50x.html { 
        17.         root   html; 
        18.     } 
        19.  
        20.     location ~ .*.(php|php5)?$ { 
        21.         fastcgi_pass   127.0.0.1:9000; 
        22.         fastcgi_index  index.php; 
        23.       #fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
        24.         include        fastcgi.conf; 
        25.     } 
        26.  
        27.     location ~ .*.(gif|jpg|jpeg|png|bmp|swf|ico)$ 
        28.     { 
        29.         expires      30d; 
        30.     } 
        31.  
        32.     location ~ .*.(js|css)?$ 
        33.     { 
        34.         expires      1h; 
        35.     } 
        36.  
        37.     location ~ /. { 
        38.         deny all; 
        39.     } 
        1. #检查语法 
        2. /app/local/nginx/sbin/nginx -t 
        3. # ./nginx -t 
        4. the configuration file /app/local/nginx/conf/nginx.conf syntax is ok 
        5. configuration file /app/local/nginx/conf/nginx.conf test is successful 
        6.  
        7. #测试用例 
        8. mkdir -p /app/data/localhost 
        9. chmod +w /app/data/localhost 
        10. echo "<?php phpinfo();?>" > /app/data/localhost/phpinfo.php 
        11. chown -R www:www /app/data/localhost 
        12.  
        13. #设置nginx系统变量 
        14. echo 'export PATH=$PATH:/app/local/nginx/sbin'>>/etc/profile && source /etc/profile 
        15.  
        16. #测试访问 
        17. curl -I http://localhost 
        18.  
        19. HTTP/1.1 200 OK 
        20. Server: Tengine/2.1.0 
        21. Date: Mon, 27 Jul 2015 06:42:25 GMT 
        22. Content-Type: text/html; charset=UTF-8 
        23. Connection: keep-alive 
        24. X-Powered-By: PHP/5.6.11 

        4.添加Tengine到服务

        配置服务后便于统一管理

        vi /etc/rc.d/init.d/nginx

        1. #!/bin/sh 
        2.   
        3. # Source function library. 
        4. . /etc/rc.d/init.d/functions 
        5.   
        6. # Source networking configuration. 
        7. . /etc/sysconfig/network 
        8.   
        9. Check that networking is up. 
        10. "$NETWORKING" = "no" ] && exit 0 
        11.   
        12. nginx="/app/local/nginx/sbin/nginx" 
        13. prog=$(basename $nginx) 
        14.   
        15. NGINX_CONF_FILE="/app/local/nginx/conf/nginx.conf" 
        16.   
        17. [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx 
        18.   
        19. lockfile=/var/lock/subsys/nginx 
        20.   
        21. make_dirs() { 
        22.    # make required directories 
        23.    user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=([^ ]*).*/1/g' -` 
        24.    if [ -z "`grep $user /etc/passwd`" ]; then 
        25.        useradd -M -s /bin/nologin $user 
        26.    fi 
        27.    options=`$nginx -V 2>&1 | grep 'configure arguments:'` 
        28.    for opt in $options; do 
        29.        if [ `echo $opt | grep '.*-temp-path'` ]; then 
        30.            value=`echo $opt | cut -d "=" -f 2` 
        31.            if [ ! -d "$value" ]; then 
        32.                # echo "creating" $value 
        33.                mkdir -p $value && chown -R $user $value 
        34.            fi 
        35.        fi 
        36.    done 
        37.   
        38. start() { 
        39.     [ -x $nginx ] || exit 5 
        40.     [ -f $NGINX_CONF_FILE ] || exit 6 
        41.     make_dirs 
        42.     echo -n $"Starting $prog: " 
        43.     daemon $nginx -c $NGINX_CONF_FILE 
        44.     retval=$? 
        45.     echo 
        46.     [ $retval -eq 0 ] && touch $lockfile 
        47.     return $retval 
        48.   
        49. stop() { 
        50.     echo -n $"Stopping $prog: " 
        51.     killproc $prog -QUIT 
        52.     retval=$? 
        53.     echo 
        54.     [ $retval -eq 0 ] && rm -f $lockfile 
        55.     return $retval 
        56.   
        57. restart() { 
        58.     configtest || return $? 
        59.     stop 
        60.     sleep 1 
        61.     start 
        62.   
        63. reload() { 
        64.     configtest || return $? 
        65.     echo -n $"Reloading $prog: " 
        66.     killproc $nginx -HUP 
        67.     RETVAL=$? 
        68.     echo 
        69.   
        70. force_reload() { 
        71.     restart 
        72.   
        73. configtest() { 
        74.   $nginx -t -c $NGINX_CONF_FILE 
        75.   
        76. rh_status() { 
        77.     status $prog 
        78.   
        79. rh_status_q() { 
        80.     rh_status >/dev/null 2>&1 
        81.   
        82. case "$1" in 
        83.     start) 
        84.         rh_status_q && exit 0 
        85.         $1 
        86.         ;; 
        87.     stop) 
        88.         rh_status_q || exit 0 
        89.         $1 
        90.         ;; 
        91.     restart|configtest) 
        92.         $1 
        93.         ;; 
        94.     reload) 
        95.         rh_status_q || exit 7 
        96.         $1 
        97.         ;; 
        98.     force-reload) 
        99.         force_reload 
        100.         ;; 
        101.     status) 
        102.         rh_status 
        103.         ;; 
        104.     condrestart|try-restart) 
        105.         rh_status_q || exit 0 
        106.             ;; 
        107.     *) 
        108.         echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" 
        109.         exit 2 
        110. esac

          五、安装MySQL

          注意目录和字符集等配置文件

          1. #解压mysql 
          2. mkdir -p /app/local/mysql 
          3. tar zxvf mysql-5.6.25-linux-glibc2.5-x86_64.tar.gz 
          4. mv mysql-5.6.25-linux-glibc2.5-x86_64/* /app/local/mysql 
          5. #增加mysql用户组 
          6. groupadd mysql 
          7. useradd -g mysql mysql 
          8. mkdir -p /app/data/mysql/data/ 
          9. mkdir -p /app/data/mysql/binlog/ 
          10. mkdir -p /app/data/mysql/relaylog/ 
          11. chown -R mysql:mysql /app/data/mysql/ 
          12.  #安装mysql 
          13. /app/local/mysql/scripts/mysql_install_db --basedir=/app/local/mysql --datadir=/app/data/mysql/data --user=mysql 
          14. #修改mysqld_safe配置路径 
          15. sed -i "s#/usr/local/mysql#/app/local/mysql#g" /app/local/mysql/bin/mysqld_safe 
          1. #修改my.cnf配置文件 
          2. vi /app/local/mysql/my.cnf 
          3.  
          4. [client] 
          5. character-set-server = utf8 
          6. port = 3306 
          7. socket = /tmp/mysql.sock 
          8.  
          9. [mysql] 
          10. #prompt="(u:HOSTNAME:)[d]> " 
          11. prompt="u@h R:m:s [d]> " 
          12. no-auto-rehash 
          13.  
          14. [mysqld] 
          15. server-id = 1 
          16. port = 3306 
          17. user = mysql 
          18. basedir = /app/local/mysql 
          19. datadir = /app/data/mysql/data 
          20. socket = /tmp/mysql.sock 
          21. log-error = /app/data/mysql/mysql_error.log 
          22. pid-file = /app/data/mysql/mysql.pid 
          23. sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
          24.  
          25. default-storage-engine = InnoDB 
          26. max_connections = 512 
          27. max_connect_errors = 100000 
          28. table_open_cache = 512 
          29. external-locking = FALSE 
          30. max_allowed_packet = 32M 
          31. slow_query_log = 1 
          32. slow_query_log_file = /app/data/mysql/slow.log 
          33.  
          34. open_files_limit = 10240 
          35. back_log = 600 
          36. join_buffer_size = 2M 
          37. read_rnd_buffer_size = 16M 
          38. sort_buffer_size = 2M 
          39. thread_cache_size = 300 
          40. query_cache_size = 128M 
          41. query_cache_limit = 2M 
          42. query_cache_min_res_unit = 2k 
          43. thread_stack = 192K 
          44. transaction_isolation = READ-COMMITTED 
          45. tmp_table_size = 246M 
          46. max_heap_table_size = 246M 
          47. long_query_time = 3 
          48. log-slave-updates 
          49. log-bin = /app/data/mysql/binlog/binlog 
          50. sync_binlog = 1 
          51. binlog_cache_size = 4M 
          52. binlog_format = MIXED 
          53. max_binlog_cache_size = 8M 
          54. max_binlog_size = 1G 
          55. relay-log-index = /app/data/mysql/relaylog/relaylog 
          56. relay-log-info-file = /app/data/mysql/relaylog/relaylog 
          57. relay-log = /app/data/mysql/relaylog/relaylog 
          58. expire_logs_days = 7 
          59. key_buffer_size = 128M 
          60. read_buffer_size = 1M 
          61. read_rnd_buffer_size = 16M 
          62. bulk_insert_buffer_size = 64M 
          63. myisam_sort_buffer_size = 128M 
          64. myisam_max_sort_file_size = 10G 
          65. myisam_repair_threads = 1 
          66. myisam_recover 
          67.  
          68. innodb_additional_mem_pool_size = 16M 
          69. innodb_buffer_pool_size = 256M 
          70. innodb_data_file_path = ibdata1:1024M:autoextend 
          71. innodb_flush_log_at_trx_commit = 1 
          72. innodb_log_buffer_size = 16M 
          73. innodb_log_file_size = 256M 
          74. innodb_log_files_in_group = 2 
          75. innodb_max_dirty_pages_pct = 50 
          76. innodb_file_per_table = 1 
          77. innodb_locks_unsafe_for_binlog = 0 
          78.  
          79. interactive_timeout = 120 
          80. wait_timeout = 120 
          81.   
          82. skip-name-resolve 
          83. slave-skip-errors = 1032,1062,126,1114,1146,1048,1396 
          84.  
          85. [mysqldump] 
          86. quick 
          87. max_allowed_packet = 32M 
          1. #添加mysql到服务 
          2. vi /etc/rc.d/init.d/mysqld 
          3.  
          4. #!/bin/sh 
          5. basedir=/app/local/mysql 
          6. datadir=/app/data/mysql/data 
          7. service_startup_timeout=900 
          8. lockdir='/var/lock/subsys' 
          9. lock_file_path="$lockdir/mysql" 
          10. mysqld_pid_file_path=/app/data/mysql/mysql.pid 
          11. if test -z "$basedir" 
          12. then 
          13.   basedir=/usr/local/mysql 
          14.   bindir=/usr/local/mysql/bin 
          15.   if test -z "$datadir" 
          16.   then 
          17.     datadir=/usr/local/mysql/data 
          18.   fi 
          19.   sbindir=/usr/local/mysql/bin 
          20.   libexecdir=/usr/local/mysql/bin 
          21. else 
          22.   bindir="$basedir/bin" 
          23.   if test -z "$datadir" 
          24.   then 
          25.     datadir="$basedir/data" 
          26.   fi 
          27.   sbindir="$basedir/sbin" 
          28.   libexecdir="$basedir/libexec" 
          29. fi 
          30. datadir_set= 
          31. lsb_functions="/lib/lsb/init-functions" 
          32. if test -f $lsb_functions ; then 
          33.   . $lsb_functions 
          34. else 
          35.   log_success_msg() 
          36.   { 
          37.     echo " SUCCESS! $@" 
          38.   } 
          39.   log_failure_msg() 
          40.   { 
          41.     echo " ERROR! $@" 
          42.   } 
          43. fi 
          44.   
          45. PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin" 
          46. export PATH 
          47.   
          48. mode=$1    # start or stop 
          49.   
          50. [ $# -ge 1 ] && shift 
          51.   
          52.   
          53. other_args="$*"   # uncommon, but needed when called from an RPM upgrade action 
          54.            # Expected: "--skip-networking --skip-grant-tables" 
          55.            # They are not checked here, intentionally, as it is the resposibility 
          56.            # of the "spec" file author to give correct arguments only. 
          57.   
          58. case `echo "testingc"`,`echo -n testing` in 
          59.     *c*,-n*) echo_n=   echo_c=     ;; 
          60.     *c*,*)   echo_n=-n echo_c=     ;; 
          61.     *)       echo_n=   echo_c='c' ;; 
          62. esac 
          63.   
          64. parse_server_arguments() { 
          65.   for arg do 
          66.     case "$arg" in 
          67.       --basedir=*)  basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` 
          68.                     bindir="$basedir/bin" 
          69.             if test -z "$datadir_set"; then 
          70.               datadir="$basedir/data" 
          71.             fi 
          72.             sbindir="$basedir/sbin" 
          73.             libexecdir="$basedir/libexec" 
          74.         ;; 
          75.       --datadir=*)  datadir=`echo "$arg" | sed -e 's/^[^=]*=//'` 
          76.             datadir_set=1 
          77.     ;; 
          78.       --pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; 
          79.       --service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; 
          80.     esac 
          81.   done 
          82.   
          83. wait_for_pid () { 
          84.   verb="$1"           # created | removed 
          85.   pid="$2"            # process ID of the program operating on the pid-file 
          86.   pid_file_path="$3" # path to the PID file. 
          87.   
          88.   i=0 
          89.   avoid_race_condition="by checking again" 
          90.   
          91.   while test $i -ne $service_startup_timeout ; do 
          92.   
          93.     case "$verb" in 
          94.       'created') 
          95.         # wait for a PID-file to pop into existence. 
          96.         test -s "$pid_file_path" && i='' && break 
          97.         ;; 
          98.       'removed') 
          99.         # wait for this PID-file to disappear 
          100.         test ! -s "$pid_file_path" && i='' && break 
          101.         ;; 
          102.       *) 
          103.         echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path" 
          104.         exit 1 
          105.         ;; 
          106.     esac 
          107.   
          108.     # if server isn't running, then pid-file will never be updated 
          109.     if test -n "$pid"; then 
          110.       if kill -0 "$pid" 2>/dev/null; then 
          111.         :  # the server still runs 
          112.       else 
          113.         # The server may have exited between the last pid-file check and now.   
          114.         if test -n "$avoid_race_condition"; then 
          115.           avoid_race_condition="" 
          116.           continue  # Check again. 
          117.         fi 
          118.   
          119.         # there's nothing that will affect the file. 
          120.         log_failure_msg "The server quit without updating PID file ($pid_file_path)." 
          121.         return 1  # not waiting any more. 
          122.       fi 
          123.     fi 
          124.   
          125.     echo $echo_n ".$echo_c" 
          126.     i=`expr $i + 1` 
          127.     sleep 1 
          128.   
          129.   done 
          130.   
          131.   if test -z "$i" ; then 
          132.     log_success_msg 
          133.     return 0 
          134.   else 
          135.     log_failure_msg 
          136.     return 1 
          137.   fi 
          138.   
          139. # Get arguments from the my.cnf file, 
          140. # the only group, which is read from now on is [mysqld] 
          141. if test -x ./bin/my_print_defaults 
          142. then 
          143.   print_defaults="./bin/my_print_defaults" 
          144. elif test -x $bindir/my_print_defaults 
          145. then 
          146.   print_defaults="$bindir/my_print_defaults" 
          147. elif test -x $bindir/mysql_print_defaults 
          148. then 
          149.   print_defaults="$bindir/mysql_print_defaults" 
          150. else 
          151.   # Try to find basedir in /etc/my.cnf 
          152.   conf=/etc/my.cnf 
          153.   print_defaults= 
          154.   if test -r $conf 
          155.   then 
          156.     subpat='^[^=]*basedir[^=]*=(.*)$' 
          157.     dirs=`sed -e "/$subpat/!d" -e 's//1/' $conf` 
          158.     for d in $dirs 
          159.     do 
          160.       d=`echo $d | sed -e 's/[     ]//g'` 
          161.       if test -x "$d/bin/my_print_defaults" 
          162.       then 
          163.         print_defaults="$d/bin/my_print_defaults" 
          164.         break 
          165.       fi 
          166.       if test -x "$d/bin/mysql_print_defaults" 
          167.       then 
          168.         print_defaults="$d/bin/mysql_print_defaults" 
          169.         break 
          170.       fi 
          171.     done 
          172.   fi 
          173.   
          174.   # Hope it's in the PATH ... but I doubt it 
          175.   test -z "$print_defaults" && print_defaults="my_print_defaults" 
          176. fi 
          177.   
          178. Read defaults file from 'basedir'.   If there is no defaults file there 
          179. check if it's in the old (depricated) place (datadir) and read it from there 
          180.   
          181. extra_args="" 
          182. if test -r "$basedir/my.cnf" 
          183. then 
          184.   extra_args="-e $basedir/my.cnf" 
          185. else 
          186.   if test -r "$datadir/my.cnf" 
          187.   then 
          188.     extra_args="-e $datadir/my.cnf" 
          189.   fi 
          190. fi 
          191.   
          192. parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server` 
          193.   
          194. Set pid file if not given 
          195. if test -z "$mysqld_pid_file_path" 
          196. then 
          197.   mysqld_pid_file_path=$datadir/`hostname`.pid 
          198. else 
          199.   case "$mysqld_pid_file_path" in 
          200.     /* ) ;; 
          201.     * )  mysqld_pid_file_path="$datadir/$mysqld_pid_file_path" ;; 
          202.   esac 
          203. fi 
          204.   
          205. case "$mode" in 
          206.   'start') 
          207.     # Start daemon 
          208.   
          209.     # Safeguard (relative paths, core dumps..) 
          210.     cd $basedir 
          211.   
          212.     echo $echo_n "Starting MySQL" 
          213.     if test -x $bindir/mysqld_safe 
          214.     then 
          215.       # Give extra arguments to mysqld with the my.cnf file. This script 
          216.       # may be overwritten at next upgrade. 
          217.       $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 & 
          218.       wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$? 
          219.   
          220.       # Make lock for RedHat / SuSE 
          221.       if test -w "$lockdir" 
          222.       then 
          223.         touch "$lock_file_path" 
          224.       fi 
          225.   
          226.       exit $return_value 
          227.     else 
          228.       log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)" 
          229.     fi 
          230.     ;; 
          231.   
          232.   'stop') 
          233.     # Stop daemon. We use a signal here to avoid having to know the 
          234.     # root password. 
          235.   
          236.     if test -s "$mysqld_pid_file_path" 
          237.     then 
          238.       mysqld_pid=`cat "$mysqld_pid_file_path"` 
          239.   
          240.       if (kill -0 $mysqld_pid 2>/dev/null) 
          241.       then 
          242.         echo $echo_n "Shutting down MySQL" 
          243.         kill $mysqld_pid 
          244.         # mysqld should remove the pid file when it exits, so wait for it. 
          245.         wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$? 
          246.       else 
          247.         log_failure_msg "MySQL server process #$mysqld_pid is not running!" 
          248.         rm "$mysqld_pid_file_path" 
          249.       fi 
          250.   
          251.       # Delete lock for RedHat / SuSE 
          252.       if test -f "$lock_file_path" 
          253.       then 
          254.         rm -f "$lock_file_path" 
          255.       fi 
          256.       exit $return_value 
          257.     else 
          258.       log_failure_msg "MySQL server PID file could not be found!" 
          259.     fi 
          260.     ;; 
          261.   
          262.   'restart') 
          263.     # Stop the service and regardless of whether it was 
          264.     # running or not, start it again. 
          265.     if $0 stop  $other_args; then 
          266.       $0 start $other_args 
          267.     else 
          268.       log_failure_msg "Failed to stop running server, so refusing to try to start." 
          269.       exit 1 
          270.     fi 
          271.     ;; 
          272.   
          273.   'reload'|'force-reload') 
          274.     if test -s "$mysqld_pid_file_path" ; then 
          275.       read mysqld_pid <  "$mysqld_pid_file_path" 
          276.       kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL" 
          277.       touch "$mysqld_pid_file_path" 
          278.     else 
          279.       log_failure_msg "MySQL PID file could not be found!" 
          280.       exit 1 
          281.     fi 
          282.     ;; 
          283.   'status') 
          284.     # First, check to see if pid file exists 
          285.     if test -s "$mysqld_pid_file_path" ; then  
          286.       read mysqld_pid < "$mysqld_pid_file_path" 
          287.       if kill -0 $mysqld_pid 2>/dev/null ; then  
          288.         log_success_msg "MySQL running ($mysqld_pid)" 
          289.         exit 0 
          290.       else 
          291.         log_failure_msg "MySQL is not running, but PID file exists" 
          292.         exit 1 
          293.       fi 
          294.     else 
          295.       # Try to find appropriate mysqld process 
          296.       mysqld_pid=`pidof $libexecdir/mysqld` 
          297.   
          298.       # test if multiple pids exist 
          299.       pid_count=`echo $mysqld_pid | wc -w` 
          300.       if test $pid_count -gt 1 ; then 
          301.         log_failure_msg "Multiple MySQL running but PID file could not be found ($mysqld_pid)" 
          302.         exit 5 
          303.       elif test -z $mysqld_pid ; then  
          304.         if test -f "$lock_file_path" ; then  
          305.           log_failure_msg "MySQL is not running, but lock file ($lock_file_path) exists" 
          306.           exit 2 
          307.         fi  
          308.         log_failure_msg "MySQL is not running" 
          309.         exit 3 
          310.       else 
          311.         log_failure_msg "MySQL is running but PID file could not be found" 
          312.         exit 4 
          313.       fi 
          314.     fi 
          315.     ;; 
          316.     *) 
          317.       # usage 
          318.       basename=`basename "$0"` 
          319.       echo "Usage: $basename  {start|stop|restart|reload|force-reload|status}  [ MySQL server options ]" 
          320.       exit 1 
          321.     ;; 
          322. esac 
          323.   
          324. exit 0 
          1. #修改权限 
          2. chmod +x /etc/init.d/mysqld 
          3. service mysqld start 
          4.  
          5. #增加MySQL系统环境变量 
          6. echo 'export PATH=$PATH:/app/local/mysql/bin'>>/etc/profile && source /etc/profile 
          7.  
          8. #查看错误日志 
          9. tail -f /var/log/mysqld.log  
          10.  
          11. #用root账户登录并作简单的安全设置 
          12. /app/local/mysql/bin/mysql -uroot -p 
          1. #修改root密码 
          2. UPDATE mysql.user SET Password=password('root') WHERE User='root'; 
          3.  
          4. #删除无名用户 
          5. DELETE FROM mysql.user WHERE User=''; 
          6.  
          7. #删除root远程访问 
          8. DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); 
          9.  
          10. #删除“test”数据库 
          11. DROP database test; 
          12.  
          13. #允许远程访问 
          14. /app/local/mysql/bin/mysql -uroot -proot 
          15.  
          16. use mysql; 
          17. update user set host='%' where user='root' AND host='localhost'; 
          18. FLUSH PRIVILEGES; 
          19. select host, user from user; 
          20.  
          21. #立即生效并退出MYSQL命令窗体 
          22. FLUSH PRIVILEGES;QUIT;

            六、安装Apache

            1. cd /app/local 
            2. tar zxvf httpd-2.2.29.tar.gz 
            3. cd httpd-2.2.29 
            4.  
            5. ./configure --prefix=/app/local/apache  
            6. --enable-so  
            7. --enable-rewrite  
            8. --enable-modes-shared=most 
            9.  
            10. make && make install  
            11.  
            12. vi /app/local/apache/conf/httpd.conf 
            13.  
            14. #修改主机名 
            15. ServerName localhost:80 
            16. #查找AddType application/x-gzip .gz .tgz,在该行下面添加 
            17. AddType application/x-httpd-php .php 
            18. #查找DirectoryIndex index.html 把该行修改成 
            19. DirectoryIndex index.html index.htm index.php 
            20.  
            21. /app/local/apache/bin/apachectl -t 
            22. cp /app/local/apache/bin/apachectl /etc/init.d/httpd 

            七、安装PHP

            1.PHP基础环境

            1. #yum安装或者使用下面源包编译安装 
            2. yum install libmcrypt libmcrypt-devel mcrypt mhash 
            3.  
            4. #下载地址 
            5. http://sourceforge.net/projects/mcrypt/files/Libmcrypt/ 
            6. http://sourceforge.net/projects/mcrypt/files/MCrypt/ 
            7. http://sourceforge.net/projects/mhash/files/mhash/ 
            8.  
            9. #安装Libmcrypt 
            10. tar -zxvf libmcrypt-2.5.8.tar.gz 
            11. cd libmcrypt-2.5.8 
            12. ./configure 
            13. make && make install 
            14. cd ../ 
            15.  
            16. 3.安装mhash 
            17.  
            18. tar -zxvf mhash-0.9.9.9.tar.gz 
            19. cd mhash-0.9.9.9 
            20. ./configure 
            21. make && make install 
            22. cd ../ 
            23.  
            24. 4.安装mcrypt 
            25.  
            26. tar -zxvf mcrypt-2.6.8.tar.gz 
            27. cd mcrypt-2.6.8 
            28. LD_LIBRARY_PATH=/usr/local/lib ./configure 
            29. make && make install 
            30. cd ../ 
            31.  
            32. ### 安装PHP 
            33.  
            34. >extension根据需要定制,新增的OPcache建议暂时不要开启 
            35.  
            36. ``` bash 
            37. tar zxvf php-5.5.27.tar.gz 
            38. cd php-5.5.27 
            39.  
            40. ./configure --prefix=/app/local/php  
            41. --with-config-file-path=/app/local/php/etc  
            42. --enable-fpm  
            43. --enable-mbstring  
            44. --with-mhash  
            45. --with-mcrypt  
            46. --with-curl  
            47. --with-openssl  
            48. --with-mysql=mysqlnd  
            49. --with-mysqli=mysqlnd  
            50. --with-pdo-mysql=mysqlnd  
            51. --with-apxs2=/app/local/apache/bin/apxs  
            52. #--enable-opcache 
            53.  
            54. make && make install 
            55.  
            56. #配置php.ini 
            57. cp php.ini-development /app/local/php/etc/php.ini 
            58.  
            59. #设置时区 
            60. sed -i "s#;date.timezone =#date.timezone = Asia/Shanghai#g" /app/local/php/etc/php.ini 
            61. #防止nginx文件类型错误解析漏洞 
            62. sed -i "s#;cgi.fix_pathinfo=1#cgi.fix_pathinfo=0#g" /app/local/php/etc/php.ini 
            63. #禁止显示php版本的信息 
            64. sed -i "s#expose_php = On#expose_php = Off#g" /app/local/php/etc/php.ini 
            65. #禁用危险函数(可选) 
            66. #sed -i "s#disable_functions =#disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source#g" /app/local/php/etc/php.ini 
            67.  
            68. #enable-opcache后设置(可选) 
            69. [OPcache] 
            70. zend_extension = opcache.so 
            71. opcache.enable=1 
            72. opcache.memory_consumption = 64 
            73. opcache.interned_strings_buffer = 8 
            74. opcache.max_accelerated_files = 4000 
            75. opcache.revalidate_freq = 60 
            76. opcache.fast_shutdown = 1 
            77. opcache.enable_cli = 1

              2.配置php-fpm

              1. #编辑php-fpm 
              2. cp /app/local/php/etc/php-fpm.conf.default /app/local/php/etc/php-fpm.conf 
              3. vi /app/local/php/etc/php-fpm.conf 
              4.  
              5. [global] 
              6. ;错误日志 
              7. error_log = log/php-fpm.log 
              8. ;错误日志级别 
              9. log_level = notice 
              10. [www] 
              11. ;php-fpm监听端口 
              12. listen = 127.0.0.1:9000 
              13. ;启动进程的帐户和组 
              14. user = www 
              15. group = www 
              16. ;如果选择static,则由pm.max_children指定固定的子进程数。如果选择dynamic,则由后面3个参数动态决定 
              17. pm = dynamic 
              18. ;子进程最大数 
              19. pm.max_children = 384 
              20. ;启动时的进程数 
              21. pm.start_servers = 20 
              22. ;保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程 
              23. pm.min_spare_servers = 5 
              24. ;保证空闲进程数最大值,如果空闲进程大于此值,此进行清理 
              25. pm.max_spare_servers = 35 
              26.  
              27. ;设置每个子进程重生之前服务的请求数。对于可能存在内存泄漏的第三方模块来说是非常有用的。如果设置为 '0' 则一直接受请求。等同于 PHP_FCGI_MAX_REQUESTS 环境变量。默认值: 0。 
              28. pm.max_requests = 1000 
              29. ;每个子进程闲置多长时间就自杀 
              30. pm.process_idle_timeout = 10s 
              31. ;设置单个请求的超时中止时间。该选项可能会对php.ini设置中的'max_execution_time'因为某些特殊原因没有中止运行的脚本有用。设置为 '0' 表示 'Off'.当经常出现502错误时可以尝试更改此选项。 
              32. request_terminate_timeout = 120 
              33. ;当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中。设置为 '0' 表示 'Off' 
              34. request_slowlog_timeout = 3s 
              35. ;慢请求的记录日志,配合request_slowlog_timeout使用 
              36. slowlog = /app/local/php/var/log/php-fpm.slow.log 
              37. ;设置文件打开描述符的rlimit限制。默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。 
              38. rlimit_files = 65535 
              1. #设置php环境变量 
              2. echo 'export PATH=$PATH:/app/local/php/bin'>>/etc/profile && source /etc/profile 
              3. touch /app/local/php/var/log/php-fpm.slow.log 
              4.  
              5. #添加php-fpm服务 
              6. cp /app/local/php-5.5.27/sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm 
              7. chmod +x /etc/rc.d/init.d/php-fpm 
              8. service php-fpm start 
              9.  
              10. #设置开机自动启动服务 
              11. vi /etc/rc.local 
              12.  
              13. ulimit -SHn 65535 
              14. service php-fpm start 
              15. service nginx start 
              16. service mysqld start 

              3.配置memcache/mongo/redis

              其它extension扩展都可以动态添加,没事的

              1. #memcache 
              2. cd /app/local 
              3. tar zxvf memcache-3.0.8.tgz 
              4. cd memcache-3.0.8 
              5. /app/local/php/bin/phpize 
              6. ./configure --enable-memcache  
              7. --with-php-config=/app/local/php/bin/php-config  
              8. --with-zlib-dir 
              9. make && make install 
              10.  
              11. #mongo 
              12. cd /app/local 
              13. tar zxvf mongo-1.6.10.tgz 
              14. cd mongo-1.6.10 
              15. /app/local/php/bin/phpize 
              16. ./configure --with-php-config=/app/local/php/bin/php-config 
              17. make && make install 
              18.  
              19. #redis 
              20. cd /app/local 
              21. tar zxvf redis-2.2.7.tgz 
              22. cd redis-2.2.7 
              23. /app/local/php/bin/phpize 
              24. ./configure --with-php-config=/app/local/php/bin/php-config 
              25. make && make install 
              26.  
              27. #php.ini 
              28. vi /app/local/php/etc/php.ini   
              29.  
              30. [memcached]   
              31. extension=memcached.so 
              32. [mongodb]   
              33. extension=mongo.so  
              34. [redis]   
              35. extension=redis.so  
              36.  
              37. #重启生效 
              38. service php-fpm restart 
              39. php -i | grep php.ini 
              40. php -m 

              八、自动化部署

              服务器的上传目录可以自定义,安装目录默认统一修改为/app/{local,data},执行脚本为web.sh。

              1. file://E:QQDownloadLTMP     (2 folders, 5 files, 27.66 MB, 30.76 MB in total.) 
              2. │  httpd-2.2.29.tar.gz     7.19 MB 
              3. │  pcre-8.37.tar.gz     1.95 MB 
              4. │  php-5.5.27.tar.gz     16.95 MB 
              5. │  tengine-2.1.0.tar.gz     1.58 MB 
              6. │  web.sh     4.10 KB 
              7. ├─init     (1 folders, 12 files, 91.42 KB, 92.23 KB in total.) 
              8. │  │  allow.conf     35 bytes 
              9. │  │  bashrc     2.99 KB 
              10. │  │  deny.conf     35 bytes 
              11. │  │  limits.conf     1.86 KB 
              12. │  │  my.cnf     1.99 KB 
              13. │  │  mysqld     8.39 KB 
              14. │  │  nginx     2.22 KB 
              15. │  │  nginx.conf     1.34 KB 
              16. │  │  php-fpm     2.30 KB 
              17. │  │  php-fpm.conf     416 bytes 
              18. │  │  php.ini     67.83 KB 
              19. │  │  sysctl.conf     2.03 KB 
              20. │  └─vhosts     (0 folders, 1 files, 826 bytes, 826 bytes in total.) 
              21. │          localhost.conf     826 bytes 
              22. └─src     (0 folders, 6 files, 3.01 MB, 3.01 MB in total.) 
              23.         libmcrypt-2.5.8.tar.gz     1.27 MB 
              24.         mcrypt-2.6.8.tar.gz     460.85 KB 
              25.         memcache-3.0.8.tgz     68.87 KB 
              26.         mhash-0.9.9.9.tar.gz     909.61 KB 
              27.         mongo-1.6.10.tgz     204.19 KB 
              28.         redis-2.2.7.tgz     131.19 KB 
              29.  
              30.  
              31. #web.sh 
              32.  
              33. #!/bin/bash 
              34.  
              35. ## alias 
              36. ltmp_local=$(cd "$(dirname "$0")"; pwd) 
              37. mkdir -p /app/{local,data} 
              38. unalias cp 
              39. ltmp_init=$ltmp_local/init/ 
              40. ltmp_src=$ltmp_local/src/ 
              41.  
              42. ## system 
              43.  
              44. #history 
              45. cp ${ltmp_init}bashrc /etc/ 
              46. #time 
              47. rm -rf /etc/localtime 
              48. ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
              49. #maildrop 
              50. sed 's/MAILTO=root/MAILTO=""/g' /etc/crontab 
              51. service crond restart 
              52. #selinux 
              53. setenforce 0 
              54. sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 
              55. #limits 
              56. echo ulimit -SHn 65535 >> /etc/profile 
              57. source /etc/profile 
              58. cp ${ltmp_init}limits.conf /etc/security/ 
              59. #tcp 
              60. cp ${ltmp_init}sysctl.conf  /etc/ 
              61. #yum 
              62. yum -y install yum-fastestmirror 
              63. yum remove httpd mysql mysql-server php php-cli php-common php-devel php-gd  -y 
              64. yum install -y wget gcc gcc-c++ openssl* curl curl-devel libxml2 libxml2-devel glibc glibc-devel glib2 glib2-devel gd gd2 gd-devel gd2-devel libaio autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel 
              65. #download 
              66.  
              67. cd /app/local 
              68. ##PCRE - Perl Compatible Regular Expressions 
              69. #wget "ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.37.tar.gz" 
              70. ##Tengine 
              71. #wget "http://tengine.taobao.org/download/tengine-2.1.0.tar.gz" 
              72. ##MySQL 
              73. #wget "https://downloads.mariadb.com/archives/mysql-5.6/mysql-5.6.25-linux-glibc2.5-x86_64.tar.gz" 
              74. ##PHP 
              75. #wget "http://cn2.php.net/distributions/php-5.6.11.tar.gz" 
              76. ##Mhash 
              77. #wget "http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz" 
              78. ##libmcrypt 
              79. #wget "http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz" 
              80. ##Mcrypt 
              81. #wget "http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.8.tar.gz" 
              82.  
              83. ## soft 
              84. cd $ltmp_local 
              85. #pcre 
              86. tar zxvf pcre-8.37.tar.gz 1> /dev/null 
              87. cd pcre-8.37 
              88. ./configure 
              89. make && make install 
              90. cd ../ 
              91. #tengine 
              92. groupadd www 
              93. useradd -g www www 
              94. #安装Tengine 
              95. cd $ltmp_local 
              96. tar zxvf tengine-2.1.0.tar.gz 1> /dev/null 
              97. cd tengine-2.1.0 
              98. ./configure --user=www --group=www  
              99. --prefix=/app/local/nginx  
              100. --with-http_stub_status_module  
              101. --with-http_ssl_module  
              102. --with-pcre=${ltmp_local}/pcre-8.37 
              103. make && make install 
              104. cd ../ 
              105. #nginx config 
              106. cd $ltmp_local 
              107. cp ${ltmp_init}nginx.conf /app/local/nginx/conf/ 
              108. cp -r ${ltmp_init}vhosts /app/local/nginx/conf/ 
              109. mkdir -p /app/data/localhost 
              110. chmod +w /app/data/localhost 
              111. echo "<?php phpinfo();?>" > /app/data/localhost/phpinfo.php 
              112. chown -R www:www /app/data/localhost 
              113. echo 'export PATH=$PATH:/app/local/nginx/sbin'>>/etc/profile && source /etc/profile 
              114. cp ${ltmp_init}nginx /etc/rc.d/init.d/ 
              115. chmod +x /etc/init.d/nginx 
              116. ulimit -SHn 65535 
              117. service nginx start 
              118. #libmcrypt 
              119. cd $ltmp_src 
              120. tar -zxvf libmcrypt-2.5.8.tar.gz 1> /dev/null 
              121. cd libmcrypt-2.5.8 
              122. ./configure 
              123. make && make install 
              124. cd ../ 
              125. #mhash 
              126. cd $ltmp_src 
              127. tar -zxvf mhash-0.9.9.9.tar.gz 1> /dev/null 
              128. cd mhash-0.9.9.9 
              129. ./configure 
              130. make && make install 
              131. cd ../ 
              132. #mcrypt 
              133. cd $ltmp_src 
              134. tar -zxvf mcrypt-2.6.8.tar.gz 1> /dev/null 
              135. cd mcrypt-2.6.8 
              136. LD_LIBRARY_PATH=/usr/local/lib ./configure 
              137. make && make install 
              138. cd ../ 
              139. #php 
              140. cd $ltmp_local 
              141. tar zxvf php-5.5.27.tar.gz 1> /dev/null 
              142. cd php-5.5.27 
              143. ./configure --prefix=/app/local/php  
              144. --with-config-file-path=/app/local/php/etc  
              145. --enable-fpm  
              146. --enable-mbstring  
              147. --with-mhash  
              148. --with-mcrypt  
              149. --with-curl  
              150. --with-openssl  
              151. --with-mysql=mysqlnd  
              152. --with-mysqli=mysqlnd  
              153. --with-pdo-mysql=mysqlnd 
              154. make && make install 
              155. #memcache 
              156. cd $ltmp_src 
              157. tar zxvf memcache-3.0.8.tgz  1> /dev/null 
              158. cd memcache-3.0.8 
              159. /app/local/php/bin/phpize 
              160. ./configure --enable-memcache  
              161. --with-php-config=/app/local/php/bin/php-config  
              162. --with-zlib-dir 
              163. make && make install 
              164. #mongo 
              165. cd $ltmp_src 
              166. tar zxvf mongo-1.6.10.tgz  1> /dev/null 
              167. cd mongo-1.6.10 
              168. /app/local/php/bin/phpize 
              169. ./configure --with-php-config=/app/local/php/bin/php-config 
              170. make && make install 
              171. #redis 
              172. cd $ltmp_src 
              173. #redis 
              174. tar zxvf redis-2.2.7.tgz  1> /dev/null 
              175. cd redis-2.2.7 
              176. /app/local/php/bin/phpize 
              177. ./configure --with-php-config=/app/local/php/bin/php-config 
              178. make && make install 
              179. #php-fpm 
              180. cp ${ltmp_init}php.ini /app/local/php/etc/ 
              181. cp ${ltmp_init}php-fpm.conf /app/local/php/etc/ 
              182. echo 'export PATH=$PATH:/app/local/php/bin'>>/etc/profile && source /etc/profile 
              183. touch /app/local/php/var/log/php-fpm.slow.log 
              184. cp ${ltmp_local}/php-5.5.27/sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm 
              185. chmod +x /etc/rc.d/init.d/php-fpm 
              186. service php-fpm start
原文地址:https://www.cnblogs.com/swordxia/p/4709905.html