标签归档:服务器

一键安装LAMP和LNMP

2017-06-02 我更新了

重新整理编写的一件安装,通过数字选择进行选项选择安装,一次性安装完成,把环境部署工作更简单的操作,而且是可选项操作。目前是centos6.8,大部分环境测试没有问题,有遇到的问题的可以留言或微信沟通

如此,完整包下载点这里

只需要脚本的点这里

只是要看看看代码的,看下面吧

 

代码实在太长了,去下载吧,自己慢慢看

文末的下载链接任然有效,但是代码有错,不想花时间改了,各位下载最新的吧

 
———-我是美丽的分割线,我代表着有更美的更新————-

可以一键安装LAMP或者LNMP,自由选择

同时扩展了ssh、oci、ssl

目标项目中使用了phalcon框架和jdk,不需要的可以不安装。

不多说,上代码


#!bin/sh

function init()
{
#import RPM-GPG-KEY and install initscripts,wget,git
yum clean all
# cp -rf ./repo/aliyun.repo /etc/yum.repos.d/
# cp -rf ./repo/epel.repo /etc/yum.repos.d/
rpm –import /etc/pki/rpm-gpg/RPM* && rpm –import http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-6
yum -y install gcc gcc-c++ bison autoconf automake initscripts wget git
}

function install_httpd()
{
yum -y install httpd httpd-devel
sed -i ‘s/#ServerName www.example.com:80/ServerName localhost:80/g’ /etc/httpd/conf/httpd.conf
}

function install_nginx()
{
echo -e “[nginx]\nname=nginx repo\nbaseurl=http://nginx.org/packages/centos/6/x86_64\ngpgcheck=0\nenabled=1” >> /etc/yum.repos.d/nginx.repo
yum -y install nginx

}

function download_php()
{
wget -c http://cn2.php.net/distributions/php-5.6.29.tar.bz2
}

function install_php()
{
#install support libs
yum -y install libxml2 libxml2-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel libmcrypt libmcrypt-devel mhash mcrypt libtool-ltdl libtool-ltdl-devel bzip2 bzip2-devel freetype freetype-devel openldap openldap-devel openssl openssl-devel

cp -frp /usr/lib64/libldap* /usr/lib/

#install php
tar -jxvf php-5.6.29.tar.bz2 && cd php-5.6.29 && ./configure –with-apxs2=/usr/sbin/apxs –with-mysql=mysqlnd –with-mysqli=mysqlnd –with-mysql-sock –with-pdo-mysql=mysqlnd –with-openssl –with-gd –with-iconv –with-jpeg-dir=/usr/local/lib –with-png-dir –with-freetype-dir –with-zlib –with-bz2 –with-libxml-dir –with-gettext –with-curl –with-mhash –with-mcrypt –enable-mbstring –enable-mbregex –with-ldap –with-ldap-sasl –with-xmlrpc –enable-gd-native-ttf –enable-pdo –enable-pcntl –enable-sockets –enable-bcmath –enable-xml –enable-zip –enable-soap –enable-bcmath –enable-shmop –enable-sysvsem –enable-inline-optimization –enable-maintainer-zts –enable-opcache –enable-cgi –without-pear –disable-phar >> ../install_php_log && make >> ../install_php_log && make install >> ../install_php_log && cd ../

#config PHP
cp ./php-5.6.29/php.ini-development $(php-config –prefix)/lib/php.ini && sed -i ‘s/\;date\.timezone \=/date\.timezone \=PRC/g’ $(php-config –prefix)/lib/php.ini && sed -i “s/\;include_path \= \”\.\:\/php\/includes\”/include_path \= \”\$\(php-config –prefix\)\/lib\/php\”/g” $(php-config –prefix)/lib/php.ini && ln -s $(php-config –prefix)/bin/php /usr/bin/php
echo “AddHandler application/x-httpd-php .php” >> /etc/httpd/conf/httpd.conf
echo “” > /var/www/html/i.php
}

function install_phpfpm()
{
#install support libs
yum -y install libxml2 libxml2-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel libmcrypt libmcrypt-devel mhash mcrypt libtool-ltdl libtool-ltdl-devel bzip2 bzip2-devel freetype freetype-devel openldap openldap-devel openssl openssl-devel

cp -frp /usr/lib64/libldap* /usr/lib/

#install php
tar -jxvf php-5.6.29.tar.bz2 && cd php-5.6.29 && ./configure –enable-fpm –enable-cgi –with-mysql=mysqlnd –with-mysqli=mysqlnd –with-mysql-sock –with-pdo-mysql=mysqlnd –with-openssl –with-gd –with-iconv –with-jpeg-dir=/usr/local/lib –with-png-dir –with-freetype-dir –with-zlib –with-bz2 –with-libxml-dir –with-gettext –with-curl –with-mhash –with-mcrypt –enable-mbstring –enable-mbregex –with-ldap –with-ldap-sasl –with-xmlrpc –enable-gd-native-ttf –enable-pdo –enable-pcntl –enable-sockets –enable-bcmath –enable-xml –enable-zip –enable-soap –enable-bcmath –enable-shmop –enable-sysvsem –enable-inline-optimization –enable-maintainer-zts –enable-opcache –enable-cgi –without-pear –disable-phar >> ../install_php_log && make >> ../install_php_log && make install >> ../install_php_log && cd ../

#config PHP
cp ./php-5.6.29/php.ini-development $(php-config –prefix)/lib/php.ini && sed -i ‘s/\;date\.timezone \=/date\.timezone \=PRC/g’ $(php-config –prefix)/lib/php.ini && sed -i “s/\;include_path \= \”\.\:\/php\/includes\”/include_path \= \”\$\(php-config –prefix\)\/lib\/php\”/g” $(php-config –prefix)/lib/php.ini && ln -s $(php-config –prefix)/bin/php /usr/bin/php

#config php-fpm. use -t test fpm’s configs
cp ./php-5.6.29/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm && chmod a+x /etc/init.d/php-fpm && chkconfig –add php-fpm && chkconfig php-fpm on && cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf && /usr/local/sbin/php-fpm -c $(php-config –prefix)/lib/php.ini -y /usr/local/etc/php-fpm.conf -t && /usr/local/sbin/php-fpm -c $(php-config –prefix)/lib/php.ini -y /usr/local/etc/php-fpm.conf

#write something into readme.txt
echo -e “start php-fpm:\n/usr/local/sbin/php-fpm -c $(php-config –prefix)/lib/php.ini -y /usr/local/etc/php-fpm.conf\nstop php-fpm:\nkill -INT ‘cat /usr/local/php/var/run/php-fpm.pid’\nOR\nservice php-fpm stop\nreboot php-fpm:\nkill -USR2 ‘cat /usr/local/php/var/run/php-fpm.pid’\nOR\nservice php-fpm reboot” >> ../readme.txt

#config nginx
mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
echo -e “server\n{\n listen 80;\n server_name localhost;\n root /var/www/zhenzhidaole;\n access_log /var/log/nginx/access_zhenzhidaole_com.log;\n error_log /var/log/nginx/error_zhenzhidaole_com.log;\n index index.html index.php;\n location ~ \.php$ {\n fastcgi_pass 127.0.0.1:9000;\n fastcgi_index index.php;\n fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;\n include fastcgi_params; \n }\n}” >> /etc/nginx/conf.d/vhost.conf

mkdir -p /var/www/html && echo “” > /var/www/html/i.php

service nginx restart
}

function install_php_by_yum()
{
yum install libxml2 libxml2-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel libmcrypt libmcrypt-devel mhash mcrypt libtool-ltdl libtool-ltdl-devel bzip2 bzip2-devel freetype freetype-devel openldap openldap-devel openssl openssl-devel
yum -y install php php-mysql php-common php-gd php-mbstring php-mcrypt php-devel php-xml
yum -y install perl
yum -y install mod_python
}

function download_mysql()
{
wget -c http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-client-5.7.16-1.el6.x86_64.rpm
wget -c http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-server-5.7.16-1.el6.x86_64.rpm
wget -c http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-devel-5.7.16-1.el6.x86_64.rpm
wget -c http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-libs-5.7.16-1.el6.x86_64.rpm
wget -c http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-common-5.7.16-1.el6.x86_64.rpm
}

function install_mysql()
{
#install mysql
yum -y install libaio net-tools numactl
yum -y remove mysql*

echo -e “HOSTNAME=internal.hostname.DOMAIN.com” >> /etc/sysconfig/network

rpm -ivh mysql-community-common-5.7.16-1.el6.x86_64.rpm && rpm -ivh mysql-community-libs-5.7.16-1.el6.x86_64.rpm && rpm -ivh mysql-community-devel-5.7.16-1.el6.x86_64.rpm && rpm -ivh mysql-community-client-5.7.16-1.el6.x86_64.rpm && rpm -ivh mysql-community-server-5.7.16-1.el6.x86_64.rpm && echo “max_allowed_packet=200M” >> /etc/my.cnf && service mysqld start

#find the default password and save it into readme.txt
echo -e “\nmysql install information:” >> ../readme.txt
sed -n ‘/A temporary password is generated for root@localhost:/p’ /var/log/mysqld.log >> ../readme.txt
echo -e “After login mysql,you need to do:\nstep 1: SET PASSWORD = PASSWORD(\”your new password\”);\nstep 2: ALTER USER ‘root’@’localhost’ PASSWORD EXPIRE NEVER;\nstep 3: flush privileges;” >> ../readme.txt
# echo -e “export MYSQL_HOME=/usr/local/mysql\nexport PATH=\$MYSQL_HOME/bin:\$PATH” >>/etc/profile && source /etc/profile
}

function download_ssh2()
{
wget -c https://www.libssh2.org/download/libssh2-1.8.0.tar.gz
wget -c http://pecl.php.net/get/ssh2-0.13.tgz
}

function install_ssh2()
{
tar -zxvf libssh2-1.8.0.tar.gz && cd libssh2-1.8.0 && ./configure –prefix=/usr/local/libssh2 && make && make install && cd ../
tar -zxvf ssh2-0.13.tgz && cd ssh2-0.13 && phpize && ./configure –prefix=/usr/local/ssh2 –with-ssh2=/usr/local/libssh2 && make && make install && echo “extension=ssh2.so” >> $(php-config –prefix)/lib/php.ini && cd ../
}

function download_oci()
{
# wget -c http://download.oracle.com/otn/linux/instantclient/11204/oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
# wget -c http://download.oracle.com/otn/linux/instantclient/11204/oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
wget -c http://pecl.php.net/get/PDO_OCI-1.0.tgz
wget -c http://pecl.php.net/get/oci8-2.0.12.tgz
}

Function install_oci()
{
#install oci8 support oracle11grc2
rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm && rpm -ivh oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm && echo ‘/usr/lib/oracle/11.2/client64/lib/’ > /etc/ld.so.conf.d/oracle-x86_64.conf && ln -s /usr/lib/oracle/11.2/client64 /usr/lib/oracle/11.2/client && ln -s /usr/include/oracle/11.2/client64 /usr/include/oracle/11.2/client && echo -e “export ORACLE_HOME=/usr/lib/oracle/11.2/client64/\nexport LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64:\$LD_LIBRARY_PATH\nexport NLS_LANG=\”AMERICAN_AMERICA.AL32UTF8\”” >> /etc/profile && source /etc/profile

tar -zxvf oci8-2.0.12.tgz && cd oci8-2.0.12 && phpize && ./configure –with-oci8=shared,instantclient,/usr/lib/oracle/11.2/client64/lib && make && make install && echo “extension=oci8.so” >> $(php-config –prefix)/lib/php.ini && cd ../

tar -zxvf PDO_OCI-1.0.tgz && cd PDO_OCI-1.0 && ln -s /usr/include/oracle/11.2 /usr/include/oracle/10.2.0.1 && ln -s /usr/lib/oracle/11.2 /usr/lib/oracle/10.2.0.1 && sed -i ‘101i 11.2)\n PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)\n \;\;’ config.m4 && sed -i ’10i elif test -f \$PDO_OCI_DIR/lib/libclntsh\.\$SHLIB_SUFFIX_NAME.11.2\; then\n PDO_OCI_VERSION=11\.2′ config.m4 && sed -i ‘s/function_entry/zend_function_entry/g’ pdo_oci.c && phpize && ./configure –with-pdo-oci=instantclient,/usr,11.2 && make && make install && echo “extension=pdo_oci.so” >> $(php-config –prefix)/lib/php.ini && cd ../

}

function download_phalcon()
{
git clone –depth=1 git://github.com/phalcon/cphalcon.git
}

function install_phalcon()
{
#install phalcon frameworks
cd cphalcon/build && ./install && echo “extension=phalcon.so” >> $(php-config –prefix)/lib/php.ini && cd ../../
}

function download_jdk()
{
# http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
}

function install_jdk()
{
install_path=$(pwd) && mkdir -p /usr/java && cp -rf jdk-8u111-linux-x64.tar.gz /usr/java/ && cd /usr/java && tar -zxvf jdk-8u111-linux-x64.tar.gz && echo -e “JAVA_HOME=/usr/java/jdk1.8.0_111\nCLASSPATH=\$JAVA_HOME/lib/\nPATH=\$PATH:\$JAVA_HOME/bin:\$JAVA_HOME/jre/bin\nexport PATH JAVA_HOME CLASSPATH” >> /etc/profile && source /etc/profile && java -version && cd $install_path
}

function install_openssl()
{
yum -y install openssl mod_ssl
cd /etc/pki/tls/private/ && openssl genrsa 1024 >localhost.key && openssl req -new -key localhost.key > localhost.csr && openssl req -x509 -days 3650 -key localhost.key -in localhost.csr > localhost.crt && cp localhost.crt /etc/pki/tls/certs/localhost.crt
}

function test_http()
{
echo -e “Alias /webalias \”/var/www/alias\”\n\n Options Indexes MultiViews FollowSymLinks\n AllowOverride None\n Order allow,deny\n Allow from all\n” >> /etc/httpd/conf/httpd.conf
echo -e “\n ServerAdmin admin@zhenzhidaole.com\n DocumentRoot /var/www/html\n ServerName www.zhenzhidaole.com\n ErrorLog /var/www/logs/error_log\n CustomLog /var/www/logs/access_log common\n” >> /etc/httpd/conf/httpd.conf
mkdir -p /var/www/web && mkdir -p /var/www/alias
echo “” > /var/www/alias/s.php
echo -e “127.0.0.1 www.zhenzhidaole.com” >> /etc/hosts
service httpd restart
}

function test_phpinfo()
{
php -v
php -i |grep mcrypt
php -i |grep ssh
php -i |grep oci
php -i |grep phalcon
curl https://localhost/ -k
curl http://www.zhenzhidaole.com/c.php |grep oci

#
}

init()
install_httpd()
#install_nginx()
#download_php()
install_php()
#install_phpfpm()
#download_mysql()
install_mysql()
#download_ssh2()
install_ssh2()
#download_oci()
install_oci()
#download_phalcon()
install_phalcon()
#download_jdk()
install_jdk()
install_openssl()

#test_http()
#test_phpinfo()

 

附件下载install-php.sh
另外附repo文件repo

OpenSuSE大陆镜像服务器

主机名:lizardsource.cn
支持协议:http, ftp, 推荐使用ftp
http://www.lizardsource.cn
ftp://lizardsource.cn (推荐使用,不支持passive模式)
用途:OpenSuSE下载镜像,安装源和Factory下载
这可能是大陆第一个专门针对OpenSuSE的镜像服务器,该服务器每隔3~6个小时的间隔与OpenSuSE主站保持更新同步。目前包括了 CD/DVD的iso文件下载,稳定版本的RPM包下载,和开发中的RPM包下载。同时,该服务器也提供rsync服务,可作为其它国内的服务器的镜像源。
本文所处位置:Linux爱好者 » 《OpenSuSE大陆镜像服务器》

[转]百万级访问网站前期的技术准备

文章转自:
http://zhiyi.us/internet/thinking-twice-before-building-your-site-one.html

http://zhiyi.us/internet/thinking-twice-before-building-your-site-two.html
http://zhiyi.us/internet/thinking-twice-before-building-your-site-final.html

文章所在博客:《一路凯歌

【正文开始】

开了自己域名的博客,第一篇就得来个重磅一点的才对得起这4美金的域名。作为一个技术从业者十年,逛了十年发现有些知识东一榔头西一棒槌的得满世界 看个遍才整理出个头绪,那咱就系统点的从头一步一步的说,一个从日几千访问的小小网站,到日访问一两百万的小网站,怎么才能让它平滑的度过这个阶段,别在 技术上出现先天不足,写给一些技术人员,也写给不懂技术的创业者。

转载请注明出自 http://zhiyi.us ,假如您还想从这转到好文章的话。

