Lnmp环境的设置与优化

  • A+
所属分类:VPS相关

一、系统篇
1、增加系统文件打开数vi /etc/security/limits.conf
* hard nofile 51200
* soft nofile 51200
这篇文章做参考还是挺好的:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1029881

2、关闭Mail Server(centos7):systemctl disable postfix.service
启用:systemctl enable postfix.service

关闭Mail Server(centos6):chkconfig postfix off

二、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.flashgou.com permanent;
}
9、禁止目录执行php(解析php)
location /uploads/ {
location ~ .*\.(php)?$ {
deny all;
}
}

10、# set php open_basedir
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";

三、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看下这个就明白了:
<?php
if (function_exists('memory_get_usage')) $memory_usage = round(memory_get_usage() / 1024 / 1024, 2) . ' MByte';
else $memory_usage = 'N/A';
echo '<br/>已用内存:'.$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吧。(php 7 已淘汰magic_quotes_gpc)
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前的分号去掉,这样就可以通过kill -SIGUSR2  `cat /usr/local/php/var/run/php-fpm.pid`重启了
3、user =和group = 修改用户名和用户组对应,否则fopen、上传文件等无法执行。
4、再根据启动时的出错提示去掉分号:(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,禁用TCP\IP连接,如果远程连接则必须去除此项。可提升安全性(当然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修改端口(#port 22 去掉#并修改端口号),然后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

<IfModule prefork.c>
ServerLimit     1000
StartServers         10
MinSpareServers     10
MaxSpareServers     15
MaxClients         660
MaxRequestsPerChild 680
#ServerLimit和MaxClients是连接数限制设定,默认MaxClients为150,但也不要设置太大,否则服务器承受不了……MaxRequestsPerChild太大的话,服务器内存问题限制,内存好可以设置为0或调整大值。4G的服务器可以设置为5000,然后观察内存进行调整
</IfModule>

4、日志及安全性(都在下面这段代码里,自己研究吧,Windows和linux只是书写路径的区别)
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot D:\myphp\root
ServerName www.shangbanla.net
<FilesMatch "\.(ico|gif|swf|css|js)">
#不记录ico\gif这些文件的日志
SetEnv dontlog 1
</FilesMatch>
#错误记录,主要是404什么的
ErrorLog logs/shangbanla.net-error_log
#日志分割,年月日,Linux则使用计划任务分割即可。参考http://www.flashgou.com/show/34
#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现在也支持了,看nginx部分第10条
</VirtualHost>

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: