随笔-179  评论-666  文章-29  trackbacks-0
  2011年12月19日
一、准备 正式开始前,编译环境gcc、g++等开发库需要提前安装。
nginx依赖以下模块: gzip模块需要 zlib 库 rewrite模块需要 pcre 库 ssl 功能需要openssl库
源码目录为:/usr/local/src
1、安装make yum -y install gcc automake autoconf libtool make
2、安装g++ yum install gcc gcc-c++
3、安装PCRE库 cd /usr/local/src wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.42.tar.gz tar -zxvf pcre-8.42.tar.gz cd pcre-8.42/ ./configure make && make install 出现如下报错: make[2]: *** [install-libLTLIBRARIES] Error 1 make[2]: Leaving directory `/usr/local/src/pcre-8.42' make[1]: *** [install-am] Error 2 make[1]: Leaving directory `/usr/local/src/pcre-8.42' make: *** [install] Error 2 权限不够,切换到root,重新make install即可。
4、安装zlib库 cd /usr/local/src wget http://zlib.net/zlib-1.2.11.tar.gz tar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11/ ./configure make && make install
5、安装OpenSSL库 cd /usr/local/src wget http://www.openssl.org/source/openssl-1.1.0h.tar.gz tar -zxvf openssl-fips-2.0.16.tar.gz cd openssl-fips-2.0.16/ ./config make && make install 编译安装 Openssl 1.1.1 支持国密标准 https://blog.51cto.com/1012682/2380553 6、创建用户及用户组 一般为了服务器安全,会指定一个普通用户权限的账号做为Nginx的运行角色,这里使用www用户做为Nginx工作进程的用户。后续安装的PHP也以www用户作为工作进程用户。 groupadd -r www useradd -r -g www www 二、NGINX 1、下载 cd /usr/local/src wget http://nginx.org/download/nginx-1.14.0.tar.gz tar –zxvf nginx-1.14.0.tar.gz cd nginx-1.14.0 2、配置 ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi make && make install nginx编译选项说明: --prefix表示nginx要安装到哪个路径下,这里指定刚才新建好的/alidata/server目录下的nginx-1.12.2; --sbin-path表示nginx的可执行文件存放路径 --conf-path表示nginx的主配置文件存放路径,nginx允许使用不同的配置文件启动,通过命令行中的-c选项 --pid-path表示nginx.pid文件的存放路径,将存储的主进程的进程号。安装完成后,可以随时改变的文件名 , 在nginx.conf配置文件中使用 PID指令。默认情况下,文件名 为prefix/logs/nginx.pid --error-log-path表示nginx的主错误、警告、和诊断文件存放路径 --http-log-path表示nginx的主请求的HTTP服务器的日志文件的存放路径 --user表示nginx工作进程的用户 --group表示nginx工作进程的用户组 --with-select_module或--without-select_module表示启用或禁用构建一个模块来允许服务器使用select()方法 --with-poll_module或--without-poll_module表示启用或禁用构建一个模块来允许服务器使用poll()方法 --with-http_ssl_module表示使用https协议模块。默认情况下,该模块没有被构建。建立并运行此模块的OpenSSL库是必需的 --with-pcre表示pcre的源码路径,因为解压后的pcre是放在root目录下的,所以是/root/pcre-8.41; --with-zlib表示zlib的源码路径,这里因为解压后的zlib是放在root目录下的,所以是/root/zlib-1.2.11 --with-openssl表示openssl库的源码路径 配置OK: Configuration summary + using PCRE library: /usr/local/src/pcre-8.42 + using OpenSSL library: /usr/local/src/openssl-1.1.0h + using zlib library: /usr/local/src/zlib-1.2.11 nginx path prefix: "/usr/local/nginx" nginx binary file: "/usr/local/nginx/sbin/nginx" nginx modules path: "/usr/local/nginx/modules" nginx configuration prefix: "/usr/local/nginx" nginx configuration file: "/usr/local/nginx/nginx.conf" nginx pid file: "/usr/local/nginx/nginx.pid" nginx error log file: "/usr/local/nginx/logs/error.log" nginx http access log file: "/usr/local/nginx/logs/access.log" nginx http client request body temporary files: "/var/tmp/nginx/client/" nginx http proxy temporary files: "/var/tmp/nginx/proxy/" nginx http fastcgi temporary files: "/var/tmp/nginx/fcgi/" nginx http uwsgi temporary files: "/var/tmp/nginx/uwsgi" nginx http scgi temporary files: "/var/tmp/nginx/scgi" 3、安装 make && make install 4、启动 /usr/local/nginx/sbin/nginx 启动时报错: nginx: [emerg] mkdir() "/var/tmp/nginx/client/" failed (2: No such file or directory) 手动创建该目录即可:mkdir -p /var/tmp/nginx/client 再次启动,打开浏览器访问此机器的IP,浏览器出现Welcome to nginx! 则表示 Nginx 已经安装并运行成功。
5、设置软连接 ln -sf /usr/local/nginx/sbin/nginx /usr/sbin 这样就可以直接执行nginx来启动了。
6、检测nginx nginx -t 显示: nginx: the configuration file /usr/local/nginx/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/nginx.conf test is successful 三、PHP 1、安装PHP需要的常用库 yum -y install libmcrypt-devel mhash-devel libxslt-devel 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 2、下载 cd /usr/local/src wget http://cn2.php.net/downloads.php/php-7.2.5.tar.gz tar -zxvf php-7.2.5.tar.gz 3、配置 ./configure --prefix=/usr/local/php \ --with-mysql=mysqlnd \ --enable-mysqlnd \ --with-gd \ --enable-gd-jis-conv \ --enable-fpm 4、安装 make && make install 安装信息如下: Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/ Installing PHP CLI binary: /usr/local/php/bin/ Installing PHP CLI man page: /usr/local/php/php/man/man1/ Installing PHP FPM binary: /usr/local/php/sbin/ Installing PHP FPM defconfig: /usr/local/php/etc/ Installing PHP FPM man page: /usr/local/php/php/man/man8/ Installing PHP FPM status page: /usr/local/php/php/php/fpm/ Installing phpdbg binary: /usr/local/php/bin/ Installing phpdbg man page: /usr/local/php/php/man/man1/ Installing PHP CGI binary: /usr/local/php/bin/ Installing PHP CGI man page: /usr/local/php/php/man/man1/ Installing build environment: /usr/local/php/lib/php/build/ Installing header files: /usr/local/php/include/php/ Installing helper programs: /usr/local/php/bin/ program: phpize program: php-config Installing man pages: /usr/local/php/php/man/man1/ page: phpize.1 page: php-config.1 Installing PEAR environment: /usr/local/php/lib/php/ [PEAR] Archive_Tar: upgrade to a newer version (1.4.3 is not newer than 1.4.3) [PEAR] Console_Getopt: upgrade to a newer version (1.4.1 is not newer than 1.4.1) [PEAR] Structures_Graph: upgrade to a newer version (1.1.1 is not newer than 1.1.1) [PEAR] XML_Util: upgrade to a newer version (1.4.2 is not newer than 1.4.2) [PEAR] PEAR: upgrade to a newer version (1.10.5 is not newer than 1.10.5) /usr/local/src/php-7.2.5/build/shtool install -c ext/phar/phar.phar /usr/local/php/bin ln -s -f phar.phar /usr/local/php/bin/phar Installing PDO headers: /usr/local/php/include/php/ext/pdo/ 5、添加环境变量 vim /etc/profile 在末尾加入 export PHP_HOME=/usr/local/php export PATH=/bin:/usr/bin:/usr/sbin:/sbin:$PATH:PHP_HOME/bin:$PHP_HOME/sbin 保存修改后,使用source命令重新加载配置文件: source /etc/profile 查看环境变量: echo $PATH 6、配置php-fpm cd /usr/local/php/etc cp php-fpm.conf.default php-fpm.conf cd php-fpm.d/ cp www.conf.default www.conf 使用vim命令对php-fpm.conf的内容进行如下修改: pid = /usr/local/php/var/run/php-fpm.pid 使用vim命令对php-fpm.conf的内容进行如下修改: user = www group = www 其他配置可根据需求进行修改,比如pm.max_children(php-fpm 能启动的子进程的最大数量)、pm.start_servers(php启动时,开启的子进程的数量)、pm.min_spare_servers(动态方式空闲状态下的最小php-fpm进程数量)、pm.max_spare_servers(动态方式空闲状态下的最大php-fpm进程数量)等。 7、启动php-fpm /usr/local/php/sbin/php-fpm 可以通过ps aux | grep php查看php进程。 https://www.cnblogs.com/sunshineliulu/p/8991957.html 三、MySQL https://blog.csdn.net/weixin_33859844/article/details/90948191 https://www.cnblogs.com/yangchunlong/p/8477743.html
posted @ 2019-08-13 17:37 Alpha 阅读(364) | 评论 (0)编辑 收藏

一、安装git服务器所需软件

打开终端输入以下命令:

ubuntu:~$ sudo apt-get install git-core openssh-server openssh-client
git-core是git版本控制核心软件

安装openssh-server和openssh-client是由于git需要通过ssh协议来在服务器与客户端之间传输文件

然后中间有个确认操作,输入Y后等待系统自动从镜像服务器中下载软件安装,安装完后会回到用户当前目录。如果

安装提示失败,可能是因为系统软件库的索引文件太旧了,先更新一下就可以了,更新命令如下:

ubuntu:~$ sudo apt-get update 

更新完软件库索引后继续执行上面的安装命令即可。

安装python的setuptools和gitosis,由于gitosis的安装需要依赖于python的一些工具,所以我们需要先安装python

的setuptools。

执行下面的命令:

ubuntu:~$ sudo apt-get install python-setuptools
这个工具比较小,安装也比较快,接下来准备安装gitosis,安装gitosis之前需要初始化一下服务器的git用户信息,这个随便填。

ubuntu:~$ git config --global user.name "myname"
ubuntu:~$ git config --global user.email "******@gmail.com"

初始化服务器用户信息后,就可以安装gitosis了,gitosis主要是用于给用户授权,设置权限也算是很方便的。

可以通过以下命令获取gitosis版本文件

ubuntu:~$ git clone https://github.com/res0nat0r/gitosis.git
注意:中间有两个是数字零

获取gitosis文件后,进入到文件目录下面

ubuntu:/tmp$ cd gitosis/

接着使用python命令安装目录下的setup.py的python脚本进行安装

ubuntu:/tmp/gitosis$ sudo python setup.py install

到这里,整个安装步骤就完成了,下面就开始对git进行一些基本的配置。

二、创建git管理员账户、配置git

创建一个账户(git)作为git服务器的管理员,可以管理其他用户的项目权限。

ubuntu:/tmp/gitosis$ sudo useradd -m git
ubuntu:/tmp/gitosis$ sudo passwd git

然后再/home目录下创建一个项目仓库存储点,并设置只有git用户拥有所有权限,其他用户没有任何权限。

ubuntu:/tmp/gitosis$ sudo mkdir /home/gitrepository
ubuntu:/tmp/gitosis$ sudo chown git:git /home/gitrepository/
ubuntu:/tmp/gitosis$ sudo chmod 700 /home/gitrepository/

由于gitosis默认状态下会将仓库放在用户的repositories目录下,例如git用户的仓库地址默认在/home/git/repositories/目录下,这里我们需要创建一个链接映射。让他指向我们前面创建的专门用于存放项目的仓库目录/home/gitrepository。

ubuntu:/tmp/gitosis$ sudo ln -s /home/gitrepository /home/git/repositories

这里我将在服务器端生成ssh公钥,如果想在其他机器上管理也可以在其他机器上生成一个ssh的公钥。

ubuntu:/home/git$ ssh-keygen -t rsa

这里会提示输入密码,我们不输入直接回车即可。

然后用刚生成公钥id_rsa.pub来对gitosis进行初始化。

向gitosis添加公钥并初始化:

$ cp ~/.ssh/id_rsa.pub /tmp

$ sudo -H -u gitadmin gitosis-init < /tmp/id_rsa.pub

Ubuntu完美搭建Git服务器

出现如上信息说明gitosis已经初始化成功。

gitosis主要是通过gitosis-admin.git仓库来管理一些配置文件的,如用户权限的管理。这里我们需要对其中的一个post-update文件添加可执行的权限。

ubuntu:/home/git$ sudo chmod 755 /home/gitrepository/gitosis-admin.git/hooks/post-update

三、服务器上创建项目仓库

使用git账户在服务器上创建一个目录(mytestproject.git)并初始化成git项目仓库。

ubuntu:/home/git$ su git
$ cd /home/gitrepository
$ mkdir mytestproject.git
$ git init --bare mytestproject.git
$ exit

如果出现以下信息就说明已经成功创建了一个名为mytestproject.git的项目仓库了,新建的这个仓库暂时还是空的,不能被客户端clone,还需要对gitosis进行一些配置操作。

四、使用gitosis管理用户操作项目的权限

首先需要在前面生成ssh公钥(用来初始化gitosis)的机器上将gitosis-admin.git的仓库clone下来。

在客户端机器上新建一个目录用于存放gitosis-admin.git仓库

ubuntu:~$ mkdir gitadmin
ubuntu:~$ cd gitadmin/
ubuntu:~/gitadmin$ git clone git@192.168.1.106:gitosis-admin.git

clone正确会显示以下信息

Ubuntu完美搭建Git服务器

clone下来会有一个gitosis.conf的配置文件和一个keydir的目录。gitosis.conf用于配置用户的权限信息,keydir主要用户存放ssh公钥文件(一般以“用户名.pub”命名,gitosis.conf配置文件中需使用相同用户名),用于认证请求的客户端机器。

现在让需要授权的用户使用前面的方式各自在其自己的机器上生成相应的ssh公钥文件,管理员把他们分别按用户名命名好,复制到keydir目录下。

ubuntu:~$ cp /home/aaaaa/Desktop/zhangsan.pub /home/aaaaa/gitadmin/gitosis-admin/keydir/

ubuntu:~$ cp /home/aaaaa/Desktop/lisi.pub /home/aaaaa/gitadmin/gitosis-admin/keydir/

继续编辑gitosis.conf文件

[gitosis]

[group gitosis-admin] 
####管理员组
members = charn@ubuntu 
####管理员用户名,需要在keydir目录下找到相应的.pub文件,多个可用空格隔开(下同)
writable = gitosis-admin####可写的项目仓库名,多个可用空格隔开(下同)

[group testwrite] 
####可写权限组
members = zhangsan####组用户
writable = mytestproject####可写的项目仓库名

[group
 testread] ####只读权限组
members =lisi####组用户
readonly= mytestproject####只读项目仓库名

因为这些配置的修改只是在本地修改的,还需要推送到服务器中才能生效。

ubuntu:~/gitadmin/gitosis-admin$ git add .
ubuntu:~/gitadmin/gitosis-admin$ git commit -am "add a user permission"
ubuntu:~/gitadmin/gitosis-admin$ git push origin master

推送成功会显示下面提示信息

Ubuntu完美搭建Git服务器

又是后新增的用户不能立即生效,这时候需要重新启动一下sshd服务

ubuntu:~/gitadmin/gitosis-admin$ sudo /etc/init.d/ssh restart

现在,服务端的git就已经安装和配置完成了,接下来就需要有权限的组成员在各自的机器上clone服务器上的相应

项目仓库进行相应的工作了。

五、客户端(windows)使用git

下载安装windows版本的git客户端软件,下载地址:http://msysgit.github.io/

安装完成后右键菜单会出现几个git相关的菜单选项,我们主要使用其中的git
 bash通过命令行来进行操作。

在本地新建一个目录,使用git初始化这个目录,然后再里面新建一个文本文件用于测试,最后关联到git服务器仓库

中的相关项目,最后上传本地版本到服务器。

$ mkdir testgit
$ cd testgit
$ git init
$ echo "this is a test text file,will push to server" > hello.txt
$ git add .
$ git commit -am "init a base version,add a first file for push to server"
$ git remote add origin git@serverip:mytestproject.git
$ git push origin master