对互联网有了解的人都有自己的想法,有人就把想法付诸实现,做个网站然后开始运营。其实从纯网站技术上来说,因为开源模式的发展,现在建一个小网站 已经很简单也很便宜。当访问量到达一定数量级的时候成本就开始飙升了,问题也开始显现了。因为带宽的增加、硬件的扩展、人员的扩张所带来的成本提高是显而 易见的,而还有相当大的一部分成本是因为代码重构、架构重构,甚至底层开发语言更换引起的,最惨的就是数据丢失,辛辛苦苦好几年,一夜回到创业前。

减少成本就是增加利润。很多事情,我们在一开始就可以避免,先打好基础,往后可以省很多精力,少操很多心。

假设你是一个参与创业的技术人员,当前一穷二白,什么都要自己做,自己出钱,初期几十万的资金,做一个应用不是特别复杂的网站,那么就要注意以下几点:

一、开发语言

一般来说,技术人员(程序员)创业都是根据自己技术背景选择自己最熟悉的语言,不过考虑到不可能永远是您一个人写程序,这点还得仔细想想。无论用什么语言,最终代码质量是看管理,所以我们还是从纯语言层面来说实际一点。现在流行的javaphp.netpythonruby都 有自己的优劣,python和ruby,现在人员还是相对难招一些,性能优化也会费些力气,.net平台买不起windows server。java、php用的还是最多。对于初期,应用几乎都是靠前端支撑的网站来说,php的优势稍大一些,入门简单、设计模式简单、写起来快、 性能足够等,不过不注重设计模式也是它的劣势,容易变得松散,隐藏bug稍多、难以维护。java的优势在于整套管理流程已经有很多成熟工具来辅助,强类 型也能避免一些弱智BUG,大多数JAVA程序员比较注重设计模式,别管实不实际,代码格式看起来还是不错的。这也是个劣势,初学者可能太注重模式而很难 解决实际需求。

前端不只是html、css这类。整个负责跟用户交互的部分都是前端,包括处理程序。这类程序还是建议用php,主要原因就是开发迅速、从业人员广泛。至于后端例如行为分析、银行接口、异步消息处理等,随便用什么程序,那个只能是根据不同业务需求来选择不同语言了。

二、代码版本管理

如果开发人员之间的网络速度差不多,就SVN;比较分散例如跨国,就hg。大多数人还是svn的.

假设选了svn,那么有几点考虑。一是采用什么树结构。初期可能只有一条主干,往后就需要建立分支,例如一条开发分支,一条上线分支,再往后,可能 要每个小组一个分支。建议一开始人少时选择两条分支,开发和线上,每个功能本地测试无误后提交到开发分支,最后统一测试,可以上线时合并到上线分支。如果 喜欢把svn当做移动硬盘用,写一点就commit一次也无所谓,就是合并的时候头大一些,这些人可以自己建个分支甚至建立个本地代码仓库,随便往自己的 分支提交,测试完毕后再提交到开发分支上。

部署,可以手工部署也可以自动部署。手工部署相对简单,一般是直接在服务器上svn update,或者找个新目录svn checkout,再把web root给ln -s过去。应用越复杂,部署越复杂,没有什么统一标准,只要别再用ftp上传那种形式就好,一是上传时文件引用不一致错误率增加,二是很容易出现开发人员 的版本跟线上版本不一致,导致本来想改个错字结果变成回滚的杯具。如果有多台服务器还是建议自动部署,更换代码的机器从当前服务池中临时撤出,更新完毕后 再重新加入。

不管项目多小,养成使用版本管理的好习惯,最起码还可以当做你的备份,我的 http://zhiyi.us 虽然就是一个wordpress,可还是svn了,只改动一两句css那也是劳动成果。

三、服务器硬件

别羡慕大客户和有钱人,看看机房散户区,一台服务器孤独的支撑的网站数不清。如果资金稍微充足,建议至少三台的标准配置,分别用作web处理、数据 库、备份。web服务器至少要8G内存,双sata raid1,如果经济稍微宽松,或静态文件或图片多,则15k sas raid1+0。数据库至少16G内存,15k sas raid 1+0。备份服务器最好跟数据库服务器同等配置。硬件可以自己买品牌的底板,也就是机箱配主板和硬盘盒,CPU内存硬盘都自己配,也可以上整套品牌,也可 以兼容机。三台机器,市场行情6、7万也就配齐了。

web服务器可以既跑程序又当内存缓存,数据库服务器则只跑主数据库(假如是MySQL的话),备份服务器干的活就相对多一些,web配置、缓存配置、数据库配置都要跟前两台一致,这样WEB和数据库任意一台出问题,把备份服务器换个ip就切换上去了。备份策略,可以drbd,可以rsync,或者其他的很多很多的开源备份方案可选择。rsync最简单,放cron里自己跑就行。备份和切换,建议多做测试,选最安全最适合业务的,并且尽可能异地备份。

四、机房

三种机房尽量不要选:联通访问特别慢的电信机房、电信访问特别慢的联通机房、电信联通访问特别慢的移动或铁通机房。那网通机房呢?亲,网通联通N久 以前合并改叫联通了。多多寻找,实地参观,多多测试,多方打探,北京、上海、广州等各个主节点城市,还是有很多优质机房的,找个网络质量好,管理严格的机 房,特别是管理要严格,千万别网站无法访问了,打个电话过去才知道别人维护时把你网线碰掉了,这比DOS都头疼。自己扯了几根光纤就称为机房的,看您抗风 险程度和心理素质了。机房可以说是非常重要,直接关系到网站访问速度,网站访问速度直接关系到用户体验,我可以翻墙看风景,但买个网游vpn才能打开你这 个还不怎么知名的网站就有难度了。或许您网站的ajax很出色,可是document怎么也不ready,一些代码永远绝缘于用户。

五、架构

