一、系统篇

1、vi /etc/rc.local,加入ulimit -SHn 65535

这篇文章做参考还是挺好的:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1029881

二、Nginx篇

1、Nginx http块:屏蔽版本信息server_tokens off;不过还是可以通
过$SERVER["SERVER_SOFTWARE"]获得=>nginx/1.0.11.因此得vi /usr/local/nginx
/fastcgi_params(文件路径取决于你的nginx.conf路径) 修改
fastcgi_param SERVER_SOFTWARE nginx/nginx_version;将/nginx_version去
掉,或者改个性点^
^

2、Nginx http块:上传体积限制client_max_body_size 8m;

3、http块加入fastcgi_intercept_errors on; (这句要加上,否则404很混乱)

error_page 404 403 /404.html;(404.html文件体积不能太小)

4、文件类型:

vi /usr/local/webroot/mime.types

application/octet-stream url;(增加url快捷链接文件下载,这个一般用不着。)

application/vnd.android.package-archive apk;(增加安卓应用文件下载,这个一般用不着。)

5、Nginx伪静态方面.htaccess的功能太弱,需要在nginx.conf上设置,具体可以看下网上资料,一搜一大把。apache支持的.htaccess功能强大些。不过在nginx.conf上设置的伪静态规则却是很强大的。

6、禁止盗链:

location ~* .(txt|ico|gif|png|bmp|jpg|jpeg|zip|rar|gz|7z|exe|mp3|flv|swf)$ {

valid_referers none blocked a.org www.a.org ;

if (invalid_referer) {#invalid_referer为变量

rewrite ^/ http://www.a.org/404.html;

}

7、禁止IP访问:

有些VPS或机房会允许以IP直接访问,添加以下server块禁止:

server {

server_name _;

return 403;

}

8、禁止其他玉米访问

我碰到过新买的VPS,上面居然绑了N多域名,结果导致百度收录紊乱,添加以下server块禁止:

server {

listen 80 default;

rewrite ^(.*) http://www.iw3c.com permanent;

}

三、PHP篇

Php.ini:

1、屏蔽php版本信息expose_php=off,不过仍旧可以通过PHP_VERSION常量来显示,但远程探测已成功屏蔽了。

2、禁止危险函数
disable_functions =phpinfo,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

system,exec,phpinfo

3、限制目录:open_basedir =/var/www/sina/:/var/www/wangyi/:/var/www/logs/session/,如果是apache则可以使用php_admin_value open_basedir 限定

4、设置时区,关闭讨厌的警告date.timezone ="Asia/Shanghai"

5、display_errors = OFF 关闭报警信息(默认OFF),不过对于nginx的php-fpm跑php来说,报警信息控制由php-fpm.conf里的;php_flag[display_errors] = off控制,默认就是关闭状态。

6、memory_limit = 128M 这个参数并不需要去设置。你用php看下这个就明白了:

已用内存:'.$memory_usage; ?>

一般而言,即使设置成8M或12M都不会有问题,而且设置成128M也不是立即占用内存的。主要在上传文件时会大点(N人一起上传,或者脚本写得性能烂)。

7、magic_quotes_gpc = Off设置为on,不过,一个合格的php程序员应该在程序中始终使用
if(get_magic_quotes_gpc()){str=stripslashes(str);}来处理显示数据。当然,如果网站程序不是你
写的,还是把magic_quotes_gpc设置为on吧。

8、allow_url_fopen = On,没有理由设置为On,果断allow_url_fopen = Off

9、上传

;upload_tmp_dir =/var/www/tmp

upload_max_filesize = 2M

post_max_size = 8M

这三个还是要根据自己的情况设置一下的,联系Nginx的第2点。

10、session.save_path = "var/www/tmp"和upload_tmp_dir="var/www/tmp",这两个参数设
置一下,闲着没事时也可以删除一下节省点服务器空间,嘿嘿。(夸张了点,现在不缺硬盘)不过有人说存到/dev/shm下,直接以内存方式处理会非常快。
但我觉得除了管理员,实在是没必要让所有用户都采用session方式验证。至于说cookies不安全,不安全你就解决安全问题呗。

11、[安全相关][高危]esc输入/cgi.fix_pathinfo,设置cgi.fix_pathinfo = 0;(这个真恶心,你把一php
文件改为a.jpg,上传然后访问a.jpg/asdf.php试下就知) (好象5.3.10不存在此问题了,会显示Access denied. )

12、max_input_vars = 1000,无需设置,默认为1000,当然也可以设置小点,比如512。php 5.3.8加入此参数

php-fpm.conf:

1、设置超时时间request_terminate_timeout = 30

2、pid = run/php-fpm.pid前的分号去掉

3、再根据启动时的出错提示去掉分号:(5.3.10已默认开启,不过还是需要修改相关参数。#号后为注释内容,实际使用中需去掉)

pm = static #可选值pm = dynamic,如果为static,则进程数始终为pm.max_children指定值

;pm.max_children = 50 #静态方式下开启的php-fpm进程数量。

;pm.start_servers = 20 #动态方式下的起始php-fpm进程数量。

;pm.min_spare_servers = 5 #动态方式下的最小php-fpm进程数量。

;pm.max_spare_servers = 35 #动态方式下的最大php-fpm进程数量。内存除以20M的值

;pm.max_requests = 500 #每进程的请求数

对于服务器而言,推荐使用静态方式,而小内存VPS则适合动态方式以节省内存。简单讲,1G以上用静态吧,以下用动态方式。什么,刚好是1G?

4、如要显示出错信息开启这行:;php_flag[display_errors] = on

四、MySQL篇

1、my.cnf:

#Enter a name for the binary log. Otherwise a default name will be used.

#log-bin="D:/job/MySQL/logs/"

#Enter a name for the query log file. Otherwise a default name will be used. 查询语句日志

#log= "D:/job/MySQL/logs/"

#Enter a name for the error log file. Otherwise a default name will be used. MySQL出错日志,修改下路径。一般开启这个

log-error= "D:/job/MySQL/logs/"

#Enter a name for the update log file. Otherwise a default name will be used. 更新语句日志

#log-update= "D:/job/MySQL/logs/"

#慢查询日志,非必须。调试性能时非常有用,单位为秒

long_query_time = 2

slow-query-log=on(开启慢查询,新版本,大概是5.5+)

slow-query-log_file=/var/log/logs/slow_query.log(新版本,大概是5.5+)

#log-slow-queries = /var/log/slow_query.log (旧版本)

log-queries-not-using-indexes = false

#skip-networking,禁用TCPIP连接,如果远程连接则必须去除此项。可提升安全性(当然iptables作用也在那)

skip-networking

back_log=256

key_buffer_size,Do not set it larger than 30% of your available memory,默认16M,索引缓冲,不可太大,4G MySQL服务器推荐1G

key_buffer_size=128M

read_buffer_size=1M

read_rnd_buffer_size=2M

sort_buffer_size=512K

join_buffer_size=512K

thread_cache_size=100

open_files_limit=100 #mysql执行show global status查看open_files数,将open_files_limit设置比open_files大即可

table_open_cache=512 #MySQL 5.1+,table_cache由table_open_cache取代

max_connections=512

max_connect_errors=5000

wait_timeout=5

#注意,max_connections*sort_buffer_size必须小于服务器内存4G,否则设置无意义。当然实际也跑不满
max_connections这个连接数,否则就得增加值了。max_connections为并发连接数,一般到100个网站访问量就不得了了,也是
不大可能发生的。

tmp_table_size=64M

query_cache_size=64M

query_cache_limit=2M

innodb引擎设置方面主要在于innodb_buffer_pool_size =1G和innodb_log_file_size = 64M的问
题,对于前者,官方建议你设置的数值为不启动MySQL时服务器剩余内存的50 - 80 %。或者你也可以简单理解为:总之你的服务器在刚启动时,还剩
余20%左右的内存就对了啦。

2、帐户

shell>/usr/local/mysql/bin/mysql -u root -p进入后

1)DELETE FROM mysql.user WHERE User = '';删除匿名用户(系统弄这用户是做测试用的,对应test数据库)

2)创建新用户:

GRANT ALL PRIVILEGES ON . TO 'kuhanzhu'@'localhost' IDENTIFIED BY 'mima1234';

GRANT ALL PRIVILEGES ON . TO 'kuhanzhu'@'127.0.0.1' IDENTIFIED BY 'mima1234';

3)更改root密码:

UPDATE mysql.user SET Password = PASSWORD('mima123') WHERE User = 'root';