这样服务端就创建好了一个mytestproject.git的仓库的基础版本了,现在其他组员只要从服务端进行clone就可以了。

window下面进入到需要克隆的本地目录下面右键选择git bash选项,输入

$ git clone git@serverip:mytestproject.git

就可以把项目clone到本地仓库了。

下面进行简单的修改和提交操作

$ cd mytestproject
$ echo "this is another text file created by other" >another.txt
$ git add .
$ git commit -am "add a another file by other"
$ git push origin master

最后推送到服务器成功会显示如下信息

Ubuntu完美搭建Git服务器


gitolite搭建git仓库(服务端+客户端)

http://blog.csdn.net/ChiChengIT/article/details/49863383

posted @ 2018-03-13 15:35 Alpha 阅读(1151) | 评论 (0)编辑 收藏
     摘要: Git 教程http://www.runoob.com/git/git-tutorial.htmlGit本地服务器搭建及使用Git是一款免费、开源的分布式版本控制系统。众所周知的Github便是基于Git的开源代码库以及版本控制系统,由于其远程托管服务仅对开源免费,所以搭建本地Git服务器也是个较好的选择,本文将对此进行详细讲解。(推荐一家提供私有源代码免费托管的网站:Bitbucket,目前支持...  阅读全文
posted @ 2018-03-08 10:44 Alpha 阅读(3205) | 评论 (0)编辑 收藏
1.查看内存  free
2.查看cpu  cat cpuinfo
3.查看磁盘  fdisk -l
4.查看带宽  iptraf-ng
5.查看负载  top
6.查看请求数  netstat  -anp | wc -l
7.查看请求详情  netstat  -anp
8.查看某个程序请求数  netstat -anp | grep php |wc -l
9.查看磁盘使用情况  df -h
10.查看系统日志  dmesg
11.查看进程数量  ps aux | wc -l
12.查看运行网络程序 ps auxww | more
13.
查看php运行程序 ps auxww | grep php
14.查看php运行程序数量 ps auxww | grep php | wc -l
15.查看init.d运行  
ls -al /etc/init.d/
16.查找文件路径   find / -name php.ini
17.查看mysql端口   netstat -anp | grep 3306
18.查看本机ip地址  ip add
19.查找某个字符串在文件中出现的  grep 127.0.0.1:9000  *.conf
20.

posted @ 2017-12-25 10:16 Alpha 阅读(599) | 评论 (0)编辑 收藏

一、背景

系统管理员,最谨慎的linux就是rm命令了,一不小心数据就没干掉,最恐怖的是数据没有备份,没法还原了,此类事情发生的太多了,针对于此,我们经过多次尝试演练,终于成功的把大部分删除的数据找回来了,下面我把演练过程给大家介绍一下。

二、安装恢复软件

extundelete,该工具官方给出的是可以恢复ext3或者ext4文件系统被删除的文件。

1:通过命令安装

#yum install extundelete -y

2:通过源码编译安装

#yum -y install e2fsprogs-devel e2fsprogs  #wget http://zy-res.oss-cn-hangzhou.aliyuncs.com/server/extundelete-0.2.4.tar.bz2 #tar -xvjf extundelete-0.2.4.tar.bz2 #cd extundelete-0.2.4 #./configure #make &&make install

三、删除数据查找

首先,我们先删除一个文件,如图:

Linux怎样恢复误删除的数据

如上图,我们刚才在/boot目录下删除了个symvers-2.6.32-431.el6.x86_64.gz文件,/boot是落到/dev/sda1下

在Linux下可以通过“ls -id”命令来查看某个文件或者目录的inode值,例如查看根目录的inode值,可以输入:

[root@cloud boot]# ls -id /boot 2 /boot

注:根目录的inode一般为2

然后我们开始查找被删除的文件,需要根据分区inode查找,命令如下:

#extundelete /dev/sda1 --inode 2

结果如下图:

Linux怎样恢复误删除的数据

我们就可以看到标识为Deleted的被删除数据了。

四、数据恢复

我们就开始恢复,命令如下:

#extundelete /dev/sda1 --restore-file symvers-2.6.32-431.el6.x86_64.gz

如图:

Linux怎样恢复误删除的数据

Linux怎样恢复误删除的数据

还原成功

当然,还有可能删除整个文件夹,我们也举个例子,如下:

#extundelete /dev/sda1 --restore-directory test

恢复全部删除数据,如下:

#extundelete /dev/sdb1 --restore-all

也可以通过时间段恢复,这里就不说了,参数如下:

--version, -[vV],显示软件版本号。 --help,显示软件帮助信息。 --superblock,显示超级块信息。 --journal,显示日志信息。 --after dtime,时间参数,表示在某段时间之后被删的文件或目录。 --before dtime,时间参数,表示在某段时间之前被删的文件或目录。 动作(action)有: --inode ino,显示节点“ino”的信息。 --block blk,显示数据块“blk”的信息。 --restore-inode ino[,ino,...],恢复命令参数,表示恢复节点“ino”的文件,恢复的文件会自动放在当前目录下的RESTORED_FILES文件夹中,使用节点编号作为扩展名。 --restore-file 'path',恢复命令参数,表示将恢复指定路径的文件,并把恢复的文件放在当前目录下的RECOVERED_FILES目录中。 --restore-files 'path',恢复命令参数,表示将恢复在路径中已列出的所有文件。 --restore-all,恢复命令参数,表示将尝试恢复所有目录和文件。 -j journal,表示从已经命名的文件中读取扩展日志。 -b blocknumber,表示使用之前备份的超级块来打开文件系统,一般用于查看现有超级块是不是当前所要的文件。 -B blocksize,通过指定数据块大小来打开文件系统,一般用于查看已经知道大小的文件。

五、总结

数据恢复,不一定能全部将数据恢复回来,还是一句话,操作要谨慎。万一操作失误,也不要慌,将损失减少到最小,首先停止所有操作,其次让专业人员去处理。

阿里云服务器优惠券