初期架构一般比较简单,web负载均衡+数据库主从+缓存+分布式存储+队列。大方向上也确实就这几样东西,细节上也无数文章都重复过了,按照将来 会有N多WEB,N多主从关系,N多缓存,N多xxx设计就行,基本方案都是现成的,只是您比其他人厉害之处就在于设计上考虑到缓存失效时的雪崩效应、主 从同步的数据一致性和时间差、队列的稳定性和失败后的重试策略、文件存储的效率和备份方式等等意外情况。缓存总有一天会失效,数据库复制总有一天会断掉, 队列总有一天会写不进去,电源总有一天会烧坏。根据墨菲定律,如果不考虑这些,网站早晚会成为茶几。

六、服务器软件

Linux、nginx、php、mysql,几乎是标配,我们除了看名字,还得选版本。Linux发行版众多,只要没特殊要求,就选个用的人最多的,社区最活跃的,配置最方便的,软件包最全最新的,例如debianubuntu。 至于RHEL之类的嘛,你用只能在RHEL上才能运行的软件么?剩下的nginx、php、mysql、activemq、其他的等等,除非你改过这些软 件或你的程序真的不兼容新版本,否则尽量版本越新越好,版本新,意味着新特性增多、BUG减少、性能增加。总有些道听途说的人跟你说老的版本稳定。所谓稳 定,是相对于特殊业务来说的,而就一个php写的网站,大多数人都没改过任何服务器软件源代码,绝大多数情况是能平稳的升级到新版本的。类似于jdk5到 jdk6,python2到python3这类变动比较大的升级还是比较少见的。看看ChangeLog,看看升级说明,结合自己情况评估一下,越早升级 越好,别人家都用php6写程序了这边还php4的逛游呢。优秀的开源程序升级还是很负责任的,看好文档,别怕。

七、数据库

几乎所有操作最后都要落到数据库身上,它又最难扩展(存储也挺难)。对于mysql,什么样的表用myisam,什么样的表用innodb,在开发 之前要确定。复制策略、分片策略,也要确定。表引擎方面,一般,更新不多、不需要事务的表可以用myisam,需要行锁定、事务支持的,用innodb。 myisam的锁表不一定是性能低下的根源,innodb也不一定全是行锁,具体细节要多看相关的文档,熟悉了引擎特性才能用的更好。现代WEB应用越来 越复杂了,我们设计表结构时常常设计很多冗余,虽然不符合传统范式,但为了速度考虑还是值得的,要求高的情况下甚至要杜绝联合查询。编程时得多注意数据一 致性。

复制策略方面,多主多从结构也最好一开始就设计好,代码直接按照多主多从来编写,用一些小技巧来避免复制延时问题,并且还要解决多数据库数据是否一致,可以自己写或者找现成的运维工具。

分片策略。总会有那么几个表数据量超大,这时分片必不可免。分片有很多策略,从简单的分区到根据热度自动调整,依照具体业务选择一个适合自己的。避免自增ID作为主键,不利于分片。

用存储过程是比较难扩展的,这种情形多发生于传统C/S,特别是OA系统转换过来的开发人员。低成本网站不是一两台小型机跑一个数据库处理所有业务的模式,是机海作战。方便水平扩展比那点预分析时间和网络传输流量要重要的多的多。

NoSQL。这只是一个概念。实际应用中,网站有着越来越多的密集写操作、上亿的简单关系数据读取、热备等,这都不是传统关系数据库所擅长的,于是 就产生了很多非关系型数据库,比如Redis/TC&TT/MongoDB/Memcachedb等,在测试中,这些几乎都达到了每秒至少一万次 的写操作,内存型的甚至5万以上。例如MongoDB,几句配置就可以组建一个复制+自动分片+failover的环境,文档化的存储也简化了传统设计库 结构再开发的模式。很多业务是可以用这类数据库来替代mysql的。

八、缓存。

数据库很脆弱,一定要有缓存在前面挡着,其实我们优化速度,几乎就是优化缓存,能用缓存的地方,就不要再跑到后端数据库那折腾。缓存有持久化缓存、 内存缓存,生成静态页面是最容易理解的持久化缓存了,还有很多比如varnish的分块缓存、前面提到的memcachedb等,内存缓 存,memcached首当其冲。缓存更新可用被动更新和主动更新。被动更新的好处是设计简单,缓存空了就自动去数据库取数据再把缓存填上,但容易引发雪 崩效应,一旦缓存大面积失效,数据库的压力直线上升很可能挂掉。主动缓存可避免这点但是可能引发程序取不到数据的问题。这两者之间如何配合,程序设计要多 动脑筋。

九、队列。

用户一个操作很可能引发一系列资源和功能的调动,这些调动如果同时发生,压力无法控制,用户体验也不好,可以把这样一些操作放入队列,由另几个模块 去异步执行,例如发送邮件,发送手机短信。开源队列服务器很多,性能要求不高用数据库当做队列也可以,只要保证程序读写队列的接口不变,底层队列服务可随 时更换就可以,类似Zend Framework里的Zend_Queue类,java.util.Queue接口等。

十、文件存储。

除了结构化数据,我们经常要存放其他的数据,像图片之类的。这类数据数量繁多、访问量大。典型的就是图片,从用户头像到用户上传的照片,还要生成不 同的缩略图尺寸。存储的分布几乎跟数据库扩展一样艰难。不使用专业存储的情况下,基本都是靠自己的NAS。这就涉及到结构。拿图片存储举例,图片是非常容 易产生热点的,有些图片上传后就不再有人看,有些可能每天被访问数十万次,而且大量小文件的异步备份也很耗费时间。

