今天业务反馈某个定时任务不生效了。重新去查看配置定时任务, 执行命令sudo crontab -e 时提示如下错误:鉴定令牌不再有效；需要新的鉴定令牌 You (root) are not allowed to access to (crontab) because of pam configuration.问题排查过程:然后就检查当前用户下的定时任务是否正常, 运行 crontabe -e 一切正常，说明应该不是cron软件的问题。sudo su root 切换到 root 账号下执行 crontab -e 仍然提示同样的错误信息。查询系统日志 tail -n 100 , 有类似如下信息提示, root该用户密码过期了crond[32181]: pam_unix(crond:account): expired password for user root (password aged)重新修改下 root 用户密码后恢复正常, 问题解决~
PHP环境版本CentOS6.5的PHP版本为5.6.21通过yum方式安装的, memcache扩展已经通过yum 方式安装好了首先需要下载并安装libmemcached因为memcached扩展是基于libevent的事件处理的, 首先需要安装libmemcached 下载地址 解压并安装：tar zxf libmemcached-1.0.18.tar.gz cd libmemcached-1.0.18 ./configure --prefix=/usr/local/libmemcached --with-memcached//注意：--with-memcached这个选项一定要加上 make make install注意:如果需要适用sasl, 也可以在安装libmemcahced前安装cyrus-sasl-devel：yum install cyrus-sasl-devel安装memcached扩展首先下载memcached扩展, 下载地址 解压并安装:tar zxf memcached-2.2.0.tgz cd zxf memcached-2.2.0 phpize ./configure --with-php-config=/usr/bin/php-config --disable-memcached-sasl --with-libmemcached-dir=/usr/local/libmemcached make make test make install注意:如果不使用--disable-memcached-sasl安装过程中会提示error 'configure: error: no, sasl.h is not available. Run configure with --disable-memcached-sasl to disable this check '至此php的memcached扩展安装完毕, 重启php-fpm 即可生效。
Let’sEncrypt简介通过提供免费的数字认证，Let’sEncrypt 项目鼓励更多网站采用加密连接。该项目由互联网安全研究集团（ISRG）负责，除 Mozilla 之外，参与 ISRG 这一项目的其他公司还包括思科、Akamai、电子前线基金会和 IdenTrust。该组织还在网站上列出了一些赞助商，包括 Chrome 和 Facebook。自其2012年推出，去年12月份进入公开测试阶段，已经为380万域名提供了免费的安 全防护措施，Let's Encrypt向广大的网站提供免费SSL证书，不管是对于网站站长、互联网用户，还是对整个Web互联网，都是非常有利的，它有利于整个互联网的安全。HTTPS的必要性 HTTPS在客户端和服务器之间传输加密内容，即使被窃听，也极难解密；而HTTP明文传输，攻击者很容易窃听。 防止被劫持，天朝的运营商劫持、挂广告还是比较猖獗的，普及HTTPS非常必要的。 HTTPS不能保证绝对的安全，但能极大地提高攻击/劫持的门槛和代价。自从DNSpod 可以通过 Lets Encrypt 的验证之后，作者立马也安装上该证书了。 首先说明下安装服务器环境： CentOS 6.7 Nginx1.8 + PHP5.6.21 + MySQL5.5.45 安装步骤1、安装Git、BC、EPELyum -y install git bc epel-release2、下载Let’s Encryptgit clone https://github.com/letsencrypt/letsencrypt mv letsencrypt /optletsencrypt被安装到/opt/letsencrypt/目录3、以Diffie-Hellman（迪菲-郝尔曼）生成密钥openssl dhparam -out /etc/ssl/certs/dhparam.pem 20484、申请Let’s Encrypt认证，注意修改如下选项--email 是申请者的使用邮箱地址 -d 是申请的域名 --webroot 是网站根目录mkdir -p /var/www/www.lezhzihe.net/.well-known/acme-challenge cd /opt/letsencrypt ./letsencrypt-auto certonly --email lezhizhe_net@163.com -d "www.lezhizhe.net" --webroot -w /var/www/www.lezhizhe.net/ --agree-tos成功后会产生三个文件，分别是/etc/ssl/certs/dhparam.pem /etc/letsencrypt/live/www.lezhizhe.net/fullchain.pem /etc/letsencrypt/live/www.lezhizhe.net/privkey.pem5、修改Nginx站点配置修改站点配置文件如下：listen 443 ssl; server_name www.lezhizhe.net; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_certificate /etc/letsencrypt/live/www.lezhizhe.net/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.lezhizhe.net/privkey.pem; ssl on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_stapling on; ssl_stapling_verify on; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; 修改后检测配置是否正确： nginx -t 重新加载Nginx配置 nginx -s reload 访问站点检查是否可以正常https方式打开, 如果开启防火墙需要开放443端口！ 6、自动更新SSL证书设置因为Let’s Encrypt的证书有效期是3个月，需要设置定时任务每个月更新一次证书。注意修改该脚本下的邮箱地址、域名he网站根目录。mkdir -p /etc/letsencrypt/configs cat >> /etc/letsencrypt/configs/www.lezhizhe.net.conf <<EOF domains = www.lezhizhe.net rsa-key-size = 2048 server = https://acme-v01.api.letsencrypt.org/directory email = lezhizhe_net@163.com text = True authenticator = root webroot-path = /var/www/www.lezhizhe.net/ EOF自动更新shell脚本如下： renew-letsencrypt.sh#!/bin/sh cd /opt/letsencrypt/ ./letsencrypt-auto certonly --config /etc/letsencrypt/configs/www.lezhizhe.net.conf --agree-tos if [ $? -ne 0 ] then ERRORLOG=`tail /var/log/letsencrypt/letsencrypt.log` echo -e "The Let's Encrypt cert has not been renewed! \n \n" \ $ERRORLOG else nginx -s reload fi exit 0修改为可执行权限chmod +x /root/renew-letsencrypt.shcrontab -e @monthly cd /opt/letsencrypt && git pull @monthly /root/renew-letsencrypt.sh
概述Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的，然而当Redis重启后，所有存储在内存中的数据将会丢失，在很多情况下是无法容忍这样的事情的。所以，我们需要将内存中的数据持久化！典型的需要持久化数据的场景如下： 将Redis作为数据库使用； 将Redis作为缓存服务器使用，但是缓存miss后会对性能造成很大影响，所有缓存同时失效时会造成服务雪崩，无法响应。 本文介绍Redis所支持的两种数据持久化方式。Redis数据持久化Redis支持两种数据持久化方式：RDB方式和AOF方式。前者会根据配置的规则定时将内存中的数据持久化到硬盘上，后者则是在每次执行写命令之后将命令记录下来。两种持久化方式可以单独使用，但是通常会将两者结合使用。RDB方式RDB方式的持久化是通过快照的方式完成的。当符合某种规则时，会将内存中的数据全量生成一份副本存储到硬盘上，这个过程称作”快照”，Redis会在以下几种情况下对数据进行快照： 根据配置规则进行自动快照； 用户执行SAVE, BGSAVE命令； 执行FLUSHALL命令； 执行复制（replication）时。 执行快照的场景 根据配置自动快照Redis允许用户自定义快照条件，当满足条件时自动执行快照，快照规则的配置方式如下：save 900 1 save 300 10 save 60 10000每个快照条件独占一行，他们之间是或（||）关系，只要满足任何一个就进行快照。上面配置save后的第一个参数T是时间，单位是秒，第二个参数M是更改的键的个数，含义是：当时间T内被更改的键的个数大于M时，自动进行快照。比如save 900 1的含义是15分钟内(900s)被更改的键的个数大于1时，自动进行快照操作。执行SAVE或BGSAVE命令除了让Redis自动进行快照外，当我们需要重启，迁移，备份Redis时，我们也可以手动执行SAVE或BGSAVE命令主动进行快照操作。 SAVE命令：当执行SAVE命令时，Redis同步进行快照操作，期间会阻塞所有来自客户端的请求，所以放数据库数据较多时，应该避免使用该命令； BGSAVE命令： 从命令名字就能看出来，这个命令与SAVE命令的区别就在于该命令的快照操作是在后台异步进行的，进行快照操作的同时还能处理来自客户端的请求。执行BGSAVE命令后Redis会马上返回OK表示开始进行快照操作，如果想知道快照操作是否已经完成，可以使用LASTSAVE命令返回最近一次成功执行快照的时间，返回结果是一个Unix时间戳。 执行FLUSHALL命令当执行FLUSHALL命令时，Redis会清除数据库中的所有数据。需要注意的是：不论清空数据库的过程是否触发 了自动快照的条件，只要自动快照条件不为空，Redis就会执行一次快照操作，当没有定义自动快照条件时，执行FLUSHALL命令不会进行快照操作。执行复制当设置了主从模式时，Redis会在复制初始化是进行自动快照。快照原理Redis默认会将快照文件存储在Redis当前进程的工作目录的dump.rdb文件中，可以通过配置文件中的dir和dbfilename两个参数分别指定快照文件的存储路径和文件名，例如：dbfilename dump.rdb dir /opt/soft/redis-3.0.4/cache快照执行的过程如下： Redis使用fork函数复制一份当前进程（父进程）的副本（子进程）； 父进程继续处理来自客户端的请求，子进程开始将内存中的数据写入硬盘中的临时文件； 当子进程写完所有的数据后，用该临时文件替换旧的RDB文件，至此，一次快照操作完成。 需要注意的是：在执行fork是时候操作系统（类Unix操作系统）会使用写时复制（copy-on-write）策略，即fork函数发生的一刻，父进程和子进程共享同一块内存数据，当父进程需要修改其中的某片数据（如执行写命令）时，操作系统会将该片数据复制一份以保证子进程不受影响，所以RDB文件存储的是执行fork操作那一刻的内存数据。所以RDB方式理论上是会存在丢数据的情况的(fork之后修改的的那些没有写进RDB文件)。通过上述的介绍可以知道，快照进行时时不会修改RDB文件的，只有完成的时候才会用临时文件替换老的RDB文件，所以就保证任何时候RDB文件的都是完整的。这使得我们可以通过定时备份RDB文件来实现Redis数据的备份。RDB文件是经过压缩处理的二进制文件，所以占用的空间会小于内存中数据的大小，更有利于传输。Redis启动时会自动读取RDB快照文件，将数据从硬盘载入到内存，根据数量的不同，这个过程持续的时间也不尽相同，通常来讲，一个记录1000万个字符串类型键，大小为1GB的快照文件载入到内存需要20-30秒的时间。示例下面演示RDB方式持久化，首先使用配置有如下快照规则：save 900 1 save 300 10 save 60 10000 dbfilename dump.rdb dir /opt/soft/redis-3.0.4/cache的配置文件/opt/soft/redis-3.0.4/conf/redis.conf启动Redis服务：然后通过客户端设置一个键值：[root@localhost~]$ /opt/soft/redis-3.0.4/src/redis-cli -p 6379 127.0.0.1:6379> set test-rdb HelloWorld OK 127.0.0.1:6379> get test-rdb "HelloWorld" 127.0.0.1:6379>现在强行kill Redis服务：现在到/opt/soft/redis-3.0.4/cache目录看，目录下出现了Redis的快照文件dump.rdb：[root@localhost/opt/soft/redis-3.0.4/cache]$ ls dump.rdb现在重新启动Redis：然后再用客户端连接，检查之前设置的key是否还存在：[qifuguang@Mac~]$ /opt/soft/redis-3.0.4/src/redis-cli -p 6379 127.0.0.1:6379> get test-rdb "HelloWorld" 127.0.0.1:6379>可以发现，之前设置的key在Redis重启之后又通过快照文件dump.rdb恢复了。AOF方式在使用Redis存储非临时数据时，一般都需要打开AOF持久化来降低进程终止导致的数据丢失，AOF可以将Redis执行的每一条写命令追加到硬盘文件中，这已过程显然会降低Redis的性能，但是大部分情况下这个影响是可以接受的，另外，使用较快的硬盘能提高AOF的性能。开启AOF默认情况下，Redis没有开启AOF（append only file）持久化功能，可以通过在配置文件中作如下配置启用：appendonly yes开启之后，Redis每执行一条写命令就会将该命令写入硬盘中的AOF文件。AOF文件保存路径和RDB文件路径是一致的，都是通过dir参数配置，默认文件名是：appendonly.aof，可以通过配置appendonlyfilename参数修改，例如：appendonlyfilename appendonly.aofAOF持久化的实现AOF纯文本的形式记录了Redis执行的写命令，例如在开启AOF持久化的情况下执行如下命令：[root@localhost/opt/soft/redis-3.0.4]$ ./src/redis-cli 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> set aof1 value1 OK 127.0.0.1:6379> set aof2 value2 OK 127.0.0.1:6379>然后查看/opt/soft/redis-3.0.4/cache/appendonly.aof文件：[root@localhost/opt/soft/redis-3.0.4/cache]$ cat appendonly.aof *2 $6 SELECT $1 0 *3 $3 set $4 aof1 $6 value1 *3 $3 set $4 aof2 $6 value2文件中的内容正是Redis刚才执行的命令的内容，内容的格式就先不展开叙述了。AOF文件重写假设Redis执行了如下命令：[root@localhost/opt/soft/redis-3.0.4]$ ./src/redis-cli 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> set k v1 OK 127.0.0.1:6379> set k v2 OK 127.0.0.1:6379> set k v3 OK 127.0.0.1:6379>如果这所有的命令都写到AOF文件的话，将是一个比较蠢行为，因为前面两个命令会被第三个命令覆盖，所以AOF文件完全不需要保存前面两个文件，事实上Redis确实就是这么做的。删除AOF文件中无用的命令的过程成为”AOF重写”，AOF重写可以在配置文件中做相应的配置，当满足配置的条件时，自动进行AOF重写操作。配置如下：auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb第一行的意思是，目前的AOF文件的大小超过上一次重写时的AOF文件的百分之多少时再次进行重写，如果之前没有重写过，则以启动时AOF文件大小为依据。 第二行的意思是，当AOF文件的大小大于64MB时才进行重写，因为如果AOF文件本来就很小时，有几个无效的命令也是无伤大雅的事情。 这两个配置项通常一起使用。我们还可以手动执行BDREWRITEAOF命令主动让Redis重写AOF文件，执行重写命令之后查看现在的AOF文件：[root@localhost/opt/soft/redis-3.0.4]$ cat cache/appendonly.aof *2 $6 SELECT $1 0 *3 $3 SET $4 aof2 $6 value2 *3 $3 SET $1 k $2 v3 *3 $3 SET $4 aof1 $6 value1可以看到，文件中并没有再记录set k v1这样的无效命令。同步硬盘数据虽然每次执行更改数据库的内容时，AOF都会记录执行的命令，但是由于操作系统本身的硬盘缓存的缘故，AOF文件的内容并没有真正地写入硬盘，在默认情况下，操作系统会每隔30s将硬盘缓存中的数据同步到硬盘，但是为了防止系统异常退出而导致丢数据的情况发生，我们还可以在Redis的配置文件中配置这个同步的频率：# appendfsync always appendfsync everysec # appendfsync no第一行表示每次AOF写入一个命令都会执行同步操作，这是最安全也是最慢的方式； 第二行表示每秒钟进行一次同步操作，一般来说使用这种方式已经足够； 第三行表示不主动进行同步操作，这是最不安全的方式。原文链接
原因因为服务器有变动，需要将SVN服务器迁移，每次迁移都要查找迁移命令，为了以后迁移方便，现在将迁移流程整理如下：一、数据导出*暂停SVN服务器 *导出原SVN服务器上的数据，命令如下：svnadmin dump /repository/directory > 2016.dump二、数据导入*在目标SVN服务器上新建svn项目svnadmin create /repository/newdir*将备份文件上传到目标服务器，然后导入，命令如下：svnadmin load /repository/newdir < 2016.dump*将原来SVN项目下的conf文件覆盖的目标SVN服务器项目下 *启动SVN服务器三、切换SVN地址切换语法：svn switch --relocate 原路径 新路径 例如：svn switch --relocate svn://10.0.10.1/oldprojects svn://10.0.1.1/newprojects
在开发程序过程中经常需要终端下查找某个文件夹或者文件下包含某关键字的文件列表， 下面的命令会有帮助find ./ -name "*.php"|xargs grep "keywords"如果要显示行号需要加在grep里加n参数find ./ -name "*.php"|xargs grep -n "keywords"
1、系统选择CentOS 系统，大部分的服务器都是使用CentOS系统。CentOS（Community Enterprise Operating System，中文意思是：社区企业操作系统）是Linux发行版之一，它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码，因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的不同，在于CentOS并不包含封闭源代码软件。 2、安装好系统如何配置Web服务器 2.1 升级服务器yum update 平时也要经常更新，及时补上一些已公开的服务器漏洞。 2.2防火墙：CentOS5/6防火墙iptables, CentOS7 防火墙firewalld。防止漏洞攻击 服务器默认都已经安iptables软件 iptables配置和Firewalld配置 只开放需要的端口，白名单的形式开放端口。 2.3 SSH配置、配置端口或者key方式登录。安全入口 ssh配置文件一般是/etc/ssh/sshd_config 2.4 时间同步配置ntpdate 定时同步日期 安装：yum install ntpdate2.5 磁盘分区及挂载 ext4文件系统， fdisk dev 命令分区 mkfs.ext4 格式化磁盘分区 mount –t ext4 dev dir 挂载分区 编辑/etc/fstab 文件，防止重启后需要重新挂载 2.6 安装及配置VIM，默认的是vi编辑器。VIM更加强大，可以提高不少效率，还有语法高亮功能。 3、NMP配置 3.1 安装NMP需要的一些基础类库以及编译软件gcc等 yum -y install gcc gcc-c++ glibc automake autoconf libtool make pcre-devel 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 curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel ncurses ncurses-devel 3.2 Nginx Nginx 编译安装Nginx，官网下载最新稳定版本的Nginx，编译安装。 编译安装命令： 将Nginx加入到Service列表 chkconfig 如何使用 Nginx配置参数【对照实际系统讲解】 3.3 MySQL 编译安装 MySQL5.5.47 1、安装CMAKE (MySQL需要CMAKE方式安装) 2、安装MySQL 3、MySQL主从配置 4、MySQL用户级权限配置[最小权限原则] 4.4 PHP 安装 yum方式安装，安装php-fpm进程池方式管理软件； php.ini配置 php-fpm.conf配置 4、PHP如何编译安装扩展【如何安装Yaf扩展】 1、安装 php-devel 2、下载Yaf并加压 3、进入加压目录执行 phpize; ./configure -–with-php-config=/php-config-pahth make make test make install 4、修改php.ini
日志文件说明 /var/log/message 系统启动后的信息和错误日志，是Red Hat Linux中最常用的日志之一/var/log/secure 与安全相关的日志信息/var/log/maillog 与邮件相关的日志信息/var/log/cron 与定时任务相关的日志信息/var/log/spooler 与UUCP和news设备相关的日志信息/var/log/boot.log 守护进程启动和停止相关的日志消息 系统 uname -a # 查看内核/操作系统/CPU信息cat /etc/issuecat /etc/redhat-release # 查看操作系统版本cat /proc/cpuinfo # 查看CPU信息hostname # 查看计算机名lspci -tv # 列出所有PCI设备lsusb -tv # 列出所有USB设备lsmod # 列出加载的内核模块env # 查看环境变量 资源 free -m # 查看内存使用量和交换区使用量df -h # 查看各分区使用情况du -sh <目录名> # 查看指定目录的大小grep MemTotal /proc/meminfo # 查看内存总量grep MemFree /proc/meminfo # 查看空闲内存量uptime # 查看系统运行时间、用户数、负载cat /proc/loadavg # 查看系统负载 磁盘和分区 mount | column -t # 查看挂接的分区状态fdisk -l # 查看所有分区swapon -s # 查看所有交换分区hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)dmesg | grep IDE # 查看启动时IDE设备检测状况 网络 ifconfig # 查看所有网络接口的属性iptables -L # 查看防火墙设置route -n # 查看路由表netstat -lntp # 查看所有监听端口netstat -antp # 查看所有已经建立的连接netstat -s # 查看网络统计信息 进程 ps -ef # 查看所有进程top # 实时显示进程状态（另一篇文章里面有详细的介绍） 用户 w # 查看活动用户id <用户名> # 查看指定用户信息last # 查看用户登录日志cut -d: -f1 /etc/passwd # 查看系统所有用户cut -d: -f1 /etc/group # 查看系统所有组crontab -l # 查看当前用户的计划任务 服务 chkconfig –list # 列出所有系统服务chkconfig –list | grep on # 列出所有启动的系统服务 程序 rpm -qa # 查看所有安装的软件包
Mac或者Linux下批量转换文件编码及修改文件扩展名
转换文本编码是因为 Mac 下只支持Unicode（UTF-8），GBK文件打开乱码 单个文件转换代码： iconv -f GBK -t UTF-8 a.php > a.php.utf8mb4 批量转换文本编码代码: find *.php -exec sh -c "iconv -f GBK -t utf8mb4 {} > {}.utf8mb4" \;批量修改文件扩展名是因为 批量修改文件编码以后扩展名变了 批量修改文件扩展名代码 for i in *;do mv $i $(echo $i|sed 's/\.php\.utf8mb4/\.php/');done
平时工作中需要维护一些Linux服务器, 有时候也需要自己配置下服务器, 一般主要是配置LNMP服务。整理了一些服务器安装配置方面的知识,现在就总结下。 Linux最低权限安全配置 Nginx、MySQL、PHP-FPM三者都应该是以最低权限用户组运行。 网站目录的文件用户组和PHP运行用户属主应该区分开, 设置PHP对网站文件只有可执行权限, 对于静态文件都交给Nginx处理。比如PHP-FPM的用户组为php-fpm:php-fpm, 网站目录www.lezhizhe.net其用户组为www:www, 文件属性为644，也就是说php合nginx在网站根目录只有读权限。对于文件上传目录和缓存目录, 可以设置777权限, 生成的文件要设置为644属性, 禁止上传的文件具有可执行权限。 对于PHP使用open_basedir限制虚拟主机跨目录访问(网上有说在php.ini文件中修改open_basedir, 经测试不生效)。不过可以在nginx的每个站点的con.f文件中设置PHP的open_basedir属性(注意如果在某个站点设置了该属性其它站点未设置, 会造成其它站点打不开的情况): fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/"; Linux防火墙及端口配置 1、禁止SSH密码登陆方式, 采用公钥方式登陆。 2、开启iptables。只开放必要的端口出来。iptable配置如下: *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [46:7024] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -i eth1 -j ACCEPT -A INPUT -p tcp -m tcp --sport 53 -j ACCEPT //DNS端口 -A INPUT -p udp -m udp --sport 53 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT //HTTP端口 -A INPUT -p tcp -m state --state NEW -m tcp --dport 4000 -j ACCEPT //FTP端口 -A INPUT -p tcp -m state --state NEW -m tcp --dport 4355 -j ACCEPT //SSh端口 -A INPUT -p tcp -m state --state NEW -m tcp --dport 30000:60000 -j ACCEPT //FTP被动模式端口 -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT PHP安装配置 1.禁用不安全PHP函数 disable_functions = show_source,system,shell_exec,passthru,exec,popen,proc_open,proc_get_status,phpinfo 2.关闭错误日志防止输出错误信息, 记录log方便程序调试 display_errors = Off log_errors=On error_log=/var/log/php-fpm/sie-error.log3.关闭远程代码执行。如果启用，PHP可以通过allow_url_fopen，在file_get_contents()、include、require中获取诸如FTP或网页内容这些远程数据。如果忘记了对输入数据进行过滤，而这些函数调用了这些数据，则形成了注入漏洞。 allow_url_fopen=Off4.防止PHP信息泄露, 不轻易透露自己php版本信息，防止黑客针对这个版本的php发动攻击. expose_php = Off5.禁止动态加载链接库: enable_dl = Off6.将文件上传到远程服务器, 例如nfs等。当然也可以调用你们写好的php接口。 即使有上传漏洞，那么文件也被传到了静态服务器上。木马等文件根本无法执行。 Nginx限制访问 有些目录存放的是一些类库文件或者模板文件, 不需要用户访问的，可以在该目录访问限制返回404。如lib类文件目录和template模板目录： location ~ ^/(lib|template)/ { return 404; }对于静态文件(如js、css、图片等)限制通过PHP执行： location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ { if (-f $request_filename) { expires 0d; break; } }对于PHP程序文件，一般都是很少的几个入口文件, 可以直接限制这几个PHP文件的执行。例如现在只有index.php、user.php、admin.php三个入口文件，那我们只把这三个PHP文件交给fast-cgi文件去执行。 location ~ ^/(index|user|admin)\.php { fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(/?.+)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/"; include fastcgi_params; fastcgi_pass 127.0.0.1:9000; }