4)附:

你也可以在创建新用户后DELETE FROM mysql.user WHERE User = 'root';不过记得先给新用户GRANT权限,否则就不能再创建新用户了。

3、经常使用OPTIMIZE TABLE,如果你的网站信息突然不能读取sql数据了,数据库连接没错,语句没没错,更不可能更改过,那么使用这句。

五、防火墙及端口篇

1、)如果web和MySQL同一服务器,那么不要开放3306到防火墙。以及在my.cnf中skip-networking(参考第一点)。不开放
3306远程连接将会大大提高安全性。你如果喜欢用Navicat Premium备份,则可以使用http Tunnel通道来备份。不过服务器
(VPS以上级别)的话,使用命令备份FTP下载才是王道。

2、)修改ssh端口,整天被人扫,看着就不爽。iptables增加自定义端口3389(可自己想一个),保存并重启iptables(这里要仔细)。
再vi /etc/ssh/sshd_config修改端口,然后service sshd restart,最后再把22那条防火墙策略删除。

3、)修改ftp端口。具体请看各ftp软件设置资料。vsftpd可参看VSftpd篇

六、VSftpd篇

作为最安全的ftp服务软件,没什么好说的。只有一点:自定义端口。把端口更改下可以提高安全系数。用过FileZilla server或者IIS FTP的人都知道,看日志,整天有人扫描暴力登陆,烦都烦死了。

目的:将ftp 端口21改为1314

步骤:

1、vi /etc/sysconfig/iptables 加入:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 1024:1500 -j ACCEPT

保存重起:service iptables restart

2、vi /etc/vsftpd/vsftpd.conf 加入:

listen_port=1314

ftp_data_port=20

pasv_enable=YES

pasv_min_port=1024

pasv_max_port=1500

保存重起:service vsftpd restart

3、FTP客户端(flashfxp或FileZilla)填入地址和端口1314,模式改为被动或自动判断。即可连接上。

注意:自定义端口必须使用被动模式,而被动模式麻烦的很多:

1)笔记本通过无线路由不能连接上。

2)主机连虚拟机(不是虚拟主机)通过ftp://192.168.5.102:1314也连不上。

无线路由上网被动模式连不上可能跟无线路由器有关,之前的连不上,换一个后可以连上。具体还没查过哪里设置有关。

七、Apache篇

顺带吧,还是有很多Apache的用户的。

1、禁用目录浏览,搜索Indexes FollowSymLinks

Options -Indexes FollowSymLinks

2、屏蔽apache版本及主机信息,加入:

ServerSignature Off

ServerTokens Prod

HostnameLookups Off

3、加入以下这堆东东:

KeepAlive on

KeepAliveTimeout 5

MaxKeepAliveRequests 100

Timeout 60

ServerLimit 1000

StartServers 10

MinSpareServers 10

MaxSpareServers 15

MaxClients 660

MaxRequestsPerChild 680

#ServerLimit和MaxClients是连接数限制设定,默认MaxClients为150,但也不要设置太大,否则服务器承受不
了……MaxRequestsPerChild太大的话,服务器内存问题限制,内存好可以设置为0或调整大值。4G的服务器可以设置为5000,然后观察
内存进行调整

4、日志及安全性(都在下面这段代码里,自己研究吧,Windows和linux只是书写路径的区别)

<VirtualHost *:80>

ServerAdmin admin@x.net

DocumentRoot D:myphproot

ServerName [www.iw3c.com](http://www.shangbanla.net)

<FilesMatch ".(ico|gif|swf|css|js)">

#不记录icogif这些文件的日志

SetEnv dontlog 1

#错误记录,主要是404什么的

ErrorLog logs/shangbanla.net-error_log

#日志分割,年月日,Linux则使用计划任务分割即可。

#CustomLog "|bin/rotatelogs.exe logs/access_log_%Y%m%d 86400 480" combined env=!dontlog

#php的执行目录,包括session的存放读取目录和上传的临时文件目录,修改session.save_path = "var/www/tmp"和upload_tmp_dir="var/www/tmp"。

php_admin_value open_basedir "var/www:/tmp:/var/session" #nginx不支持这个,也就
是说,无法禁止跨目录浏览,当然php也有个basedir的设置。因此对于虚拟主机,建议使用apache,防止一个用户浏览打包另一用户文件