为了将来图片走cdn做准备,一开始最好就将图片的域名分开,且不用主域名。很多网站都将cookie设置到了.domain.ltd,如果图片也在这个域名下,很可能因为cookie而造成缓存失效,并且占多余流量,还可能因为浏览器并发线程限制造成访问缓慢。

如果用普通的文件系统存储图片,有一个简单的方法。计算文件的hash值,比如md5,以结果第一位作为第一级目录,这样第一级有16个目录。从0 到F,可以把这个字母作为域名,0.yourimg.com到f.yourimg.com(客户端dns压力会增大),还可以扩展到最多16个NAS集群 上。第二级可用年月例如,201011,第三级用日,第四级可选,根据上传量,比如am/pm,甚至小时。最终的目录结构可能会是 e/201008/25/am/e43ae391c839d82801920cf.jpg。rsync备份时可以用脚本只同步某年某日某时的文件,避免计 算大量文件带来的开销。当然最好是能用专门的分布式文件系统或更专业点的存储解决方案。

开始设计代码结构之前,先回顾一下之前准备过的事情:我们有负载均衡的WEB服务器,有主从DB服务器并可能分片,有缓存,有可扩展的存储。在组织代码的各个方面,跟这些准备息息相关,我一二三的列出来分别说,并且每一条都以“前面讲到”这个经典句式开头,为了方便对照。

别着急看经典句式,我思维跳跃了,插一段。实际开发中,我们总会在性能和代码优雅性上作折中。对于当今的计算机和语言解释器,多几层少几层对象调 用、声明变量为Map还是HashMap这种问题是最后才需要考虑的问题,永远要考虑系统最慢的部分,从最慢的部分解决。例如看看你用的ORM是不是做了 很多你用不到的事情,是不是有重复的数据调用。我们做的是web应用开发,不是底层框架API,代码易读易懂是保证质量很重要的一方面,你的程序是为了什 么而设计,有不同的方法……算了,这个话题另起一篇文章来说,扯远了,想交流可关注我的微博 http://t.sina.com.cn/liuzhiyi,咱继续……

前面讲到,WEB 服务器是要做负载均衡的,图片服务器是要分开的。对于这点,代码在处理客户端状态时,不要把状态放到单机上,举例,不要用文件session,嗯,常识。 如果有可能,最好在一开始就做好用户单点认证的统一接口,包括跨域如何判断状态、静态页面如何判断状态,需要登录时的跳转和返回参数定义,底层给好接口, 应用层直接就用(可参考GAE的 user服务)。登录方面的设计要考虑移动设备的特性,比如电脑可以用浮动层窗口,但NOKIA自带的浏览器或UCWEB就无法处理这种表现形式,程序一 定既能处理AJAX请求又能直接通过URL来处理请求。图片服务器分开,资源文件最好也布局到图片服务器,也就是WEB服务器只服务动态程序。虽然开发测 试时稍微复杂(因为需要绝对URI才能访问),但将来页面前端优化上会轻松许多,并且你的WEB服务器IO优化也轻松许多。程序引用资源文件时,要有一个 统一的处理方法,在方法内部可以自动完成很多事情,例如将css/js根据组合,拼成一个文件,或者自动在生成的URI后面加上QUERYSTRING, 如果将来前端用了缓存服务,那生成QUERYSTRING是最简单的刷新服务端缓存和客户端缓存的办法。

前面讲到, 数据库会有复制,可能会多主多从,可能会分片。我们程序在处理数据的过程中,最好能抽象出来单独放做一层。拿现在流行的MVC模式来说,就是在M层下方再 放一个数据层,这个数据层不是通常所说的JDBC/PDO/ActiveRecord等,而是你自己的存取数据层,仅对外暴露方法,隐藏数据存取细节。这 个数据层内部不要怕写的难看,但一定要提供所有的数据存储功能,其他任何层次不要看到跟数据库打交道的字眼。之所以这样做,是因为在单关系数据库的情况 下,可能会SELECT…JOIN…或直接INSERT…INTO…,可你可能会将一些表放到key-value数据库里存储,或者分片,这么做之后原来 的语句和方式要全部改变,如果过于分散,则移植时会耗费很大精力,或得到一个很大的Model。在数据层面的设计上,尽量避免JOIN查询,我们可以多做 冗余,多做缓存,每种数据尽量只需要一次查询,然后在你的程序里面进行组合。对于比较复杂的数据组合,在实时性要求不高的情况下,可采用异步处理,用户访 问时只取处理后的结果。在对于主键的处理上,避免使用自增ID,可以用一定规则生成的唯一值当做主键,这种主键是最简单的分片分布策略。即使用自增ID, 也最好用一个自增ID发生器,否则从数据库不小心被写了一下,那主键很容易冲突。

前面讲到,咱数据库前面还有某些缓存挡着。别把mysql的query cache当缓存,应用稍复杂的时候QUERY CACHE反而会成为累赘。缓存跟数据库和业务结合的很紧密,正因为跟业务关系紧密,所以这点没有放之四海而皆准的方法。但我们还是有一些规则可参照。规 则一:越接近前端,缓存的颗粒度越大。例如在WEB最前端缓存整个页面,再往后一层缓存部分页面区域,再往后缓存区域内的单条记录。因为越靠近后端,我们 的可操作性越灵活,并且变化最多的前端代码也比较方便编写。在实践中,因为产品需求变化速度非常快,迭代周期越来越短,有时很难将Controller和 Model分的那么清楚,Controller层面处理部分缓存必不可免,但要保证如果出现这种情况,Controller所操作的缓存一定不要影响其他 数据需求方,也就是要保证这个缓存数据只有这一个Controller在用。规则二:没有缓存时程序不能出错。在不考虑缓存失效引发的雪崩效应时,你的程 序要有缓存跟没缓存一个样,不能像新浪微博一样,缓存一失效,粉丝微博全空,整个应用都乱套了。在缓存必不可少的情况下,给用户出错信息都比给一个让人误 解的信息强。规则三,缓存更新要保证原子性或称作线程安全,特别是采用被动缓存的方式时,很可能两个用户访问时导致同一个缓存被更新,通常情况这不是大问 题,可缓存失效后重建时很可能是引发连锁反应的原因之一。规则四:缓存也是有成本的。不只是技术成本,还有人工时间成本。如果一个功能使用缓存和不使用, 在可预见的访问量情况下区别微小,但使用缓存会使复杂度增加,那就不用,我们可以加个TODO标注,在下次迭代的时候加上缓存处理。