posted @ 2017-12-23 16:11 Alpha 阅读(1959) | 评论 (0)编辑 收藏
阿里云服务器优惠券
  1. 安裝 nginx 
    CentOS 7 沒有內建的 nginx,所以先到 nginx 官網  http://nginx.org/en/linux_packages.html#stable ,找到 CentOS 7 的 nginx-release package 檔案連結,然後如下安裝
    rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
    安裝後,會自動產生 yum 的 repository 設定(在 /etc/yum.repos.d/nginx.repo), 
    接下來便可以使用 yum 指令安裝 nginx
    yum install nginx
  2. 啟動 nginx 
    以前用 chkconfig 管理服務,CentOS 7 改用 systemctl 管理系統服務 
    立即啟動
    systemctl start nginx
    查看目前運作狀態
    systemctl status nginx
    查看 nginx 服務目前的啟動設定
    systemctl list-unit-files | grep nginx
    若是 disabled,可以改成開機自動啟動
    systemctl enable nginx
    若有設定防火牆,查看防火牆運行狀態,看是否有開啟 nginx 使用的 port
    firewall-cmd --state
    永久開放開啟防火牆的 http 服務
    firewall-cmd --permanent --zone=public --add-service=http
    firewall-cmd --reload
    列出防火牆 public 的設定
    firewall-cmd --list-all --zone=public
    經過以上設定,應該就可以使用瀏覽器訪問 nginx 的預設頁面。
  3. 安裝 PHP-FPM 
    使用 yum 安裝 php、php-fpm、php-mysql
    yum install php php-fpm php-mysql
    查看 php-fpm 服務目前的啟動設定 
    systemctl list-unit-files | grep php-fpm
    改成開機自動啟動
    systemctl enable php-fpm
    立即啟動
    systemctl start php-fpm
    查看目前運作狀態
    systemctl status php-fpm
  4. 修改 PHP-FPM listen 的方式 
    若想將 PHP-FPM listen 的方式,改成 unix socket,可以編輯 /etc/php-fpm.d/www.conf 
    listen = 127.0.0.1:9000
    改成
    listen = /var/run/php-fpm/php-fpm.sock
    然後重新啟動 php-fpm
    systemctl restart php-fpm
    註:不要改成 listen = /tmp/php-fcgi.sock (將 php-fcgi.sock 設定在 /tmp 底下), 因為系統產生 php-fcgi.sock 時,會放在 /tmp/systemd-private-*/tmp/php-fpm.sock 隨機私有目錄下, 除非把 /usr/lib/systemd/system/ 裡面的 PrivateTmp=true 設定改成 PrivateTmp=false, 但還是會產生其他問題,所以還是換個位置最方便 


    删除之前的版本

    # yum remove php*

    rpm 安装 Php7 相应的 yum源

    CentOS/RHEL 7.x:

    # rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm # rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

    CentOS/RHEL 6.x:
    # rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm

    yum安装php7

    yum install php70w php70w-opcache
    安装其他插件(选装)
    注:如果安装pear,需要安装php70w-devel
    php70w
    php70w-bcmath
    php70w-cli
    php70w-common
    php70w-dba
    php70w-devel
    php70w-embedded
    php70w-enchant
    php70w-fpm
    php70w-gd
    php70w-imap
    php70w-interbase
    php70w-intl
    php70w-ldap
    php70w-mbstring
    php70w-mcrypt
    php70w-mysql
    php70w-mysqlnd
    php70w-odbc
    php70w-opcache
    php70w-pdo
    php70w-pdo_dblib
    php70w-pear
    php70w-pecl-apcu
    php70w-pecl-imagick
    php70w-pecl-xdebug
    php70w-pgsql
    php70w-phpdbg
    php70w-process
    php70w-pspell
    php70w-recode
    php70w-snmp
    php70w-soap
    php70w-tidy
    php70w-xml
    php70w-xmlrp

    编译安装php7

    配置(configure)、编译(make)、安装(make install)

    使用configure --help

    编译安装一定要指定定prefix,这是安装目录,会把所有文件限制在这个目录,卸载时只需要删除那个目录就可以,如果不指定会安装到很多地方,后边删除不方便。

    Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print `checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [/usr/local] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX

    注意
    内存小于1G安装往往会出错,在编译参数后面加上一行内容--disable-fileinfo

    其他配置参数

    --exec-prefix=EXEC-PREFIX
    可以把体系相关的文件安装到一个不同的位置,而不是PREFIX设置的地方.这样做可以比较方便地在不同主机之间共享体系相关的文件
    --bindir=DIRECTORY
    为可执行程序声明目录,缺省是 EXEC-PREFIX/bin
    --datadir=DIRECTORY
    设置所安装的程序需要的只读文件的目录.缺省是 PREFIX/share
    --sysconfdir=DIRECTORY
    用于各种各样配置文件的目录,缺省为 PREFIX/etc
    --libdir=DIRECTORY
    库文件和动态装载模块的目录.缺省是 EXEC-PREFIX/lib
    --includedir=DIRECTORY
    C 和 C++ 头文件的目录.缺省是 PREFIX/include
    --docdir=DIRECTORY
    文档文件,(除 “man(手册页)”以外, 将被安装到这个目录.缺省是 PREFIX/doc
    --mandir=DIRECTORY
    随着程序一起带的手册页 将安装到这个目录.在它们相应的manx子目录里. 缺省是PREFIX/man
    注意: 为了减少对共享安装位置(比如 /usr/local/include) 的污染,configure 自动在 datadir, sysconfdir,includedir, 和 docdir 上附加一个 “/postgresql” 字串, 除非完全展开以后的目录名字已经包含字串 “postgres” 或者 “pgsql”.比如,如果你选择 /usr/local 做前缀,那么 C 的头文件将安装到 /usr/local/include/postgresql, 但是如果前缀是 /opt/postgres,那么它们将 被放进 /opt/postgres/include
    --with-includes=DIRECTORIES
    DIRECTORIES 是一系列冒号分隔的目录,这些目录将被加入编译器的头文件 搜索列表中.如果你有一些可选的包(比如 GNU Readline)安装在 非标准位置,你就必须使用这个选项,以及可能还有相应的 --with-libraries 选项.
    --with-libraries=DIRECTORIES
    DIRECTORIES 是一系列冒号分隔的目录,这些目录是用于查找库文件的. 如果你有一些包安装在非标准位置,你可能就需要使用这个选项 (以及对应的--with-includes选项)
    --enable-XXX
    打开XXX支持
    --with-XXX
    制作XXX模块

    • PHP FPM設定參考
      [global]
               pid = /usr/local/php/var/run/php-fpm.pid
               error_log = /usr/local/php/var/log/php-fpm.log
               [www]
               listen = /var/run/php-fpm/php-fpm.sock
               user = www
               group = www
               pm = dynamic
               pm.max_children = 800
               pm.start_servers = 200
               pm.min_spare_servers = 100
               pm.max_spare_servers = 800
               pm.max_requests = 4000
               rlimit_files = 51200
               listen.backlog = 65536
               ;設 65536 的原因是-1 可能不是unlimited
               ;說明 http://php.net/manual/en/install.fpm.configuration.php#104172
               slowlog = /usr/local/php/var/log/slow.log
               request_slowlog_timeout = 10
    • nginx.conf 設定參考 
      user nginx;
               worker_processes 8;
               error_log /var/log/nginx/error.log warn;
               pid /var/run/nginx.pid;
               events {
                use epoll;
                worker_connections 65535;
               }
               worker_rlimit_nofile 65535;
               #若沒設定,可能出現錯誤:65535 worker_connections exceed open file resource limit: 1024
               http {
                include /etc/nginx/mime.types;
                default_type application/octet-stream;
                log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';
                access_log /var/log/nginx/access.log main;
                sendfile on;
                tcp_nopush on;
                keepalive_timeout 65;
                server_names_hash_bucket_size 128;
                client_header_buffer_size 32k;
                large_client_header_buffers 4 32k;
                client_max_body_size 8m;
                server_tokens off;
                client_body_buffer_size 512k;
                # fastcgi
                fastcgi_connect_timeout 300;
                fastcgi_send_timeout 300;
                fastcgi_read_timeout 300;
                fastcgi_buffer_size 64k;
                fastcgi_buffers 4 64k;
                fastcgi_busy_buffers_size 128k;
                fastcgi_temp_file_write_size 128k;
                fastcgi_intercept_errors on;
                #gzip (說明 http://nginx.org/en/docs/http/ngx_http_gzip_module.html)
                gzip off;
                gzip_min_length 1k;#1k以上才壓縮
                gzip_buffers 32 4k;
                 #http://stackoverflow.com/questions/4888067/how-to-get-linux-kernel-page-size-programatically
                 #使用 getconf PAGESIZE 取得系統 one memory page size,
                gzip_http_version 1.0;
                gzip_comp_level 2;
                gzip_types text/css text/xml application/javascript application/atom+xml application/rss+xml text/plain application/json;
                 #查看 nginx 的 mime.types 檔案(/etc/nginx/mime.types),裡面有各種類型的定義
                gzip_vary on;
                include /etc/nginx/conf.d/*.conf;
               }
               
      若出現出現錯誤:setrlimit(RLIMIT_NOFILE, 65535) failed (1: Operation not permitted) 
      先查看目前系統的設定值
      ulimit -n
      若設定值太小,修改 /etc/security/limits.conf
      vi /etc/security/limits.conf
      加上或修改以下兩行設定
      * soft nofile 65535
               * hard nofile 65535



阿里云服务器优惠券
posted @ 2016-08-10 13:44 Alpha 阅读(5983) | 评论 (0)编辑 收藏
阿里云服务器优惠券

1.关于Tomcat的session数目 
这个可以直接从Tomcat的web管理界面去查看即可 
或者借助于第三方工具Lambda Probe来查看,它相对于Tomcat自带的管理稍微多了点功能,但也不多 

2.监视Tomcat的内存使用情况 
使用JDK自带的jconsole可以比较明了的看到内存的使用情况,线程的状态,当前加载的类的总量等 
JDK自带的jvisualvm可以下载插件(如GC等),可以查看更丰富的信息。如果是分析本地的Tomcat的话,还可以进行内存抽样等,检查每个类的使用情况 

3.打印类的加载情况及对象的回收情况 
这个可以通过配置JVM的启动参数,打印这些信息(到屏幕(默认也会到catalina.log中)或者文件),具体参数如下: 
-XX:+PrintGC:输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs] 
-XX:+PrintGCDetails:输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs] 
-XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可与上面两个混合使用,输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs] 
-XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用。输出形式:Application time: 0.5291524 seconds 
-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。可与上面混合使用。输出形式:Total time for which application threads were stopped: 0.0468229 seconds 
-XX:PrintHeapAtGC: 打印GC前后的详细堆栈信息 
-Xloggc:filename:与上面几个配合使用,把相关日志信息记录到文件以便分析 

-verbose:class 监视加载的类的情况 
-verbose:gc 在虚拟机发生内存回收时在输出设备显示信息 
-verbose:jni 输出native方法调用的相关情况,一般用于诊断jni调用错误信息 

4.添加JMS远程监控 
对于部署在局域网内其它机器上的Tomcat,可以打开JMX监控端口,局域网其它机器就可以通过这个端口查看一些常用的参数(但一些比较复杂的功能不支持),同样是在JVM启动参数中配置即可,配置如下: 
-Dcom.sun.management.jmxremote.ssl=false  -Dcom.sun.management.jmxremote.authenticate=false 
-Djava.rmi.server.hostname=192.168.71.38 设置JVM的JMS监控监听的IP地址,主要是为了防止错误的监听成127.0.0.1这个内网地址 
-Dcom.sun.management.jmxremote.port=1090 设置JVM的JMS监控的端口 
-Dcom.sun.management.jmxremote.ssl=false 设置JVM的JMS监控不实用SSL 
-Dcom.sun.management.jmxremote.authenticate=false 设置JVM的JMS监控不需要认证 


5.专业点的分析工具有 
IBM ISA,JProfiler等,具体监控及分析方式去网上搜索即可。 

 

 

集群方案

单个Tomcat的处理性能是有限的,当并发量较大的时候,就需要有部署多套来进行负载均衡了。 

集群的关键点有以下几点: 
1.引入负载端 
软负载可以使用nginx或者apache来进行,主要是使用一个分发的功能 
参考: 
http://ajita.iteye.com/blog/1715312(nginx负载) 
http://ajita.iteye.com/blog/1717121(apache负载) 

2.共享session处理 
目前的处理方式有如下几种: 
1).使用Tomcat本身的Session复制功能 
参考http://ajita.iteye.com/blog/1715312(Session复制的配置) 
方案的有点是配置简单,缺点是当集群数量较多时,Session复制的时间会比较长,影响响应的效率 
2).使用第三方来存放共享Session 
目前用的较多的是使用memcached来管理共享Session,借助于memcached-sesson-manager来进行Tomcat的Session管理 
参考http://ajita.iteye.com/blog/1716320(使用MSM管理Tomcat集群session) 
3).使用黏性session的策略 
对于会话要求不太强(不涉及到计费,失败了允许重新请求下等)的场合,同一个用户的session可以由nginx或者apache交给同一个Tomcat来处理,这就是所谓的session sticky策略,目前应用也比较多 
参考:http://ajita.iteye.com/blog/1848665(tomcat session sticky) 
nginx默认不包含session sticky模块,需要重新编译才行(windows下我也不知道怎么重新编译) 
优点是处理效率高多了,缺点是强会话要求的场合不合适 

3.小结 
以上是实现集群的要点,其中1和2可以组合使用,具体场景具体分析吧~

 

JVM优化

Tomcat本身还是运行在JVM上的,通过对JVM参数的调整我们可以使Tomcat拥有更好的性能。针对JVM的优化目前主要在两个方面: 

1.内存调优 
内存方式的设置是在catalina.sh中,调整一下JAVA_OPTS变量即可,因为后面的启动参数会把JAVA_OPTS作为JVM的启动参数来处理。 

具体设置如下: 
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4" 

其各项参数如下: 
-Xmx3550m:设置JVM最大可用内存为3550M。 
-Xms3550m:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 
-Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。 
-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。 

-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5 
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6 
-XX:MaxPermSize=16m:设置持久代大小为16m。 
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。 


2.垃圾回收策略调优 
垃圾回收的设置也是在catalina.sh中,调整JAVA_OPTS变量。 
具体设置如下: 
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100" 
具体的垃圾回收策略及相应策略的各项参数如下: 

串行收集器(JDK1.5以前主要的回收方式) 
-XX:+UseSerialGC:设置串行收集器 

并行收集器(吞吐量优先) 
示例: 
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100 

-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。 
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。 
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集 
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。 
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。 

并发收集器(响应时间优先) 
示例:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC 
-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。 
-XX:+UseParNewGC: 设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。 
-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。 
-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片 

3.小结 
在内存设置中需要做一下权衡 
1)内存越大,一般情况下处理的效率也越高,但同时在做垃圾回收的时候所需要的时间也就越长,在这段时间内的处理效率是必然要受影响的。 
2)在大多数的网络文章中都推荐 Xmx和Xms设置为一致,说是避免频繁的回收,这个在测试的时候没有看到明显的效果,内存的占用情况基本都是锯齿状的效果,所以这个还要根据实际情况来定。

 

Server.xml的Connection优化

Tomcat的Connector是Tomcat接收HTTP请求的关键模块,我们可以配置它来指定IO模式,以及处理通过这个Connector接受到的请求的处理线程数以及其它一些常用的HTTP策略。其主要配置参数如下: 

1.指定使用NIO模型来接受HTTP请求 
protocol="org.apache.coyote.http11.Http11NioProtocol" 指定使用NIO模型来接受HTTP请求。默认是BlockingIO,配置为protocol="HTTP/1.1" 
acceptorThreadCount="2" 使用NIO模型时接收线程的数目 

2.指定使用线程池来处理HTTP请求 
首先要配置一个线程池来处理请求(与Connector是平级的,多个Connector可以使用同一个线程池来处理请求) 
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
maxThreads="1000" minSpareThreads="50" maxIdleTime="600000"/> 
<Connector port="8080"
executor="tomcatThreadPool" 指定使用的线程池 

3.指定BlockingIO模式下的处理线程数目 
maxThreads="150"//Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值200。可以根据机器的时期性能和内存大小调整,一般可以在400-500。最大可以在800左右。 
minSpareThreads="25"---Tomcat初始化时创建的线程数。默认值4。如果当前没有空闲线程,且没有超过maxThreads,一次性创建的空闲线程数量。Tomcat初始化时创建的线程数量也由此值设置。 
maxSpareThreads="75"--一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值50。一旦创建的线程超过此数值,Tomcat会关闭不再需要的线程。线程数可以大致上用 “同时在线人数*每秒用户操作次数*系统平均操作时间” 来计算。 
acceptCount="100"----指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10。如果当前可用线程数为0,则将请求放入处理队列中。这个值限定了请求队列的大小,超过这个数值的请求将不予处理。 
connectionTimeout="20000" --网络连接超时,默认值20000,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。 

4.其它常用设置 
maxHttpHeaderSize="8192" http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。 
URIEncoding="UTF-8" 指定Tomcat容器的URL编码格式。 
disableUploadTimeout="true" 上传时是否使用超时机制 
enableLookups="false"--是否反查域名,默认值为true。为了提高处理能力,应设置为false 
compression="on"   打开压缩功能 
compressionMinSize="10240" 启用压缩的输出内容大小,默认为2KB 
noCompressionUserAgents="gozilla, traviata"   对于以下的浏览器,不启用压缩 
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些资源类型需要压缩 

5.小结 
关于Tomcat的Nio和ThreadPool,本身的引入就提高了处理的复杂性,所以对于效率的提高有多少,需要实际验证一下。 

6.配置示例 
<Connector port="8080" 
redirectPort="8443"
maxThreads="150" 
minSpareThreads="25" 
maxSpareThreads="75" 
acceptCount="100" 
connectionTimeout="20000" 
protocol="HTTP/1.1" 

maxHttpHeaderSize="8192" 
URIEncoding="UTF-8" 
disableUploadTimeout="true" 
enableLookups="false" 
compression="on" 
compressionMinSize="10240" 
noCompressionUserAgents="gozilla, traviata" 
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"> 
... 
</Connector>

 

 

管理AJP端口

AJP是为 Tomcat 与 HTTP 服务器之间通信而定制的协议,能提供较高的通信速度和效率。如果tomcat前端放的是apache的时候,会使用到AJP这个连接器。由于我们公司前端是由nginx做的反向代理,因此不使用此连接器,因此需要注销掉该连接器。

<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->



默认 Tomcat 是开启了对war包的热部署的。为了防止被植入木马等恶意程序,因此我们要关闭自动部署。

修改实例:

 <Host name="localhost" appBase="" unpackWARs="false" autoDeploy="false">

阿里云服务器优惠券
posted @ 2016-04-29 11:59 Alpha 阅读(2457) | 评论 (2)编辑 收藏
     摘要: 最新的版本可以在这里获取,目前下载的最新版本是5.08,更新于2016-02-03。在这里可以找到更多的说明。   下载好后,server端分为两个部分,一个是tracker,一个是storage。顾名思义,前者调度管理,负载均衡,后者则是实际的存储节点。两个都能做成集群,以防止单点故障。以前的4.x版本依赖libevent,现在不需要了,只需要libfastcommon。安装方法如下: 1....  阅读全文
posted @ 2016-04-07 13:58 Alpha 阅读(2797) | 评论 (2)编辑 收藏
     摘要: 1.第一步需要安装PPTP,以用来提供VPN服务. ? 1 sudo apt-get install pptpd ...  阅读全文
posted @ 2016-03-07 12:30 Alpha 阅读(528) | 评论 (0)编辑 收藏
1.# rpm -Uvh http://poptop.sourceforge.net/yum/stable/rhel6/pptp-release-current.noarch.rpm 
2. yum install pptpd 

3.配置pptp.首先我们要编辑/etc/pptpd.conf文件:

#vim /etc/pptpd.conf

找到”locapip”和”remoteip”这两个配置项,将前面的”;”注释符去掉,更改为你期望的IP段值.localip表示服务器的IP,remoteip表示分配给客户端的IP地址,可以设置为区间.这里我们使用pptp默认的配置:

localip 192.168.0.1

remoteip 192.168.0.234-238,192.168.0.245

注意,这里的IP段设置,将直接影响后面的iptables规则添加命令.请注意匹配的正确性,如果你嫌麻烦,建议就用本文的配置,就可以一直复制命令和文本使用了.

4.接下来我们再编辑/etc/ppp/options.pptpd文件,为VPN添加Google DNS:

#vim /etc/ppp/options.pptpd

在末尾添加下面两行:

ms-dns 8.8.8.8

ms-dns 8.8.4.4

5、设置pptp VPN账号密码.我们需要编辑/etc/ppp/chap-secrets这个文件:

#vim /etc/ppp/chap-secrets

在这个文件里面,按照”用户名 pptpd 密码 *”的形式编写,一行一个账号和密码.比如添加用户名为test,密码为1234的用户,则编辑如下内容:

test pptpd 1234 *

6、修改内核设置,使其支持转发.编辑/etc/sysctl.conf文件:

#vim /etc/sysctl.conf

将”net.ipv4.ip_forward”改为1,变成下面的形式.

net.ipv4.ip_forward=1

保存退出,并执行下面的命令来生效它:

#sysctl -p

7、添加iptables转发规则.经过前面的6个步骤,我们的VPN已经可以拨号了,但是还不能访问任何网页.最后一步就是添加iptables转发规则了,输入下面的指令:

#iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

需要注意的是,这个指令中的”192.168.0.0/24″是根据之前的配置文件中的”localip”网段来改变的,比如你设置的”10.0.0.1″网段,则应该改为”10.0.0.0/24″.此外还有一点需要注意的是eth0,如果你的外网网卡不是eth0,而是eth1(比如SoftLayer的服务器就是这样的情况),那么请记得将eth0也更改为对应的网卡编号,不然是上不了网的.

然后我们输入下面的指令让iptables保存我们刚才的转发规则,以便重启系统后不需要再次添加:

#/etc/init.d/iptables save

然后我们重启iptables:

#/etc/init.d/iptables restart

8、重启pptp服务.输入下面的指令重启pptp:

#/etc/init.d/pptpd restart

现在你已经可以连接自己的VPN并浏览网页了.不过我们还需要做最后的一步.

9、设置开机自动运行服务.我们最后一步是将pptp和iptables设置为开机自动运行,这样就不需要每次重启服务器后手动启动服务了,当然你不需要自动启动服务的话可以忽略这一步,输入指令:

#chkconfig pptpd on

#chkconfig iptables on

这样就大功告成了,赶快到Windows下建立一个VPN连接,IP填写自己的服务器IP,用户名和密码填写自己设置好的用户名和密码,点击”连接”,成功后就可以使用服务器去浏览网页啦.


备注:

多ip服务器转发指定规则

iptables -t nat -A POSTROUTING -s 192.168.8.0/24 -j SNAT --to-source 192.168.8.1

or

iptables -t nat -A POSTROUTING -s 192.168.8.0/24 -j SNAT --to-source 服务器外网ip

如果iphone之类的设备能连上,访问网页或者youtube特别慢,需要做如下修改:

vi /etc/ppp/ip-up

增加一行

/sbin/ifconfig $1 mtu 1400

或者修改iptables规则

iptables -A FORWARD -p tcp --syn -s 192.168.8.0/24 -j TCPMSS --set-mss 1356

1356的值可能需要自己调整,调节到能保证网络正常使用情况下的最大值




posted @ 2016-02-25 22:31 Alpha 阅读(497) | 评论 (0)编辑 收藏
     摘要: 关于IP Tables在初始化设置系统后,为了让系统更安全,Ubuntu把Iptabls作为发行版的默认防火墙。起初,尽管Ubuntu防火墙已经被配置了,但是它设置为通过一个虚拟主机允许所有的进入与流出流量。要打开服务器上某些更强的保护功能,我们需要在IP Table山增加一些基础的规则。IP Table 规则来自于一系列可以组合起来创建各自的特定的处理方法的选项。每一个通过防火墙的包被所有的规则...  阅读全文
posted @ 2015-10-31 15:51 Alpha 阅读(2552) | 评论 (0)编辑 收藏
我有一个阿里云推荐码,分享给大家免费使用,购买云服务器ECS或云数据库RDS可享受原价优惠,拿走不谢。
购买可以用阿里云主机推荐码

点击领取优惠券:
https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=dmb0rzcj&utm_source=dmb0rzcj

马上可享受优惠,购买阿里云主机马上给你省钱!



我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。
点击领取幸运券https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=dmb0rzcj&utm_source=dmb0rzcj


posted @ 2015-10-28 14:25 Alpha 阅读(693) | 评论 (0)编辑 收藏

安装 MySQL 5 数据库

安装 MySQL 运行命令:

sudo apt-get install mysql-server mysql-client

将mysql的datadir从默认的/var/lib/mysql 移到/app/data/mysql下,操作如下:
1.修改了/etc/mysql/my.cnf,改为:datadir = /app/data/mysql
2.cp -a /var/lib/mysql /app/data/
3./etc/init.d/mysql start


如果出现系统报错,无法启动mysql,日志显示为:Can't find file: "./mysql/plugin.frm'(errno:13)
[ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.

修改系统的chroot,需要修改/etc/apparmor.d下的相关文件,这里以mysql为例,需要修改:usr.sbin.mysqld和abstractions/mysql两个文件。

1.修改usr.sbin.mysqld里面的两行内容:/var/lib/mysql/ r,改为:/app/data/mysql/ r,/var/lib/mysql/** rwk,改为:/app/data/mysql/** rwk,
2.修改abstractions/mysql中一行:/var/lib/mysql/mysql.sock rw,改为:/app/data/mysql/mysql.sock rw,
3.重新加载apparmor服务:/etc/init.d/apparmor reload

安装 Nginx

在安装 Nginx 之前,如果你已经安装 Apache2 先删除在安装 nginx:

service apache2 stop
update-rc.d -f apache2 remove
sudo apt-get remove apache2

sudo apt-get install nginx

安装 PHP5

我们必须通过 PHP-FPM 才能让PHP5正常工作,安装命令:

sudo apt-get install php5-fpm

php-fpm是一个守护进程。

安装mysql和GD扩展

sudo apt-get install php5-gd libapache2-mod-auth-mysql php5-mysql openssl libssl-dev

sudo apt-get install curl libcurl3 libcurl3-dev php5-curl

安装 JDK8

可以通过访问Oracle官网下载,或者直接通过命令行下载。

lxh@ubuntu:~$ wget -c http://download.oracle.com/otn-pub/java/jdk/8u11-b12/jdk-8u25-linux-x64.tar.gz

解压安装

lxh@ubuntu:~$ mkdir -p /usr/lib/jvm 
lxh@ubuntu:~$ sudo mv jdk-8u25-linux-x64.tar.gz /usr/lib/jvm
lxh@ubuntu:~$ cd /usr/lib/jvm
lxh@ubuntu:~$ sudo tar xzvf jdk-8u25-linux-x64.tar.gz

在系统中添加环境变量,主要是PATH、CLASSPATH和JAVA_HOME。

lxh@ubuntu:~$ sudo vim ~/.profile

在文件最后加入

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_25/
export JRE_HOME=/usr/lib/jvm/jdk1.8.0_25/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH

保存退出,并通过命令使脚本生效:

lxh@ubuntu:~$ $source ~/.profile

配置默认JDK版本

在有的系统中会预装OpenJDK,系统默认使用的是这个,而不是刚才装的。所以这一步是通知系统使用Oracle的JDK,非OpenJDK。

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_25/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_25/bin/javac 300
sudo update-alternatives --config java

因为我是在虚拟机中安装的Ubuntu 14.04,默认不安装OpenJDK,所以没有需要选择的JDK版本。如果是在物理机上安装的Ubuntu版本,会出现几个候选项,可用于替换 java (提供 /usr/bin/java)。

====================================

编译安装nginx 
1. 下载最新版nginx
2.解压
3. 安装
$ ./configure  #检查编译前置条件
$ make  #编译
$ sudo make install  #使用sudo权限进行安装
安装后路径在 /usr/local/
启动nginx 
/usr/local/nginx/sbin/nginx
1)使用在 /etc/init.d/ 目录下创建名为 nginx 文件,注意没有后缀名,将以下内容复制到该文件中(感谢提供脚本的兄弟)。
 1 #! /bin/sh
 2 #用来将Nginx注册为系统服务的脚本
 3 #Author CplusHua
 4 #http://www.219.me
 5 #chkconfig: - 85 15
 6 set -e
 7 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 8 DESC="Nginx Daemon"
 9 NAME=nginx
10 DAEMON=/usr/local/nginx/sbin/$NAME
11 SCRIPTNAME=/etc/init.d/$NAME
12 #守护进程不存在就退出
13 test -x $DAEMON ||exit 0
14 d_start(){
15   $DAEMON ||echo -n "aready running"
16 }
17 d_stop(){
18   $DAEMON -s quit || echo -n "not running"
19 }
20 d_reload(){
21   $DAEMON -s reload || echo -n "could not reload"
22 }
23 case "$1" in
24   start)
25     echo -n "Starting $DESC: $NAME"
26     d_start
27     echo "."
28   ;;
29   stop)
30     echo -n "Stopping $DESC: $NAME"
31     d_stop
32     echo "."
33   ;;
34   reload)
35     echo -n "Reloading $DESC: configurationg.."
36     d_reload
37     echo "reloaded."
38   ;;
39   restart)
40     echo -n "Restarting $DESC: $NAME"
41     d_stop
42     sleep 3
43     d_start
44     echo "."
45   ;;
46   *)
47     echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2
48     exit 3
49   ;;
50 esac
51 
52 exit 0



2)添加权限
    $ sudo chmod +x nginx
3)服务方式启动 如果配置服务前已启动,执行以下命令停止Nginx。
    $ sudo service nginx stop
4)启动Nginx
    $ sudo service nginx start

pastingnginx出现connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied)的错误

处理方式是:编辑/etc/php5/fpm/pool.d/www.conf文件,

将以下的注释去掉:
    listen.owner = www-data
    listen.group = www-data
    listen.mode = 0660

然后重启php5-fpm
    $ sudo service php5-fpm restart


Ubuntu 14.04快速搭建SVN服务器及日常使用

SVN相关命令了解
svn:命令行客户端
    svnadmin:用来创建、调整或修复版本库的工具
    svnserve:svn服务程序
    svndumpfilter:过滤svn版本库转储数据流的工具
    svnsync:svn数据同步工具,实现另外存一份相同的
    svnlook:用来查看办本科中不同的修订版和事务

直接安装
    # apt-get install subversion
创建版本库
    # sudo mkdir /app/svn
    # sudo svnadmin create /app/svn/prj

配置版本库
  # sudo vi svnserve.conf  #将以下参数去掉注释 
  [general] 
  anon-access = none    #匿名访问权限,默认read,none为不允许访问 
  auth-access = write  #认证用户权限  
  password-db = passwd  #用户信息存放文件,默认在版本库/conf下面,也可以绝对路径指定文件位置 
  authz-db = authz

  # sudo vi passwd    #格式是用户名=密码,采用明文密码 
  [users] 
  xiaoming = 123 
  zhangsan = 123 
   lisi = 123

# sudo vi authz  
  [groups]          #定义组的用户 
  manager = xiaoming 
  core_dev = zhangsan,lisi 
  [repos:/]          #以根目录起始的repos版本库manager组为读写权限 
  @manager = rw 
  [repos:/media]    #core_dev对repos版本库下media目录为读写权限 
  @core_dev = rw

     
 启动svn服务

  # sudo svnserve -d -r /app/svn
  # 查看是否启动成功,可看的监听3690端口
  # sudo netstat -antp |grep svnserve
  tcp    0      0 0.0.0.0:3690    0.0.0.0:*      LISTEN    28967/svnserve 
  # 如果想关闭服务,可使用pkill svnserve

访问svn
  # 访问repos版本库地址
  svn://192.168.1.100/prj


备份与恢复
   svnadmin dump备份
  # 完整备份
  svnadmin dump /app/svn/prj > YYmmdd_fully_backup.svn
  # 完整压缩备份
  svnadmin dump /app/svn/prj | gzip > YYmmdd_fully_backup.gz
  # 备份恢复
  svnadmin load /app/svn/prj < YYmmdd_fully_backup.svn
  zcat YYmmdd_fully_backup.gz | svnadmin load repos
  ### 增量备份 ###
  # 先完整备份
  svnadmin dump /app/svn/prj -r 0:100 > YYmmdd_incremental_backup.svn
  # 再增量备份
  svnadmin dump /app/svn/prj -r 101:200 --incremental > YYmmdd_incremental_backup.svn
  
svnadmin hotcopy备份

  # 备份
  svnadmin hotcopy /app/svn/prj YYmmdd_fully_backup --clean-logs
  # 恢复
  svnadmin hotcopy YYmmdd_fully_backup /app/svn/prj


Tomcat 内存优化

Linux下修改JVM内存大小

要添加在tomcat 的bin 下catalina.sh 里,位置cygwin=false前 。注意引号要带上,红色的为新添加的.

# OS specific support. $var _must_ be set to either true or false.
JAVA_OPTS="-server -Xms512M -Xmx512M -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:PermSize=64M -XX:MaxPermSize=128m"
cygwin=false

 


posted @ 2015-10-07 15:28 Alpha 阅读(971) | 评论 (0)编辑 收藏
我本身是 Java 工程师出身,写代码至今已超过 15 年,创业也超过 10 年,曾经外包过很多项目给别人,也接过很多外包的项目,现在不接了,只经营电子报发送平台,在二年内累积超过 5000 家企业用户使用。身处在创业圈,只要有创业朋友主动问过我的,我都会和他说如果你能不接就不要接 ( 当然我也知道,如果不是为了活下去,谁愿意接 ? ),因为这其中有太多陷阱,我分享如下给大家作个参考: 

因为你写代码很快 

通常会出来接私活的工程师大多是有些年资,也会有自己擅常的工具及 library,所以往往可以很快完成主管交代的工作,会认为客户的需求只要能在很短的时间内完成,这个项目就赚钱了。 

【BUT】项目完成的快慢取决于客户的心情,只要他心情不好,就慢慢拖吧。你以为你的 Code 可以 reuse,最后你才发现真正被 reuse 的是你的肝。 

因为你写代码很快,所以只要客户比价、杀价、压你结案时间,你就会心里想一下:嗯,只要我努力赶一下,应该没问题。 

【BUT】,无形中你就牺牲了你的利润空间,只有赚到微利,你知道工程师估完成时间的准确率有多少吗 ? 准确率有多高,赚到微利的机率就有多高。 

因为你可以赚每年的维护费 

接私活是这样,只要你接了,之后的维护客户也很难不找你维护,只要慢慢的累积,每年都会有可观的维护费可以赚。 

【BUT】,你知道大部份台湾公司有个不成文规定,同一套系统的维护费预算是每年递减的,客户会想:系统每年调整也该稳定了吧,都稳定了你也没作什么事为什么还要拿这么多钱 ? 接下来,你可能会想说如果客户想加新功能第一个一定先找你,试想一下,叫你照着三年前自己写的代码架构来新增功能,如果没有吐血,大概代表这三年你也没什么长进。不接总行吧 ? 偏偏你就这么有责任感,你不接客户也只能打掉重来请别人重新作一套,你忍心吗 ? 所以你觉得这维护费好赚吗? 

因为你很能为客户着想 

你因为很为公司着想,常常在开发过程中发现缺了什么或是主管规划错了,你会主动的加班把这些缺的部份补上调好,公司对你赞誉有加,如果接私活的时候以这样的态度来对待自己的客户,那双方合作的感觉一定很好。 

【BUT】,你的客户当然好啊,因为你主动帮他加功能把系统调的更好,都不用再花钱啊。加钱 ? 合约当初就签好了,如何告诉客户要加钱 ? 况且这是你自己主动要加功能的。可以不加吗 ? 可以啊,但你可以忍受你的作品明明可以更好的而不让它更好吗 ? 如果是当初规划就错了,不调整能验收吗 ? 

因为你知道客户要什么 

因为在公司时主管常常也语无伦次,但你总是能分析出主管要的是什么,你也都能完成它,所以接私活时就算对方不懂技术,你也能完成他需要的功能。 

【BUT】,你知道客户要的是什么吗 ? 不,你不知道,因为绝大部份客户自己要什么都不知道,而且你知道客户的上面还有老板吗 ? 你知道客户的老板要的是什么吗 ? 不,你不会知道,因为连他老板自己都不知道,这是最可怕的吗 ? 不,还有更可怕的,他们会告诉你他们知道想要的功能是什么,但你就是无法作出他们想要的。 

因为你很能规划 

你是个逻辑观念很好的人,只要主管告诉你他的需求,你可以很快画出系统架构图、代码架构图甚至是资料库架构图,准确率非常高,所以接私活的时候只要客户告诉你需求,你很快脑中就会出现各种架构图雏形。 

【BUT】,你知道规格是谁开的吗 ? 对,是客户开的,因为他不开你就无法报价,如果他要你开,你也怕开完后报价他不接受就等于作白工了。那你觉得客户的逻辑会有你好吗 ? 所以通常你要作的是先了解客户的逻辑,然后找出矛盾的地方,然后提出更好的解决方桉,这一段来来回回就要花不少时间了,喔对,这一段通常是收不到钱的,客户会觉得你要接我的项目,你本来就要先来了解我的需求。 

因为你有团队 

因为你在业界有一定的人脉了,自己会写代码,再找个业务高手、美编高手,这样最小单位就好,大家可以分工,这样接私活的问题就变少、进行更顺利。 

【BUT】,因为你有三个人,所以你只能接可以养活 >= 3 个人的项目,这种项目通常会稍大一点,因为以上所述种种原因会造成结案很慢,如果不结案人卡在这个项目拿不到钱,新的项目接不了,怎么办 ? 对,加人,所以你的团队变成了 4 个人,接下来你只能接可以养活 >= 4 个人的项目,这个时候如果来了个大项目呢 ? 对,你会陷入无限迴圈,直到你再也接不到更大的项目。 

因为你想用客户的项目来练兵 

正如阿甘说的:人生就像一盒巧克力,你永远不知道下一个会是什么口味。所以你永远不知道下一个项目在那里,但当你开始有了团队,每个月都要付薪水时,这时来一个不大不小的项目,反正也不知道下一个项目何时进来,这个刚好可以付团队薪水又可以拿来练兵,这也蛮好的。 

【BUT】,接私活有个特性是你接了这个项目就会降低接下个项目的能力,因为人力及时间总是有限,如果你因为接了一个小项目造成大项目没人力接,你说大家气不气 ? 不幸这个小项目的业主特别麻烦 (基于上述原因,你知道这机率还不小),那你磨练团队的可不是他们的技术,你磨练的可是大家的身心灵啊,慢慢的就会有一股将相无能,累死三军的声音传出来了 … 你为何不自己开发个小产品来练兵呢 ? 

因为你应对客户有一套 

你的个性很好,以前在公司的时候都可以和厂商或客户相处很好,可以接的接,不可以接的也会挡,如果出来接私活和客户应对对不会有问题。 

【BUT】,客户百百款,你对客户有一套,客户对你可是有好几套,他可以议价、杀价、压时间、加功能、拖验收、会计不见、老板出国 …..,最后怪你为何拖这么久再扣你一笔钱,说了一句:你们不是专业的吗 ? 开发阶段你们是朋友,验收阶段你们就变甲乙双方。 

因为你从来不缺客户 

你从来不需要自己去陌生开发,客户都是透过朋友介绍或是客户转介绍来的,这比一般公司好太多了,别人想要客户都还没有呢。 

【BUT】,你有没有想过,你有上面所述种种优点,重点是你还比别人便宜,别人不找你,我都想找你了。所以你赚到钱了吗 ? 

因为你都有签合约 

为了避免以上不必要的问题,每个项目你一定都会签合约保护双方,凡事照合约走就没问题了。 

【BUT】,对方有法务你有吗 ? 对方有钱你有吗 ? 真正要打官司你打的起吗 ? 你真的有把握合作过程中你完全没错 ? 合约里有办法规范到所有的功能细节、操作流程 ? 合约订了一大本,你客户会和你签 ? 所以,你真的能照合约走吗 ? 

你最近一次开心写代码是什么时候 

在我和你有一样能力的时候,我曾经说过一句话:我希望我死前的最后一个动作是按下 【Enter】,我写代码的动力不是赚钱 ( 当然赚钱很重要,但如果只是赚钱,我大可去作直销、卖保险、到大公司上班 … ),精准来说不只是赚钱,我的动力来源来自于我写出来的代码可以让非常多人使用,真正帮助到很多人,而且很多人都说好。( 相信我,如果你真的作到这一点,其实你也赚到钱了 ) 

但自从我接私活之后,我最多只能帮助到我有限的客户,说精准一点也许就只有真正使用系统的某些人,也只有这些人会说我好,其它人也只会认为那是你该作的,但只要最后验收时他离职了、他生气了、一切努力就没了。所以那时我只有二个时候点是开心的,一个是收到订金、另一个是收到尾款,中间一大段时间是痛苦的,当同时多个项目进行,其实所有时间都是痛苦的。我还记得我那时常说的一句话:收到你冷冷的支票,我的心就觉得暖暖的。 

当然一定有人接私活接的很好,只是别人的成功很难複制,但别人的失败可以避免,如果你能避掉我以上所说的陷阱也无法保证你能成功,因为这也只是冰山一角,我已经离开接私活的状态很久,很多事忘了也不想去想,只是希望你在决定接私活前,仔细想一下,你真的只有接私活这个选项吗 ? 如果可以,我会建议你应该要开发自己的产品及服务。 

来自:電子豹博客 

posted @ 2015-06-10 14:28 Alpha 阅读(2221) | 评论 (0)编辑 收藏
阿里云服务器优惠券

fn:contains 判断字符串是否包含另外一个字符串 <c:if test="${fn:contains(name, searchString)}">
fn:containsIgnoreCase 判断字符串是否包含另外一个字符串(大小写无关) <c:if test="${fn:containsIgnoreCase(name, searchString)}">
fn:endsWith 判断字符串是否以另外字符串结束 <c:if test="${fn:endsWith(filename, ".txt")}">
fn:escapeXml 把一些字符转成XML表示,例如 <字符应该转为< ${fn:escapeXml(param:info)}
fn:indexOf 子字符串在母字符串中出现的位置 ${fn:indexOf(name, "-")}
fn:join 将数组中的数据联合成一个新字符串,并使用指定字符格开 ${fn:join(array, ";")}
fn:length 获取字符串的长度,或者数组的大小 ${fn:length(shoppingCart.products)}
fn:replace 替换字符串中指定的字符 ${fn:replace(text, "-", "?")}
fn:split 把字符串按照指定字符切分 ${fn:split(customerNames, ";")}
fn:startsWith 判断字符串是否以某个子串开始 <c:if test="${fn:startsWith(product.id, "100-")}">
fn:substring 获取子串 ${fn:substring(zip, 6, -1)}
fn:substringAfter 获取从某个字符所在位置开始的子串  ${fn:substringAfter(zip, "-")}
fn:substringBefore 获取从开始到某个字符所在位置的子串 ${fn:substringBefore(zip, "-")}
fn:toLowerCase 转为小写 ${fn.toLowerCase(product.name)}
fn:toUpperCase 转为大写字符 ${fn.UpperCase(product.name)}
fn:trim 去除字符串前后的空格 ${fn.trim(name)}

函数 
描述
fn:contains(string, substring)
如果参数string中包含参数substring,返回true

fn:containsIgnoreCase(string, substring)
如果参数string中包含参数substring(忽略大小写),返回true

fn:endsWith(string, suffix)
如果参数 string 以参数suffix结尾,返回true

fn:escapeXml(string)
将有特殊意义的XML (和HTML)转换为对应的XML character entity code,并返回

fn:indexOf(string, substring)
返回参数substring在参数string中第一次出现的位置

fn:join(array, separator)
将一个给定的数组array用给定的间隔符separator串在一起,组成一个新的字符串并返回。

fn:length(item)
返回参数item中包含元素的数量。参数Item类型是数组、collection或者String。如果是String类型,返回值是String中的字符数。

fn:replace(string, before, after)
返回一个String对象。用参数after字符串替换参数string中所有出现参数before字符串的地方,并返回替换后的结果 

fn:split(string, separator)
返回一个数组,以参数separator 为分割符分割参数string,分割后的每一部分就是数组的一个元素

fn:startsWith(string, prefix)
如果参数string以参数prefix开头,返回true

fn:substring(string, begin, end)
返回参数string部分字符串, 从参数begin开始到参数end位置,包括end位置的字符

fn:substringAfter(string, substring)
返回参数substring在参数string中后面的那一部分字符串?? 

fn:substringBefore(string, substring)
返回参数substring在参数string中前面的那一部分字符串

fn:toLowerCase(string)
将参数string所有的字符变为小写,并将其返回

fn:toUpperCase(string)
将参数string所有的字符变为大写,并将其返回

fn:trim(string)


在jsp中 使用EL表达式时,不可以使用java提供的功能,比如indexOf()等。
<c:if test="${Boolean.valueOf(requestScope.addresult)==false}"> 

报错 
The function valueOf must be used with a prefix when a default namespace is not specified

阿里云服务器优惠券
posted @ 2014-08-05 15:24 Alpha 阅读(15554) | 评论 (0)编辑 收藏

        公司发布的SEO专员招聘有一段时间了,一直没有找到合适的人选, 一方面专门从事这块职业的人员比较少,另一方面对这个职位有一定了解的人也比较少.那么我们所说的seo专员是什么样的一个职位呢? 今天我们来探讨一下,在网上搜索了一个相关资料,找到这么一篇文章:http://seo.aizhan.com/qa/542.html,我们看看文章里面的表述:

        其实seo专员的主要职责就是执行完成SEO主管制定的SEO策略和优化目标任务,通常需要做大量的内容编辑、软文发布和外链建设等各种体力活。现在也有很多公司在发布招聘的时候也有专门招聘SEO外链专员这样的职位,有一定规模的网站也会分为SEO网站优化、SEO网站编辑、SEO外链专员等这样的细分岗位,每个岗位根据SEO优化工作的侧重点不同,执行完成的工作重点也是不一样的。那么今天我们要讲的SEO专员的具体工作是什么?做好这个职位需要具备什么样的素质?
       SEO专员的具体工作,说到底核心工作就是研究搜索引擎,完成网站内容建设,丰富网站的内容,到各大网站平台发布定量合适的外链,交换友情链接,帮助网站获得关键词排名,并做好数据分析与跟踪。

       在这篇文章里讲述了什么是SEO专员, SEO专员的具体工作,说到底核心工作就是研究搜索引擎,完成网站内容建设,丰富网站的内容,到各大网站平台发布定量合适的外链,交换友情链接,帮助网站获得关键词排名,并做好数据分析与跟踪。 但是要找到一名有耐心,有良好的沟通能力,超强的执行力,有比较强的心里承受能力,受得了寂寞的SEO专员却是一件不容易的事情。

发布一则房民网SEO专员招聘要求:
任职要求:
1、男女不限,大专以上学历,年龄在20-35岁之间;
2、对互联网有浓厚的兴趣,熟悉网站的运作和推广的各种方式,能够根据公司的需求独立策划网站推广方案并执行;会熟练打字操作常用办公软件;
3、有一定的分析判断能力,能根据推广效果提出调整建议,具有敏锐的思维和创新能力,思维开阔;
4、工作认真、细致、敬业,有较强的沟通能力和团队合作精神;
5、1年以上相关工作经历或精通网站编辑及平面设计者或有一定的文字写作能力者优先。

岗位职责:
1、负责完成网站内容建设,友链外链建设,关键字优化,提高网站排名、搜索引擎收录量;
2、执行在线推广活动,收集推广反馈数据,不断改进推广效果; 
3、及时提出网络推广改进建议,给出实际可行的改进方案。

快来加入吧:)
posted @ 2013-11-24 10:04 Alpha 阅读(1540) | 评论 (2)编辑 收藏
      一直从事于开发与运维相关技术的研究实践,最近在做几个房产网分站的SEO优化技术储备, 缘于长沙房产网的百度快照阴情不定让人很蛋疼,于是对此进行了深入的研究,发现SEO网站优化也是一门相当有技术含量的技术活,涉及的知识点和技术面都要广才能掌握大局,同时也要调动团队各环节,从网站的最初版面功能策划到页面的视觉设计和代码编写,再到程序开发时的架构设计,最后做内容时的内容编排等一系列的问题都得考虑到,且都要执行到位,否则任何一个环节没做好都有可能影响到整个SEO优化的效果.因此,今天开辟一个新版块,专门从事SEO优化技术的研究与实践.

      目前在拿房产网的四个分站进行实战研究,希望能从中找到一些答案,这四个站的主关键词也是相当有竞争难度,比如东莞房产网这个关键词的收录量有250多万,但是http://dg.fmw.cn/这个域名的百度收入占有量却只有两位数,而比东莞房产网迟了一个多月上线的昆明房产网,这个站域名是http://km.fmw.cn/,它收录量都上三位数了,远远超过了东莞房产网的收入量,这让人更是摸不着头脑.表现最满意的是佛山房产网,它同样比东莞房产网上线迟了一个多月,但是收入量等各方面指数上升很明显.同样的网站架构,同样每天都有坚持在做内容,但是却有不一样的表现,这是一个值得研究的课题.

SEO既Search Engine Optimization,翻译为搜索引擎优化,是一种利用技术手段提升网站在搜索引擎之中的排名的方式,让搜索引擎更为信任网站,通过排在搜索引擎的前页从而获得更多的流量。

      希望在接下来的SEO优化研究和实践工作中能找到这一系列的答案,届时房民网与大家一起来分享. 
posted @ 2013-10-09 00:12 Alpha 阅读(1413) | 评论 (0)编辑 收藏

给大家推荐一处php主机-wopus主机,专业的wordpress主机!还可以省钱购买php主机,永久免费使用.
       购买可以用wopus主机优惠码:alpha 提交订单时手动输入 alpha
       或者通过>>wopus主机优惠码<<链接进入直接购买就可获得优惠,可以省钱哟. http://idc.wopus.org/?f=alpha 
      (wopus主机推介优惠码:alpha 永久有效)!打算买php主机的朋友请看以下介绍!

他们自己是这样介绍他们的产品的:

专业博客主机服务商

WopusIDC一直致力于为广大独立博客用户提供优质实惠的专业博客主机服务,现已积累有超过四年的专业博客主机服务经验,成为众多独立博客们的主机首选。

国内、国外主机任选

从国外主机到国内主机,WopusIDC给用户带来多种主机选择,打破访问速度的瓶颈,给广大独立博客用户带来更佳的主机体验。

快速搭建个性化博客

依托于Wopus平台上发布的数量众多的主题、插件以及文章教程,WopusIDC用户可以简单快速的搭建属于自己的个性化博客。

    买php主机用 wopus主机优惠码:alpha , 提交订单时手动输入 alpha ,永久免费使用,长期有效.
       或 点击 http://idc.wopus.org/?f=alpha  购买主机立即省钱!


posted @ 2013-08-19 01:04 Alpha 阅读(1827) | 评论 (1)编辑 收藏
1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。
因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的
状态下,其他的用户也可以任意地登录和修改MySQL的信息。可以采用将MySQL对
外的端口封闭,并且停止Apache以及所有的用户进程的方法实现服务器的准安全
状态。最安全的状态是到服务器的Console上面操作,并且拔掉网线。
2.修改MySQL的登录设置:
# vi /etc/my.cnf
在[mysqld]的段中加上一句:skip-grant-tables
例如:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-grant-tables
保存并且退出vi。
3.重新启动mysqld
# /etc/init.d/mysqld restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]
4.登录并修改MySQL的root密码
# /usr/bin/mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.23.56
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> USE mysql ;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> UPDATE user SET Password = password ( 'new-password' ) WHERE User = 'root' ;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2 Changed: 0 Warnings: 0
mysql> flush privileges ;
Query OK, 0 rows affected (0.01 sec)
mysql> quit
Bye
5.将MySQL的登录设置修改回来
# vi /etc/my.cnf
将刚才在[mysqld]的段中加上的skip-grant-tables删除
保存并且退出vi。
6.重新启动mysqld
# /etc/init.d/mysqld restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]
posted @ 2013-04-19 11:39 Alpha 阅读(1712) | 评论 (0)编辑 收藏
阿里云服务器优惠券

经常使用CentOS的朋友,可能会遇到和我一样的问题。开启了防火墙导致80端口无法访问,刚开始学习centos的朋友可以参考下。

经常使用CentOS的朋友,可能会遇到和我一样的问题。最近在Linux CentOS防火墙下安装配置 ORACLE 
数据库的时候,总显示因为网络端口而导致的EM安装失败,遂打算先关闭一下CentOS防火墙。偶然看到CentOS防火墙的配置操作说明,感觉不错。执

行”setup”命令启动文字模式配置实用程序,在”选择一种工具”中选择”防火墙配置”,然后选择”运行工具”按钮,出现CentOS防火墙配置界面,
将”安全级别”设为”禁用”,然后选择”确定”即可.

这样重启计算机后,CentOS防火墙默认已经开放了80和22端口

简介:CentOS是Linux家族的一个分支。

CentOS防火墙在虚拟机的CENTOS装好APACHE不能用,郁闷,解决方法如下

/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 22 -j ACCEPT

然后保存:

/etc/rc.d/init.d/iptables save
centos 5.3,5.4以上的版本需要用
service iptables save
来实现保存到配置文件。
这样重启计算机后,CentOS防火墙默认已经开放了80和22端口。

这里应该也可以不重启计算机:

/etc/init.d/iptables restart

CentOS防火墙的关闭,关闭其服务即可:

查看CentOS防火墙信息:/etc/init.d/iptables status

关闭CentOS防火墙服务:/etc/init.d/iptables stop

永久关闭?不知道怎么个永久法:

chkconfig –level 35 iptables off

上面的内容是针对老版本的centos,下面的内容是基于新版本。

iptables -P INPUT DROP

这样就拒绝所有访问 CentOS 5.3 本系统数据,除了 Chain RH-Firewall-1-INPUT (2 references) 的规则外 , 呵呵。

用命令配置了 iptables 一定还要 service iptables save 才能保存到配置文件。

cat /etc/sysconfig/iptables 可以查看 防火墙 iptables 配置文件内容

# Generated by iptables-save v1.3.5 on Sat Apr 14 07:51:07 2001
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1513:149055]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Sat Apr 14 07:51:07 2001

另外补充:
CentOS 防火墙配置 80端口
看了好几个页面内容都有错,下面是正确方法:
#/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
#/sbin/iptables -I INPUT -p tcp --dport 22 -j ACCEPT

然后保存:
#/etc/rc.d/init.d/iptables save

再查看是否已经有了:
[root@vcentos ~]# /etc/init.d/iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:80
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0

* 设置iptables为自动启动
chkconfig --level 2345 iptables on

可能因为大家使用的版本不一,所有使用方法也略有不同。

如果需要远程管理mysql,则使用以下指令临时打开,用完后关闭 

* 打开指令 
iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport 3306 -j ACCEPT 

* 关闭指令 
iptables -D INPUT -p tcp -s xxx.xxx.xxx.xxx --dport 3306 -j ACCEPT

nginx 80 端口访问不了?
添加一个本地回路
 iptables -A INPUT -i lo -j ACCEPT 
阿里云服务器优惠券
posted @ 2012-09-17 23:59 Alpha 阅读(32120) | 评论 (0)编辑 收藏
系统连接状态篇:
 1.查看TCP连接状态
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn

netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}' 或
 netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"t",state[key]}'
 netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"t",arr[k]}'

netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn

netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c

2.查找请求数请20个IP(常用于查找攻来源):

 netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20

netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20

 3.用tcpdump嗅探80端口的访问看看谁最高

 tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20


 4.查找较多time_wait连接

 netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20

 5.找查较多的SYN连接

 netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

 6.根据端口列进程

 netstat -ntlp | grep 80 | awk '{print $7}' | cut -d/ -f1

网站日志分析篇1(Apache):

1.获得访问前10位的ip地址

 cat access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10
 cat access.log|awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}'

 2.访问次数最多的文件或页面,取前20

 cat access.log|awk '{print $11}'|sort|uniq -c|sort -nr|head -20

 3.列出传输最大的几个exe文件(分析下载站的时候常用)

 cat access.log |awk '($7~/.exe/){print $10 " " $1 " " $4 " " $7}'|sort -nr|head -20

 4.列出输出大于200000byte(约200kb)的exe文件以及对应文件发生次数

 cat access.log |awk '($10 > 200000 && $7~/.exe/){print $7}'|sort -n|uniq -c|sort -nr|head -100

 5.如果日志最后一列记录的是页面文件传输时间,则有列出到客户端最耗时的页面

 cat access.log |awk  '($7~/.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -100

 6.列出最最耗时的页面(超过60秒的)的以及对应页面发生次数

 cat access.log |awk '($NF > 60 && $7~/.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

 7.列出传输时间超过 30 秒的文件

 cat access.log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20

 8.统计网站流量(G)

 cat access.log |awk '{sum+=$10} END {print sum/1024/1024/1024}'

 9.统计404的连接

 awk '($9 ~/404/)' access.log | awk '{print $9,$7}' | sort

 10. 统计http status

 cat access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}'
 cat access.log |awk '{print $9}'|sort|uniq -c|sort -rn

 10.蜘蛛分析,查看是哪些蜘蛛在抓取内容。

 /usr/sbin/tcpdump -i eth0 -l -s 0 -w - dst port 80 | strings | grep -i user-agent | grep -i -E 'bot|crawler|slurp|spider'

网站日分析2(Squid篇)按域统计流量

 zcat squid_access.log.tar.gz| awk '{print $10,$7}' |awk 'BEGIN{FS="[ /]"}{trfc[$4]+=$1}END{for(domain in trfc){printf "%st%dn",domain,trfc[domain]}}'

数据库篇
 1.查看数据库执行的sql

 /usr/sbin/tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | egrep -i 'SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL'

系统Debug分析篇
 1.调试命令
strace -p pid
 2.跟踪指定进程的PID
gdb -p pid

awk '{ip[$1]+=1} END{for(i in ip){print i," "ip[i]}}' access.log |wc -l
其中access.log就是apache的访问日志。这个就可以统计独立ip数据

1、把IP数量直接输出显示:
cat access_log_2011_06_26.log |awk '{print $1}'|uniq -c|wc -l


永久链接 : http://www.ha97.com/4392.html
posted @ 2012-09-13 17:47 Alpha 阅读(1287) | 评论 (0)编辑 收藏
经常使用CentOS的朋友,可能会遇到和我一样的问题。开启了防火墙导致80端口无法访问,刚开始学习centos的朋友可以参考下。

经常使用CentOS的朋友,可能会遇到和我一样的问题。最近在Linux CentOS防火墙下安装配置 ORACLE 数据库的时候,总显示因为网络端口而导致的EM安装失败,遂打算先关闭一下CentOS防火墙。偶然看到CentOS防火墙的配置操作说明,感觉不错。执 行”setup”命令启动文字模式配置实用程序,在”选择一种工具”中选择”防火墙配置”,然后选择”运行工具”按钮,出现CentOS防火墙配置界面, 将”安全级别”设为”禁用”,然后选择”确定”即可.

这样重启计算机后,CentOS防火墙默认已经开放了80和22端口

简介:CentOS是Linux家族的一个分支。

CentOS防火墙在虚拟机的CENTOS装好APACHE不能用,郁闷,解决方法如下

/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 22 -j ACCEPT

然后保存:

/etc/rc.d/init.d/iptables save
centos 5.3,5.4以上的版本需要用
service iptables save
来实现保存到配置文件。
这样重启计算机后,CentOS防火墙默认已经开放了80和22端口。

这里应该也可以不重启计算机:

/etc/init.d/iptables restart

CentOS防火墙的关闭,关闭其服务即可:

查看CentOS防火墙信息:/etc/init.d/iptables status

关闭CentOS防火墙服务:/etc/init.d/iptables stop

永久关闭?不知道怎么个永久法:

chkconfig –level 35 iptables off

上面的内容是针对老版本的centos,下面的内容是基于新版本。

iptables -P INPUT DROP

这样就拒绝所有访问 CentOS 5.3 本系统数据,除了 Chain RH-Firewall-1-INPUT (2 references) 的规则外 , 呵呵。

用命令配置了 iptables 一定还要 service iptables save 才能保存到配置文件。

cat /etc/sysconfig/iptables 可以查看 防火墙 iptables 配置文件内容

# Generated by iptables-save v1.3.5 on Sat Apr 14 07:51:07 2001
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1513:149055]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Sat Apr 14 07:51:07 2001

另外补充:
CentOS 防火墙配置 80端口
看了好几个页面内容都有错,下面是正确方法:
#/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
#/sbin/iptables -I INPUT -p tcp --dport 22 -j ACCEPT

然后保存:
#/etc/rc.d/init.d/iptables save

再查看是否已经有了:
[root@vcentos ~]# /etc/init.d/iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:80
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0

* 设置iptables为自动启动
chkconfig --level 2345 iptables on

可能因为大家使用的版本不一,所有使用方法也略有不同。
posted @ 2012-09-13 15:06 Alpha 阅读(14527) | 评论 (0)编辑 收藏

1.关闭防火墙
[root@CentOS ~]# chkconfig iptables off

2.关闭selinux
vi /etc/sysconfig/selinux
//将SELINUX=enforcing修改为disabled然后重启生效

3、配置CentOS 6.0 第三方yum源(CentOS默认的标准源里没有nginx软件包)
[root@CentOS ~]# yum install wget
//下载wget工具
[root@CentOS ~]# wget http://www.atomicorp.com/installers/atomic
//下载atomic yum源
[root@CentOS ~]# sh ./atomic
//安装提示输入时输yes
[root@CentOS ~]# yum check-update
//更新yum软件包

4.安装开发包和库文件
[root@CentOS ~]# yum -y install ntp make openssl openssl-devel pcre pcre-devel libpng
libpng-devel libjpeg-6b libjpeg-devel-6b freetype freetype-devel gd gd-devel zlib zlib-devel
gcc gcc-c++ libXpm libXpm-devel ncurses ncurses-devel libmcrypt libmcrypt-devel libxml2
libxml2-devel imake autoconf automake screen sysstat compat-libstdc++-33 curl curl-devel

5.卸载已安装的apache、mysql、php
[root@CentOS ~]# yum remove httpd
[root@CentOS ~]# yum remove mysql
[root@CentOS ~]# yum remove php

6.安装nginx
[root@CentOS ~]# yum install nginx
[root@CentOS ~]# service nginx start
[root@CentOS ~]# chkconfig --levels 235 nginx on
//设2、3、5级别开机启动

7.安装mysql
[root@CentOS ~]# yum install mysql mysql-server mysql-devel
[root@CentOS ~]# service mysqld start
[root@CentOS ~]# chkconfig --levels 235 mysqld on
[root@CentOS ~]# mysqladmin -u root password "123456"
//为root用户设置密码
[root@CentOS ~]# service mysqld restart
//重启mysql

8.安装php
[root@CentOS ~]# yum install php lighttpd-fastcgi php-cli php-mysql php-gd php-imap php-ldap
php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-mssql php-snmp php-soap
php-tidy php-common php-devel php-fpm
//安装php和所需组件使PHP支持MySQL、FastCGI模式
[root@CentOS ~]# service php-fpm start
[root@CentOS ~]# chkconfig --levels 235 php-fpm on

9.配置nginx支持php
[root@CentOS ~]# mv /etc/nginx/nginx.conf /etc/nginx/nginx.confbak
//将配置文件改为备份文件
[root@CentOS ~]# cp /etc/nginx/nginx.conf.default /etc/nginx/nginx.conf
//由于原配置文件要自己去写因此可以使用默认的配置文件作为配置文件
//修改nginx配置文件,添加fastcgi支持
[root@CentOS ~]# vi /etc/nginx/nginx.conf
index index.php index.html index.htm;
//加入index.php
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
//将以上代码注释去掉,并修改成nginx默认路径

10.配置php
//编辑文件php.ini,在文件末尾添加cgi.fix_pathinfo = 1
[root@CentOS ~]# vi /etc/php.ini

11.重启nginx php-fpm
[root@CentOS ~]# service nginx restart
[root@CentOS ~]# service php-fpm restart

12.建立info.php文件
[root@CentOS ~]# vi /usr/share/nginx/html/info.php
<?php
phpinfo();
?>

13.测试nginx是否解析php
输入:192.168.1.105/info.php
显示php界面说明解析成功

posted @ 2012-09-12 18:39 Alpha 阅读(5410) | 评论 (1)编辑 收藏

本文主要讲述如何使用Linux系统中的日志子系统及其命令,来更好地保护系统安全。

Linux系统中的日志子系统对于系统安全来说非常重要,它记录了系统每天发生的各种各 样的事情,包括那些用户曾经或者正在使用系统,可以通过日志来检查错误发生的原因,更重要的是在系统受到黑客攻击后,日志可以记录下攻击者留下的痕迹,通 过查看这些痕迹,系统管理员可以发现黑客攻击的某些手段以及特点,从而能够进行处理工作,为抵御下一次攻击做好准备。

在Linux系统中,有三类主要的日志子系统:

● 连接时间日志: 由多个程序执行,把记录写入到/var/log/wtmp和/var/run/utmp,login等程序会更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。

● 进程统计: 由系统内核执行,当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个记录。进程统计的目的是为系统中的基本服务提供命令使用统计。

● 错误日志: 由syslogd(8)守护程序执行,各种系统守护进程、用户程序和内核通过syslogd(3)守护程序向文件/var/log/messages报告 值得注意的事件。另外有许多Unix程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。

Linux下日志的使用

1.基本日志命令的使用

utmp、wtmp日志文件是多数Linux日志子系统的关键,它保存了用户登录进入和 退出的记录。有关当前登录用户的信息记录在文件utmp中; 登录进入和退出记录在文件wtmp中; 数据交换、关机以及重启的机器信息也都记录在wtmp文件中。所有的记录都包含时间戳。时间戳对于日志来说非常重要,因为很多攻击行为分析都是与时间有极 大关系的。这些文件在具有大量用户的系统中增长十分迅速。例如wtmp文件可以无限增长,除非定期截取。许多系统以一天或者一周为单位把wtmp配置成循 环使用。它通常由cron运行的脚本来修改,这些脚本重新命名并循环使用wtmp文件。

utmp文件被各种命令文件使用,包括who、w、users和finger。而 wtmp文件被程序last 和ac使用。但它们都是二进制文件,不能被诸如tail命令剪贴或合并(使用cat命令)。用户需要使用who、w、users、last和ac来使用这 两个文件包含的信息。具体用法如下:

who命令: who命令查询utmp文件并报告当前登录的每个用户。Who的缺省输出包括用户名、终端类型、登录日期及远程主机。使用该命令,系统管理员可以查看当前系统存在哪些不法用户,从而对其进行审计和处理。例如: 运行who命令显示如下:

[root@working]# who

root pts/0 May 9 21:11 (10.0.2.128)

root pts/1 May 9 21:16 (10.0.2.129)

lhwen pts/7 May 9 22:03 (10.0.2.27)

如果指明了wtmp文件名,则who命令查询所有以前的记录。例如命令who /var/log/wtmp将报告自从wtmp文件创建或删改以来的每一次登录。

日志使用注意事项

系统管理人员应该提高警惕,随时注意各种可疑状况,并且按时和随机地检查各种系统日志文件,包括一般信息日志、网络连接日志、文件传输日志以及用户登录日志等。在检查这些日志时,要注意是否有不合常理的时间记载。例如:

■ 用户在非常规的时间登录;

■ 不正常的日志记录,比如日志的残缺不全或者是诸如wtmp这样的日志文件无故地缺少了中间的记录文件;

■ 用户登录系统的IP地址和以往的不一样;

■ 用户登录失败的日志记录,尤其是那些一再连续尝试进入失败的日志记录;

■ 非法使用或不正当使用超级用户权限su的指令;

■ 无故或者非法重新启动各项网络服务的记录。

另外, 尤其提醒管理人员注意的是: 日志并不是完全可靠的。高明的黑客在入侵系统后,经常会打扫现场。所以需要综合运用以上的系统命令,全面、综合地进行审查和检测,切忌断章取义,否则很难发现入侵或者做出错误的判断。

users命令: users用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。运行该命令将如下所示:

[root@working]# users

root root //只登录了一个Root权限的用户

last命令: last命令往回搜索wtmp来显示自从文件第一次创建以来登录过的用户。系统管理员可以周期性地对这些用户的登录情况进行审计和考核,从而发现其中存在的问题,确定不法用户,并进行处理。运行该命令,如下所示:

[root@working]# last

devin pts/1 10.0.2.221 Mon Jul 21 15:08-down (8+17:46)

devin pts/1 10.0.2.221 Mon Jul 21 14:42 - 14:53 (00:11)

changyi pts/2 10.0.2.141 Mon Jul 21 14:12 - 14:12 (00:00)

devin pts/1 10.0.2.221 Mon Jul 21 12:51 - 14:40 (01:49)

reboot system boot 2.4.18 Fri Jul 18 15:42 (11+17:13)

reboot system boot 2.4.18 Fri Jul 18 15:34 (00:04)

reboot system boot 2.4.18 Fri Jul 18 15:02 (00:36)

读者可以看到,使用上述命令显示的信息太多,区分度很小。所以,可以通过指明用户来显示其登录信息即可。例如: 使用last devin来显示devin的历史登录信息,则如下所示:

[root@working]# last devin

devin pts/1 10.0.2.221 Mon Jul 21 15:08 - down (8+17:46)

devin pts/1 10.0.2.221 Mon Jul 21 14:42 - 14:53 (00:11)

ac命令:ac命令根据当前的/var/log/wtmp文件中的登录进入和退出来报告用户连接的时间(小时),如果不使用标志,则报告总的时间。另外,可以加一些参数,例如,last -t 7表示显示上一周的报告。

lastlog命令 lastlog文件在每次有用户登录时被查询。可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志 /var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示 “**Never logged**”。注意需要以root身份运行该命令。运行该命令如下所示:

[root@working]# lastlog

Username Port From Latest

root pts/1 10.0.2.129 二 5月 10 10:13:26 +0800 2005

opal pts/1 10.0.2.129 二 5月 10 10:13:26 +0800 2005

2.使用Syslog设备

Syslog已被许多日志函数采纳,被用在许多保护措施中,任何程序都可以通过syslog 记录事件。Syslog可以记录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能记录本地事件或通过网络记录另一个主机上的事件。

Syslog设备核心包括一个守护进程(/etc/syslogd守护进程)和一个配置 文件(/etc/syslog.conf配置文件)。通常情况下,多数syslog信息被写到/var/adm或/var/log目录下的信息文件中 (messages.*)。一个典型的syslog记录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围。

系统管理员通过使用syslog.conf文件,可以对生成的日志的位置及其相关信息进行灵活配置,满足应用的需要。例如,如果想把所有邮件消息记录到一个文件中,则做如下操作:

#Log all the mail messages in one place

mail.* /var/log/maillog

其他设备也有自己的日志。UUCP和news设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为\"err\"或更高。例如:

# Save news errors of level crit and higher in a special file.

uucp,news.crit /var/log/spooler

当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。

#Everybody gets emergency messages, plus log them on anther machine

*.emerg *

*.emerg @linuxaid.com.cn

用户可以在一行中指明所有的设备。下面的例子把info或更高级别的消息送到/var/log/messages,除了mail以外。级别\"none\"禁止一个设备:

#Log anything(except mail)of level info or higher

#Don\'t log private authentication messages!

*.info:mail.none;autHPriv.none /var/log/messages

在有些情况下,可以把日志送到打印机,这样网络入侵者怎么修改日志都不能清除入侵的痕迹。因此,syslog设备是一个攻击者的显著目标,破坏了它将会使用户很难发现入侵以及入侵的痕迹,因此要特别注意保护其守护进程以及配置文件。

3.程序日志的使用

许多程序通过维护日志来反映系统的安全状态。su命令允许用户获得另一个用户的权限,所 以它的安全很重要,它的文件为sulog,同样的还有sudolog。另外,诸如Apache等Http的服务器都有两个日志: access_log(客户端访问日志)以及error_log(服务出错日志)。 FTP服务的日志记录在xferlog文件当中,Linux下邮件传送服务(sendmail)的日志一般存放在maillog文件当中。

程序日志的创建和使用在很大程度上依赖于用户的良好编程习惯。对于一个优秀的程序员来 说,任何与系统安全或者网络安全相关的程序的编写,都应该包含日志功能,这样不但便于程序的调试和纠错,而且更重要的是能够给程序的使用方提供日志的分析 功能,从而使系统管理员能够较好地掌握程序乃至系统的运行状况和用户的行为,及时采取行动,排除和阻断意外以及恶意的入侵行为。

posted @ 2012-03-22 14:12 Alpha 阅读(1013) | 评论 (0)编辑 收藏
CentOS 5.5下FTP安装及配置

一、FTP的安装

1、检测是否安装了FTP :
[root@localhost ~]# rpm -q vsftpd
vsftpd-2.0.5-16.el5_5.1

否则显示:[root@localhost ~]# package vsftpd is not installed
查看ftp运行状态
service vsftpd status


2、如果没安装FTP,运行yum install vsftpd命令进行安装
   
   如果无法下载,需要设置好yum 如下
cd /etc/yum.repos.d
mv CentOS-Base.repo  CentOS-Base.repo.save
wget http://centos.ustc.edu.cn/CentOS-Base.repo

3、完成ftp安装后,将 /etc/vsftpd/user_list文件和/etc/vsftpd/ftpusers文件中的root这一行注释掉
   # root
4、执行 setsebool -P ftpd_disable_trans=1  修改SELinux 状态

   [root@localhost vsftpd]# setsebool -P ftpd_disable_trans=1
   setsebool:  SELinux is disabled.

5、修改/etc/vsftpd/vsftpd.conf,在最后一行处添加local_root=/
6、重启ftp进程   #service vsftpd restart

注:每次修改过ftp相关的配置文件,都需要重启ftp进程来生效。

安装完成
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
vsftpd 文件布局
/etc/vsftpd/vsftpd.conf    主配置文件
/usr/sbin/vsftpd           主程序
/etc/rc.d/init.d/vsftpd    启动脚本
/etc/pam.d/vsftpd          PAM认证文件
/etc/vsftpd.ftpusers       禁止使用vsftpd的用户列表文件
/etc/vsftpd.user_list      禁止或允许使用vsftpd用户列表文件
/var/ftp                   匿名用户主目录
/var/ftp/pub               匿名用户下载目录
/etc/logrotate.d/vsftpd.log  日志文件


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


二.系统帐户
1.建立Vsftpd服务的宿主用户:
[root@localhost]# adduser -d /data guest -s /sbin/nologin
默认的Vsftpd的服务宿主用户是root,但是这不符合安全性的需要。www.linuxidc.com这里建立名字为vsftpd的用户,用他来作为支持Vsftpd的
建立Vsftpd虚拟宿主用户:
[root@linuxidc.com nowhere]# useradd virtusers -s /sbin/nologin

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


三 、vsftpd的配置

#anonymous_enable=YES
anonymous_enable=NO    设定不允许匿名访问
local_enable=YES       设定本地用户可以访问。注意:如果该项目设定为NO那么所有虚拟用户将无法访问。
write_enable=YES       设定可以进行写操作。
local_umask=022        设定上传后文件的权限掩码。
anon_upload_enable=NO  禁止匿名用户上传。
anon_mkdir_write_enable=NO  禁止匿名用户建立目录。
dirmessage_enable=YES  设定开启目录标语功能。
xferlog_enable=YES     设定开启日志记录功能。
connect_from_port_20=YES 设定端口20进行数据连接。
chown_uploads=NO        设定禁止上传文件更改宿主。
chroot_local_user=YES   设定登陆后.只可以访问自己的属主目录.不可访问上一层目录文件
xferlog_file=/var/log/vsftpd.log 设定Vsftpd的服务日志保存路径。注意,该文件默认不存在。必须要手动touch出来,并且由于这里更改了Vsftpd的服务宿主
用户为手动建立的Vsftpd。必须注意给与该用户对日志的写入权限,否则服务将启动失败。
xferlog_std_format=YES  设定日志使用标准的记录格式
idle_session_timeout=600 设定空闲连接超时时间,这里使用默认。
data_connection_timeout=120 设定单次最大连续传输时间,这里使用默认
nopriv_user=vsftpd       设定支撑Vsftpd服务的宿主用户为手动建立的Vsftpd用户。注意,一旦做出更改宿主用户后,必须注意一起与该服务相关的读写文件的读写赋权问题
                         比如日志文件就必须给与该用户写入权限等。

async_abor_enable=YES     设定支持异步传输功能。
ascii_upload_enable=YES
ascii_download_enable=YES   设定支持ASCII模式的上传和下载功能。
ftpd_banner=Welcome to blah FTP service ^_^  设定Vsftpd的登陆标语。
chroot_list_enable=NO    禁止用户登出自己的FTP主目录。
ls_recurse_enable=NO    禁止用户登陆FTP后使用"ls -R"的命令。该命令会对服务器性能造成巨大开销。如果该项被允许,那么挡多用户同时使用该命
                        令时将会对该服务器造成威胁。
listen=YES              设定该Vsftpd服务工作在StandAlone模式下。
pam_service_name=vsftpd  设定PAM服务下Vsftpd的验证配置文件名。
userlist_enable=YES      设定userlist_file中的用户将不得使用FTP。
tcp_wrappers=YES         服务器使用tcp_wrappers作为主机的访问控制方式。

以下这些是关于Vsftpd虚拟用户支持的重要配置项目。默认Vsftpd.conf中不包含这些设定项目,需要自己手动添加配置。

guest_enable=YES          设定启用虚拟用户功能。
guest_username=virtusers 指定虚拟用户的宿主用户。
virtual_use_local_privs=YES 设定虚拟用户的权限符合他们的宿主用户。
user_config_dir=/etc/vsftpd/vconf  设定虚拟用户个人Vsftp的配置文件存放路径。也就是说,这个被指定的目录里,将存放每个Vsftp虚拟用户个性的配置文件,
一个需要注意的地方就是这些配置文件名必须和虚拟用户名相同。保存退出。
max_clients= 99     服务器的最大并发数
max_per_ip=5        用户最大线程数
anon_max_rate=1000000   设置本底账号最大传输率为1Mbps

禁止某些IP段得主机匿名访问服务器

tcp_wrappers=YES   
编辑 /etc/hosts.allow

增加
vsftpd:192.168.110.11:DENY

查看ftp日志

xferlog_enable=YES  上传和下载日志文件记录  /var/log/vsftpd.log
xferlog_std_format=YES  传输日志文件将以标准xferlog的格式书写  /var/log/xferlog
xferlog_file= /var/log/xferlog
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log

通过本底数据文件实现虚拟用户访问
安装db4-utils
yum install db4-utils

创建本地映射用户,修改本底映射用户目录权限

useradd -d /data/ftp/temp -s /sbin/nologin game
chmod o=rwx /data/ftp/temp

修改 /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=zqgamexw

生成虚拟用户文件
/etc/vsftpd/vsftpuser.txt
test001    虚拟user
123456     虚拟passwd

生成虚拟用户数据文件
db_load -T -t hash -f /etc/vsftpd/vsftpuser.txt /etc/vsftpd/vsftpuser.db
修改生成的用户数据文件权限
 chmod 600 /etc/vsftpd/vsftpuser.db
修改PAM 认证文件 /etc/pam.d/vsftpd 注销原有内容后添加
auth        required     /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpuser
account     required     /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpuse

 

建立Vsftpd的日志文件,并更该属主为Vsftpd的服务宿主用户:
[root@localhost]# touch /var/log/vsftpd.log
[root@localhost]# chown vsftpd.vsftpd /var/log/vsftpd.log

建立虚拟用户配置文件存放路径:
[root@localhost]# mkdir /etc/vsftpd/vconf/

制作虚拟用户数据库文件


先建立虚拟用户名单文件:
[root@localhost]# touch /etc/vsftpd/virtusers
建立了一个虚拟用户名单文件,这个文件就是来记录vsftpd虚拟用户的用户名和口令的数据文件,
这里给它命名为virtusers。为了避免文件的混乱,我把这个名单文件就放置在/etc/vsftpd/下。

编辑虚拟用户名单文件:
[root@localhost]# vi /etc/vsftpd/virtusers
----------------------------
ftp001
123456
ftp002
123456
ftp003
123456
----------------------------
编辑这个虚拟用户名单文件,在其中加入用户的用户名和口令信息。格式很简单:“一行用户名,一行口令”。3.生成虚拟用

户数据文件:
[root@localhost]# db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db

4.察看生成的虚拟用户数据文件
[root@localhost]# ll /etc/vsftpd/virtusers.db
-rw-r--r-- 1 root root 12288 Sep 16 03:51 /etc/vsftpd/virtusers.db
需要特别注意的是,以后再要添加虚拟用户的时候,只需要按照“一行用户名,一行口令”的格式将新用户名和口令添加进虚

拟用户名单文件。但是光这样做还不够,不会生效的哦!还要再执行一遍“ db_load -T -t hash -f 虚拟用户名单文件虚拟

用户数据库文件.db ”的命令使其生效才可以!

设定PAM验证文件,并指定虚拟用户数据库文件进行读取
1.察看原来的Vsftp的PAM验证配置文件:
[root@localhost]# cat /etc/pam.d/vsftpd
----------------------------------------------------------------
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_shells.so
auth       include      system-auth
account    include      system-auth
session    include      system-auth
session    required     pam_loginuid.so
----------------------------------------------------------------

2.在编辑前做好备份:
[root@localhost]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.backup
3.编辑Vsftpd的PAM验证配置文件
[root@localhost]# vi /etc/pam.d/vsftpd
----------------------------------------------------------------
#%PAM-1.0
auth    required      /lib/security/pam_userdb.so     db=/etc/vsftpd/virtusers
account required      /lib/security/pam_userdb.so     db=/etc/vsftpd/virtusers
以上两条是手动添加的,上面的全部加#注释了.内容是对虚拟用户的安全和帐户权限进行验证。

!!!!!!!这里有个要注意说明的:如果系统是64位系统在这里的所有lib后面要加入64!!!!!!
!!!!!!!如下这样才可以:

#%PAM-1.0
auth    required      /lib64/security/pam_userdb.so     db=/etc/vsftpd/virtusers
account required      /lib64/security/pam_userdb.so     db=/etc/vsftpd/virtusers


五.虚拟用户的配置
1.规划好虚拟用户的主路径:
[root@localhost]# mkdir /opt/vsftp/
2.建立测试用户的FTP用户目录:
[root@localhost]# mkdir /opt/vsftp/ftp001 /opt/vsftp/ftp002 /opt/vsftp/ftp003

3.建立虚拟用户配置文件模版:

[root@localhost]# cp /etc/vsftpd/vsftpd.conf.backup /etc/vsftpd/vconf/vconf.tMP4.定制虚拟用户模版配置文件:
[root@localhost]# vi /etc/vsftpd/vconf/vconf.tmp
--------------------------------
local_root=/opt/vsftp/virtuser
virtuser 这个就是以后要指定虚拟的具体主路径。
anonymous_enable=NO
设定不允许匿名用户访问。
write_enable=YES
设定允许写操作。
local_umask=022
设定上传文件权限掩码。
anon_upload_enable=NO
设定不允许匿名用户上传。
anon_mkdir_write_enable=NO
设定不允许匿名用户建立目录。
idle_session_timeout=600   (根据用户要求.可选)
设定空闲连接超时时间。
data_connection_timeout=120
设定单次连续传输最大时间。
max_clients=10   (根据用户要求.可选)
设定并发客户端访问个数。
max_per_ip=5     (根据用户要求.可选)
设定单个客户端的最大线程数,这个配置主要来照顾Flashget、迅雷等多线程下载软件。
local_max_rate=50000   (根据用户要求.可选)
设定该用户的最大传输速率,单位b/s。
pam_service_name=vsftpd
chroot_local_user=YES
--------------------------------
这里将原vsftpd.conf配置文件经过简化后保存作为虚拟用户配置文件的模版。这里将并不需要指定太多的配置内容,主要的

框架和限制交由Vsftpd的主配置文件vsftpd.conf来定义,即虚拟用户配置文件当中没有提到的配置项目将参考主配置文件中

的设定。而在这里作为虚拟用户的配置文件模版只需要留一些和用户流量控制,访问方式控制的配置项目就可以了。这里的关

键项是local_root这个配置,用来指定这个虚拟用户的FTP主路径。5.更改虚拟用户的主目录的属主为虚拟宿主用户:
[root@localhost]# chown -R virtusers.virtusers /opt/vsftp/

6.检查权限:
[root@localhost]# ll /opt/vsftp/
total 24
drwxr-xr-x 2 overlord overlord 4096 Sep 16 05:14 ftp001
drwxr-xr-x 2 overlord overlord 4096 Sep 16 05:00 ftp002
drwxr-xr-x 2 overlord overlord 4096 Sep 16 05:00 ftp003


.给测试用户定制:
1.从虚拟用户模版配置文件复制:
[root@localhost]# cp /etc/vsftpd/vconf/vconf.tmp /etc/vsftpd/vconf/ftp001
2.针对具体用户进行定制:
[root@localhost]# vi /etc/vsftpd/vconf/ftp001
---------------------------------

local_root=/opt/vsftp/ftp001             (FTP用户ftp001 的登陆目录文件)
anonymous_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
idle_session_timeout=300
data_connection_timeout=90
max_clients=1
max_per_ip=1
local_max_rate=25000
pam_service_name=vsftpd
chroot_local_user=YES
---------------------------------
七.启动服务:
[root@localhost]# service vsftpd start
Starting vsftpd for vsftpd:                                [ OK ]
八.测试:
1.在虚拟用户目录中预先放入文件:
[root@localhost]# touch /opt/vsftp/ftp001/test.txt

2.从其他机器作为客户端登陆FTP:
可以IE或FTP客户端软直接访问

ie里输入 ftp://127.0.0.1 (服务器IP)

弹出对话框后.输入FTP用户名和密码
---------------------------------------------


注意:
在/etc/vsftpd/vsftpd.conf中,local_enable的选项必须打开为Yes,使得虚拟用户的访问成为可能,否则会出现以下现象:
----------------------------------
[root@localhost]# ftp
ftp> open 192.168.1.22
Connected to 192.168.1.22.
500 OOPS: vsftpd: both local and anonymous access disabled!
----------------------------------
原因:虚拟用户再丰富,其实也是基于它们的宿主用户virtusers的,如果virtusers这个虚拟用户的宿主被限制住了,那么虚

拟用户也将受到限制。

补充:
1.要查看服务器自带的防火墙有无挡住FTP 21端口 导致不能访问
2.查看 SELinux 禁用没有.要禁用
3.500 OOPS:错误 有可能是你的vsftpd.con配置文件中有不能被实别的命令,还有一种可能是命令的YES 或 NO 后面有空格。
4.要仔细查看各个用到的文件夹权限,及用户属主权限等


1 如何新加FTP用户

打开密码文件里加入(一行是用户.一是密码.依次类推)
#vi /etc/vsftpd/virtusers
加入用户后 保存退出

#db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db   (然后生成新的虚拟用数据文件)
#cp /etc/vsftpd/vconf/vconf.tmp d               (新建d用户,用虚拟用户模板vconf.tmp文件生成d虚拟用户文件)
#vi /etc/vsftpd/vconf/d                         (打开D虚拟用户文件.在第一行最后加入该用户对应的FTP目录)
#mkdir /opt/vsftp/WWW                          (新建WWW目录为d FTP用户登陆目录)
#service vsftpd restart
-------------------------------------------------------
2 如何修改FTP 用户登陆密码

打开密码文件里加入(第一行是用户.第二是密码.依次类推,只要改对应用户下面的密码即可)
#vi /etc/vsftpd/virtusers   
#db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db   (然后生成新的虚拟用数据文件)
#service vsftpd restart
posted @ 2012-02-02 16:49 Alpha 阅读(5276) | 评论 (0)编辑 收藏
 MySQL + PHP的模式在大并发压力下经常会导致MySQL中存在大量僵死进程,导致服务挂死。为了自动干掉这些进程,弄了个脚本,放在服务器后台通过crontab自动执行。发现这样做了以后,的确很好的缓解了这个问题。把这个脚本发出来和大家Share。

根据自己的实际需要,做了一些修改:

SHELL脚本:mysqld_kill_sleep.sh
#!/bin/sh
mysql_pwd="root的密码"
mysqladmin_exec
="/usr/local/bin/mysqladmin"
mysql_exec
="/usr/local/bin/mysql"
"/tmp"
mysql_timeout_log
="$mysql_timeout_dir/mysql_timeout.log"
mysql_kill_timeout_sh
="$mysql_timeout_dir/mysql_kill_timeout.sh"
"$mysql_timeout_dir/mysql_kill_timeout.log"
$mysqladmin_exec -uroot -p"$mysql_pwd" processlist | awk '{ print $12 , $2 ,$4}' | grep -Time | grep -'|' | sort -rn > $mysql_timeout_log
awk 
'{if($1>30 && $3!="root") print "'""$mysql_exec""' -e " "/"" "kill",$2 "/"" " -uroot " "-p""/"""'""$mysql_pwd""'""/"" ";" }' $mysql_timeout_log > $mysql_kill_timeout_sh
echo 
"check start ." >> $mysql_kill_timeout_log
echo `date` 
>> $mysql_kill_timeout_log
cat 
$mysql_kill_timeout_sh


  把这个写到mysqld_kill_sleep.sh。然后chmod 0 mysqld_kill_sleep.sh,chmod u+rx mysqld_kill_sleep.sh,然后用root账户到cron里面运行即可,时间自己调整。执行之后显示:
www# ./mysqld_kill_sleep.sh
/usr/local/bin/mysql -e "kill 27549" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27750" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27840" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27867" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27899" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27901" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27758" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27875" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27697" -uroot -p"mysql root的密码";
"kill 27888" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27861" -uroot -p"mysql root的密码";

  如果确认没有问题了,把最后的cat修改为sh即可。本人改写了下上面的脚本:
#!/bin/bash
mysql_pwd="密码"
mysql_exec="/usr/local/mysql/bin/mysql"
mysql_timeout_dir="/tmp"
mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"
"$mysql_timeout_dir/mysql_kill_timeout.log"
$mysql_exec -uroot -p$mysql_pwd -e "show processlist" | grep -i "Locked" >> $mysql_kill_timeout_log

for line in `$mysql_kill_timeout_log  | awk '{print $1}'`
do
echo "$mysql_exec -uroot -p$mysql_pwd -e /"kill $line/"" >> $mysql_kill_timeout_sh
done

cat $mysql_kill_timeout_sh

  很多时候!一不小心就锁表!这里讲解决锁表终极方法!

案例一
mysql>showprocesslist;

  参看sql语句,一般少的话
mysql>killthread_id;

  就可以解决了,kill掉第一个锁表的进程, 依然没有改善.既然不改善,咱们就想办法将所有锁表的进程kill掉吧,简单的脚本如下:
#!/bin/bash
mysql-uroot-e"show processlist"|grep-i"Locked">>locked_log.txt

forlinein`cat locked_log.txt | awk '{print$1}'`
do
echo"kill$line;">>kill_thread_id.sql
done

现在kill_thread_id.sql的内容像这个样子
kill66402982;
kill66402983;
kill66402986;
kill66402991;
.....

好了,我们在mysql的shell中执行,就可以把所有锁表的进程杀死了。
mysql>sourcekill_thread_id.sql

当然了,也可以一行搞定。
foridin`mysqladmin processlist | grep -i locked | awk '{print$1}'`
do
mysqladminkill${id}
done

案例二

  如果大批量的操作能够通过一系列的select语句产生,那么理论上就能对这些结果批量处理。但是mysql并没用提供eval这样的对结果集进行分析操作的功能。所以只能现将select结果保存到临时文件中,然后再执行临时文件中的指令。具体过程如下:
mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root';
+------------------------+
| concat('KILL ',id,';')
+------------------------+
| KILL 3101;            
| KILL 2946;            
+------------------------+
2 rows IN SET (0.00 sec)

mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root' INTO OUTFILE '/tmp/a.txt';
Query OK, 2 rows affected (0.00 sec)

mysql> source /tmp/a.txt;
Query OK, 0 rows affected (0.00 sec)

案例三

  MySQL + PHP的模式在大并发压力下经常会导致MySQL中存在大量僵死进程,导致服务挂死。为了自动干掉这些进程,弄了个脚本,放在服务器后台通过crontab自动执行。发现这样做了以后,的确很好的缓解了这个问题。把这个脚本发出来和大家Share。根据自己的实际需要,做了一些修改:

SHELL脚本:mysqld_kill_sleep.sh
#!/bin/sh
mysql_pwd="root的密码"
mysqladmin_exec="/usr/local/bin/mysqladmin"
mysql_exec="/usr/local/bin/mysql"
mysql_timeout_dir="/tmp"
mysql_timeout_log="$mysql_timeout_dir/mysql_timeout.log"
mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"
mysql_kill_timeout_log="$mysql_timeout_dir/mysql_kill_timeout.log"
$mysqladmin_exec -uroot -p"$mysql_pwd" processlist | awk '{ print $12 , $2 ,$4}' | grep -v Time | grep -v '|' | sort -rn > $mysql_timeout_log
awk '{if($1>30 && $3!="root") print "'""$mysql_exec""' -e " "\"" "kill",$2 "\"" " -uroot " "-p""\"""'""$mysql_pwd""'""\"" ";" }' $mysql_timeout_log > $mysql_kill_timeout_sh
echo "check start ...." >> $mysql_kill_timeout_log
echo `date` >> $mysql_kill_timeout_log
cat $mysql_kill_timeout_sh

  把这个写到mysqld_kill_sleep.sh。然后chmod 0 mysqld_kill_sleep.sh,chmod u+rx mysqld_kill_sleep.sh,然后用root账户到cron里面运行即可,时间自己调整。执行之后显示:
www# ./mysqld_kill_sleep.sh
/usr/local/bin/mysql -e "kill 27549" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27750" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27840" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27867" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27899" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27901" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27758" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27875" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27697" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27888" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27861" -uroot -p"mysql root的密码";

  如果确认没有问题了,把最后的cat修改为sh即可。本人改写了下上面的脚本:
#!/bin/bash
mysql_pwd="密码"
mysql_exec="/usr/local/mysql/bin/mysql"
mysql_timeout_dir="/tmp"
mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"
mysql_kill_timeout_log="$mysql_timeout_dir/mysql_kill_timeout.log"
$mysql_exec -uroot -p$mysql_pwd -e "show processlist" | grep -i "Locked" >> $mysql_kill_timeout_log
chmod 777 $mysql_kill_timeout_log
for line in `$mysql_kill_timeout_log  | awk '{print $1}'`
do
echo "$mysql_exec -uroot -p$mysql_pwd -e \"kill $line\"" >> $mysql_kill_timeout_sh
done
chmod 777 $mysql_kill_timeout_sh
cat $mysql_kill_timeout_sh

  是不是很方便呢!processlist命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令。
1、进入mysql/bin目录下输入mysqladmin processlist;
2、启动mysql,输入show processlist;

  如果有SUPER权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的MySQL帐户运行的线程)。得到数据形式如下(只截取了三条):
mysql> show processlist;

+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

| Id | User | Host | db | Command | Time| State | Info

+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

|207|root |192.168.0.20:51718 |mytest | Sleep | 5 | | NULL

|208|root |192.168.0.20:51719 |mytest | Sleep | 5 | | NULL

|220|root |192.168.0.20:51731 |mytest |Query | 84 | Locked |

select bookname,culture,value,type from book where id=001

  先简单说一下各列的含义和用途,第一列,id,不用说了吧,一个标识,你要kill一个语句的时候很有用。user列,显示单前用户,如果不是root,这个命令就只显示你权限范围内的sql语句。host列,显示这个语句是从哪个ip的哪个端口上发出的。呵呵,可以用来追踪出问题语句的用户。db列,显示这个进程目前连接的是哪个数据库。command列,显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。time列,此这个状态持续的时间,单位是秒。state列,显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成,info列,显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。

  这个命令中最关键的就是state列,mysql列出的状态主要有以下几种:
Checking table

  正在检查数据表(这是自动的)。
Closing tables

  正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。
Connect Out

  复制从服务器正在连接主服务器。
Copying to tmp table on disk

  由于临时结果集大于tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。
Creating tmp table

  正在创建临时表以存放部分查询结果。
deleting from main table

  服务器正在执行多表删除中的第一部分,刚删除第一个表。
deleting from reference tables

  服务器正在执行多表删除中的第二部分,正在删除其他表的记录。
Flushing tables

  正在执行FLUSH TABLES,等待其他线程关闭数据表。
Killed

  发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。MySQL会在每次的主循环中检查kill标志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么kill请求会在锁释放时马上生效。
Locked

  被其他查询锁住了。
Sending data

  正在处理Select查询的记录,同时正在把结果发送给客户端。
Sorting for group

  正在为GROUP BY做排序。
Sorting for order

  正在为ORDER BY做排序。
Opening tables

  这个过程应该会很快,除非受到其他因素的干扰。例如,在执Alter TABLE或LOCK TABLE语句行完以前,数据表无法被其他线程打开。正尝试打开一个表。
Removing duplicates

  正在执行一个Select DISTINCT方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。因此,MySQL需要再次去掉重复的记录,然后再把结果发送给客户端。
Reopen table

  获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表。
Repair by sorting

  修复指令正在排序以创建索引。
Repair with keycache

  修复指令正在利用索引缓存一个一个地创建新索引。它会比Repair by sorting慢些。
Searching rows for update

  正在讲符合条件的记录找出来以备更新。它必须在Update要修改相关的记录之前就完成了。
Sleeping

  正在等待客户端发送新请求.
System lock

  正在等待取得一个外部的系统锁。如果当前没有运行多个mysqld服务器同时请求同一个表,那么可以通过增加--skip-external-locking参数来禁止外部系统锁。
Upgrading lock

  Insert DELAYED正在尝试取得一个锁表以插入新记录。
Updating

  正在搜索匹配的记录,并且修改它们。
User Lock

  正在等待GET_LOCK()。
Waiting for tables

  该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知:
FLUSH TABLES tbl_name, Alter TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE,或OPTIMIZE TABLE。

waiting for handler insert

  Insert DELAYED已经处理完了所有待处理的插入操作,正在等待新的请求。大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。

  还有其他的状态没在上面中列出来,不过它们大部分只是在查看服务器是否有存在错误是才用得着。
posted @ 2012-01-19 14:20 Alpha 阅读(1928) | 评论 (0)编辑 收藏
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码
1.新建用户。
//登录MYSQL
@>mysql -u root -p
@>密码
//创建用户
mysql> mysql> insert into mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_sub
ject) values("localhost","pppadmin",password("passwd"),'','','');
这样就创建了一个名为:phplamp 密码为:1234 的用户。
然后登录一下。
mysql>exit;
@>mysql -u phplamp -p
@>输入密码
mysql>登录成功
2.为用户授权。
//登录MYSQL(有ROOT权限)。我里我以ROOT身份登录.
@>mysql -u root -p
@>密码
//首先为用户创建一个数据库(phplampDB)
mysql>create database phplampDB;
//授权phplamp用户拥有phplamp数据库的所有权限。
>grant all privileges on phplampDB.* to phplamp@localhost identified by '1234';
//刷新系统权限表
mysql>flush privileges;
mysql>其它操作
/*
如果想指定部分权限给一用户,可以这样来写:
mysql>grant select,update on phplampDB.* to phplamp@localhost identified by '1234';
//刷新系统权限表。
mysql>flush privileges;
*/
3.删除用户。
@>mysql -u root -p
@>密码
mysql>Delete FROM user Where User="phplamp" and Host="localhost";
mysql>flush privileges;
//删除用户的数据库
mysql>drop database phplampDB;
4.修改指定用户密码。
@>mysql -u root -p
@>密码
mysql>update mysql.user set password=password('新密码') where User="phplamp" and Host="localhost";
mysql>flush privileges;
5.列出所有数据库
mysql>show database;
6.切换数据库
mysql>use '数据库名';
7.列出所有表
mysql>show tables;
8.显示数据表结构
mysql>describe 表名;
9.删除数据库和数据表
mysql>drop database 数据库名;
mysql>drop table 数据表名;
posted @ 2011-12-27 17:30 Alpha 阅读(9827) | 评论 (0)编辑 收藏
搭建SVN服务,有效的管理代码,以下三步可以快速搞定。
1、安装         
#yum install subversion

  判断是否安装成功
#subversion -v

  svnserve, version 1.6.11 (r934486)
出现上面的提示,说明安装成功。


有了SVN软件后还需要建立SVN库。
#mkdir /opt/svn/repos
#svnadmin create /opt/svn/repos
执行上面的命令后,自动在repos下建立多个文件, 分别是conf, db,format,hooks, locks, README.txt。
   

2、配置

     上面的操作很简单,几个命令就搞定, 下面的操作也不难。
     进入上面生成的文件夹conf下,进行配置,   有以下几个文件authz, passwd, svnserve.conf
     其中authz 是权限控制,可以设置哪些用户可以访问哪些目录,   passwd是设置用户和密码的,    svnserve是设置svn相关的操作。


   2.1先设置passwd
   
[users]
# harry 
= harryssecret
# sally 
= sallyssecret
hello=123
用户名=密码

这样我们就建立了hello用户, 123密码  

   2.2 再设置权限authz

[/]
hello
= rw

意思是hello用户对所有的目录有读写权限,当然也可以限定。
如果是自己用,就直接是读写吧。



2.3最后设定snvserv.conf

anon-access = none # 使非授权用户无法访问
auth
-access = write # 使授权用户有写权限
password
-db = password
authz
-db = authz   # 访问控制文件
realm 
= /opt/svn/repos # 认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字。
采用默认配置. 以上语句都必须顶格写, 左侧不能留空格, 否则会出错.

好了,通过以上配置,你的svn就可以了。

3、连接

启动svn: svnserve --/opt/svn/repos

svn默认端口是3690
如果已经有svn在运行,可以换一个端口运行
svnserve --/opt/svn/repos --listen-port 3391

这样同一台服务器可以运行多个svnserver

好了,启动成功后,就可以使用了。
建议采用TortoiseSVN, 连接地址为: svn://your server address (如果指定端口需要添加端口  :端口号)

连接后可以上传本地的文件,有效的管理你的代码。

svn 端口和常用命令

有效选项:
  -d [--daemon]            : 后台模式
  --listen-port 参数     : 监听端口(后台模式)
  --listen-host 参数     : 监听主机名或IP地址(后台模式)
  --foreground             : 在前台运行(调试时有用)
  -h [--help]              : 显示这个帮助
  --version                : 显示程序版本信息
  -i [--inetd]             : inetd 模式
  -r [--root] 参数       : 服务根目录
  -R [--read-only]         : 强制只读成;优先于仓库配置文件
  -t [--tunnel]            : 隧道模式
  --tunnel-user 参数     : 隧道用户名(模式是当前用户UID的名字)
  -X [--listen-once]       : 监听一次(调试时有用)
  --pid-file 参数        : 将服务进程ID写入文件ARG中
  --service                : 作为windows服务运行(仅SCM)[/quote]

你可以用--listen-port 指定端口

在httpd.conf中,查找Listen 80,将80修改为你想要的端口,svn默认端口是3690

为svnserve 加上--listen-port参数,比如svnserve -d -r d:\svn --listen-port 81

你可以采用svn+apache组合搭建,既可以设置你想要的端口,还可以以WEB形式访问代码库

通过以上三步,可以快速的搭建起svn

SVN数据库迁移方法

版本库数据的移植:svnadmin dumpsvnadmin load

导出:

$svnadmin dump repos > dumpfile //将指定的版本库导出成文件dumpfile

新建:

$svnadmin create newrepos

导入:

$svnadmin load newrepos < dumpfile

posted @ 2011-12-19 11:44 Alpha 阅读(3886) | 评论 (0)编辑 收藏