前面讲到,文件存储是独立的,那么所有的文件操作就都是远程调用。可以在文件服务器上提供一个很简单的RESTful接口,也可以提供xmlrpc 或json serveice,WEB服务器端所生成和处理的文件,全部通过接口通知文件服务器去处理,WEB服务器本身不要提供任何文件存储。你会发现很多大网站的 上传图片跟保存文章是分两步完成的,就是基于这个原因。

以上几条“前面讲到”,其实无数人都讲过,我也只是结合前几篇文章用自己的话重复了一遍,真正分析起来精髓很简单——除了良好的功能逻辑分层,我们 还要为数据库存储、缓存、队列、文件服务等程序外层资源调用单独设计接口,你可以把你的程序想象成是运行在 Amazon EC2 上并用他的所有web service服务,你的数据库就是它的SimpleDB,你的队列就是他的SQS,你的存储就是他的S3,唯一不同是amazon的接口是远程调用,你的是内部调用。

将支撑服务接口化,意味着将MySQL更换到PostgreSQL不需要更改业务处理程序,移植团队甚至不需要跟业务开发团队过多沟通;意味着业务开发团队是对接口编程而不是对数据库编程;意味着不会因为某个业务开发人员的失误而拖垮性能。

对程序扫盲不感兴趣的直接看这里——

产品设计完了,程序框架搭完了,可能有矛盾在这个节骨眼儿产生了。不断有产品设计抱怨说他的创意没实现到预期效果,有程序员抱怨说产品设计不切实 际。这种抱怨多缘于产品人员不懂技术,技术人员不理解产品。从广义上来讲,产品包含市场策略、营销手段、功能设计,产品和技术在争论时往往把焦点放在功能 上,而实际重点是,实现这个功能所消耗的成本跟能这个功能带来的利益能否换算,能否取其轻重。若可以,争议解决。若不能,则抛硬币看运气。因为一个功能的 加强而引发指标井喷,或因项目拖延而导致贻误战机的例子比比皆是。激进的决策者注重利益,保守的决策者注重损失,聪明的决策者会考虑这个问题是否真的那么 严重。

关系到未来的事情谁都说不准,要不怎么说创业一半靠运气呢。不过总有能说的准的事情,那就得靠数据说话。

没有100%也有99.9%的网站安装了访问统计代码,连我的 http://zhiyi.us 也不例外,新闻联播也总说科学决策科学发展的。有了统计,能确定的事情就很多了。例如,可以根据来源-目标转化率来分析哪类渠道的人均获取成本低,根据来 源-内容访问猜测用户跳出率原因,根据用户点击行为判断链接位置是否合理等。将数据以不同方式组合起来,找到内在联系,分析内因外因,制定对应策略,减少 拍脑门决策。靠数据支撑运营是个非常专业的事情,虽然不懂深奥的数学模型不会复杂的公式计算,渐渐学会因为A所以B,因为A和B所以C还是相对简单的。

over~

如何有效防御PHP木马攻击的技巧

1、防止跳出web目录
首先修改httpd.conf,如果你只允许你的php脚本程序在web目录里操作,还可以修改httpd.conf文件限制php的操作路径。比如你的web目录是/usr/local/apache/htdocs,那么在httpd.conf里加上这么几行:

php_admin_value open_basedir /usr/local/apache

/htdocs

这样,如果脚本要读取/usr/local/apache/htdocs以外的文件将不会被允许,如果错误显示打开的话会提示这样的错误:

Warning: open_basedir restriction in effect. File is in wrong directory in

/usr/local/apache/htdocs/open.php on line 4

等等。

2、防止php木马执行webshell

打开safe_mode,

在,php.ini中设置

disable_functions= passthru,exec,shell_exec,system

二者选一即可,也可都选

3、防止php木马读写文件目录

在php.ini中的

disable_functions= passthru,exec,shell_exec,system

后面加上php处理文件的函数

主要有

fopen,mkdir,rmdir,chmod,unlink,dir

fopen,fread,fclose,fwrite,file_exists

closedir,is_dir,readdir.opendir

fileperms.copy,unlink,delfile

即成为

disable_functions= passthru,exec,shell_exec,system,fopen,mkdir,rmdir,chmod,unlink,dir

,fopen,fread,fclose,fwrite,file_exists

,closedir,is_dir,readdir.opendir

,fileperms.copy,unlink,delfile

ok,大功告成,php木马拿我们没辙了,遗憾的是这样的话,利用文本数据库的那些东西就都不能用了。

如果是在windos平台下搭建的apache我们还需要注意一点,apache默认运行是system权限,这很恐怖,这让人感觉很不爽.那我们就给apache降降权限吧。

net user apache fuckmicrosoft /add

net localgroup users apache /del

ok.我们建立了一个不属于任何组的用户apche。

我们打开计算机管理器,选服务,点apache服务的属性,我们选择log on,选择this account,我们填入上面所建立的账户和密码,重启apache服务,ok,apache运行在低权限下了。

实际上我们还可以通过设置各个文件夹的权限,来让apache用户只能执行我们想让它能干的事情,给每一个目录建立一个单独能读写的用户。这也是当前很多虚拟主机提供商的流行配置方法哦,不过这种方法用于防止这里就显的有点大材小用了。

【转】Subversion安装配置指南

原文地址:http://blog.csdn.net/sinboy/archive/2009/03/18/4000524.aspx

Subversion是一个非常优秀的源代码管理控制系统,它的支持独立启动使用和结合Apache使用两种服务方式。
一、安装Subversion
1.从Subversion主页 下载最新版本的安装程序
2.如果是Windows平台,直接运行Exe的安装程序即可
3.如果是一般的Linux平台:
1)执行tar -zxvf subversion.xxx.tar.gz进行解压
2)执行cd subversion.xxx切换到解压后的目录
3)执行./configure –prefix=/opt/subversion进行配置设定,并指明安装目录
4)执行make进行编译
5)执行make install 进行安装
4.如果是Fedora Linux,可以直接执行yum install subversion进行自动安装(Fedora7以上的版本已自带
5.如果是Ubuntu Linux,可以直接执行sudo apt-get install subversion进行自动安装
二、安装Apache
1.从Apache主页 下载最新版本的安装程序
2.如果是Windows平台,直接运行安装程序
3.如果是一般的Linux平台:
1)执行tar -zxvf httpd.xxx.tar.gz进行解压
2)执行cd httpd.xxx切换到解压后的目录
3)执行./configure –prefix=/opt/httpd进行配置设定,并指明安装目录
4)执行make进行编译
5)执行make install 进行安装
4.如果是Fedora Linux,可以直接执行yum install httpd进行自动安装(Fedora7以上的版本已自带
5.如果是Ubuntu Linux,可以直接执行sudo apt-get install apache2进行自动安装
三、创建数据仓库
1.执行mkdir /var/gftech/subversion/repos创建数据仓库的目录
2.执行svnadmin create /var/gftech/subversion/repos创建数据仓库,将自动生成几个文件和目录:
/conf
/db
/hooks
四、独立启动方式
独立启动方式是做为一个单独的服务程序,默认情况下通过本地端口3690来对外提供服务。
启动步骤:
1.执行svnserve -d -r /var/gftech/subversion/repos以Daemon方式运行,默认情况下匿名访问
2.在Fedora中,可以用chkconfig把Subversion做一个服务程序,随系统自动启动:
1)以root帐号登录
2)执行cd /etc/rc.d/init.d切换到服务程序所在目录
3)执行vi svnd进行文件编辑
4)添加下面的内容到svnd文件当中:
5)保存退出
6)执行chmod a+x svnd 使之可执行
7)执行chkconfig –add svnd添加该服务到系统当中
8)执行chkconfig –list svnd查看该服务
9)执行service svnd start可以启动该服务
10)执行service svnd stop可以停止该服务
在进行源代码管理时,为了安全起见,需要对用户的权限进行控制,主要通过三个配置文件来实 现,svnservice.conf、passwd、authz,第一个文件指明是否需要进行访问控制以及第二、三个文件的位置,第二个文件存放用户帐号 信息,第三个文件存放用户的访问权限,具体配置如下:
1.打开svnserve.conf文件,把auth-access=write前面的#号去掉,使受权用户可以进行写操作
2.把password-db=passwd前面的#号去掉,表明密码文件为当前目录下的passwd文件
3.把auth-db=authz前面的#号去掉,表明用户访问权限文件为当前目录下的authz文件
4.打开passwd文件,在末行添加需要的帐号,比如:test=123456
5.打开authz文件,在[/]一行下面添加test=rw,表明数据仓库的根目录下的所有目录,test都可进行读写操作
6.再添加一行*=r,表明其他帐号可以进行只读操作
7.在该文件中还可以为用户分组,添加到[groups]下面,比如:admin=sinboy,others=u1,u2
8.还可以对根目录下的子目录进行具体的权限控制,只需要添加相应目录,比如:
[/web]
u1=rw
*=
表明web子目录只允许u1帐号进行读写操作,禁止其他帐号访问
它的缺点是:
1.对外提供服务时,有可能受到防火墙的阻隔,造成服务无法访问
2.并且它的密码文件是明文显示,没有进行MD5加密,存在安全隐患
3.只能启动一个数据仓库,如果想要创建多个数据仓库,必须启动多个svnserve服务进程
五、结合Apache方式
结合Apache使用的方式,克服了svnserve方式的缺点,用户可以直接通过浏览器浏览源代码,还可以对浏览器访问进行SSL加密控制,更好的提高安全性
1.Apache本身不支持SVN,需要先安装mod_dav_svn模块
2.在Fedora下,执行yum install mod_dav_svn进行自动安装
3.确保/etc/httpd/moudles目录下有mod_dav_svn.so和mod_authz_svn.so
4.打开/etc/httpd/conf/httpd.conf文件,在LoadModule dav_module modules/mod_dav.so
一行下面添加下面两行内容:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

5.再添加如下内容:
<Location /svn>
DAV svn
SVNPath /var/gftech/subversion/repos

AuthzSVNAccessFile /var/gftech/subversion/repos/conf/access.auth
Satisfy Any
Require valid-user
AuthType Basic
AuthName &quot
;Subversion repositories”


AuthUserFile  /var/gftech/subversion/repos/conf/users.auth
Require valid-user
</Location>
6.切换到/var/gftech/subversion/repos/conf目录下
7.执行htpasswd -cb users.auth test 123456创建帐号文件
8.再次添加用户,去掉参数c即可:htpasswd -b users.auth test2 123456
9.执行service httpd restart启动Apache
10.在浏览器中输入http://host/svn打开SVN仓库,输入用户名密码进行访问
六、SVN客户端
推荐使用TortoiseSVN
七、其他文章推荐