LAMP和LNMP深度优化

  1. 云栖社区>
  2. 博客>
  3. 正文

LAMP和LNMP深度优化

技术小牛人 2017-11-10 19:58:00 浏览1119
展开阅读全文

LAMPLNMP web架构深度优化

企业连接数据库一般用域名,因为连接数据库的文件可能有多个,那么当一旦数据库ip改了,那么数据库连接的文件也都需要修改,这样极容易漏掉而出现错误,正确的做法是每个数据库连接文件里都写连接数据库的域名,然后在本地host里将数据库ip及域名做一个解析

 

数据库tar备份数据文件

必须停机才能保持备份的数据库和线上的一致,那么企业是不可能随意停机的,所以一般会用到热备工具如mysqldump等进行实时同步备份。

 

必须要总结的:

nginx.conf httpd.conf httpd-vhosts.conf httpd-mpm.conf my.cnf php.ini php-fpm.conf

 

1、隐藏nginx header

vi /application/nginx/conf/nginx.conf

http {

   server_tokens off 添加此行

 

}

 

隐藏apache header

vim /application/apache/conf/extra/httpd-default.conf

Serverfokens Prod

ServerSi gnature Off 添加这两行

 

2、更改nginx的用户组

在配置文件nginx.conf里将user nobody改为其他的。nginx默认主进程master processroot用户,可改动则需要更改nginx的端口,因为80端口默认需要root权限,此时更改下端口,再改下服务端口就行了。用root用户提供web对外服务非常危险,用户可上传很多东西把网站给覆盖掉,支付宝就是把所有服务跑在普通用户下。

 

3、修改nginx worker进程个数

一般高并发场景,但多了就有问题会卡,就会加大服务成本,默认worker_processes=1,

可按cpu核数来给,nginx.conf配置文件里改。查cpu cat /proc/cpuinfo

4、平均分配资源到不同cpu

默认情况nginx的多个进程可能更多的跑在一颗cpu上,修改方法添加worker_cpu_affinity 0001 0010 0100 1000 每个worke processes分配到独立的cpu上。top命令按1可查看cpu个数占用情况或grep physical id /proc/cpuinfo。最后可以实测一下用压力工具webbench -c 20000 -t 180 http://x.x.x.x

 

5、taskset  

设置cpu亲和力,比如让myslq跑在前三颗cpu上:taskset -c 1,2,3 /etc/init.d/mysql start

 

6、事件处理模型

在配置文件里将events字段添加为:use epoll;改为epoll模型。高并发软件如memcache都支持epoll模型。

 

7、修改worker_connections连接数

其实它意思是一个work进程数的连接数,可以改为4096即可。太大的话连接的用户过多也容易把服务器压垮。

 

8、优化服务器名字的hash表大小

server_names_hash_bucket_size 64

 

9、开启高效文件传输模式

sendfile on

tcp_nopush on

 

10、设置连接超时时间

3s以内网站的打开时用户对网站最佳的忍耐时间,大门户网站会有首屏,先打开一部分让用户看到,设置超时时间keepalive_timeout  60;

tcp_nodelay on;打开了keepalive参数后才有效。client_header_timeout 15;

php服务希望短连接,java希望长连接,因为java建立连接很消耗资源,而php很快。

client_header_timeout 15;客户端进来之后都不搞事会消耗资源。client_body_timeout 15

 

11、上传文件大小限制

client_max_body_size 10m;默认是2m

限制客户端请求多大的内容

 

12、fastcgi调优

fastcgi_connext_timeout 300

fastcgi_send_timeout 300

fastcgi_read_timeout 300

fastcgi_buffer_timeout 64k


fastcgi_ buffers 4 64k;分配464k缓冲区

 

13、隐藏或修改nginx 版本名称

在安装编译nginx之前到nginx的软件包里

vim  /home/weipeng/tools/nginx-1.6.2/src/http/ngx_http_header_filter_module.c 进行修改:

wKioL1nQPJ2zTe7nAAANF_uku0k470.png-wh_50

wKioL1nQPMPwNienAAB8KY7YTIs482.png-wh_50

nginx gzip压缩功能

速度快了,用户体验好了,但会对系统资源大量消耗,所以企业中不是对所有内容压缩,需要压缩的有程序(jscsshtml等数据文本),不要压缩的内容(二进制文件如图片、视频、flash等):

gzip on

gzip_min_length 1k

gzip_buffers 4 16k

gzip comp_lever 2;压缩两倍

gzip_types text/css test/xml  application/javascript

gzip_vary on.......告诉缓存服务器缓存压过的页面。

wKioL1nR6zuRLC-UAAGYNonyZDQ508.png-wh_50 

 

火狐浏览器--附加组件-安装YSlow--安装完后重启浏览器

还要重启nginx

wKiom1nR65KDO2O3AAFtED_pstA206.png-wh_50 

 

apache压缩功能:

模块时已经编译加入过模块--enable-deflate,配置方法如下:

wKioL1nR63jCxDF1AACIrWow-1k924.png-wh_50 

 

nginx expires缓存功能

1、集群架构图,先理解

wKioL1nR64jhYmn-AALVpgpI7ao110.png-wh_50 

 

expires功能:网站内容在客户端本地缓存多久(例如图片等固定内容),多久过期。好处是第一次访问网站以后会快,体验好,节省服务器带宽,服务器压力降低。坏处是网站如果改版,对应的用户看到的还是旧的。所以设置多久过期很重要,例如改过期时间为新,但服务器改了名1天。当资源文件更新改名,老名字在客户端过期时间内肯定不会更字的,客户端肯定就会更新了。

 

一般统计的程序和频繁更新的东西如logo就不能缓存了,例如统计网站pv的程序就不能缓存expires,因为一旦缓存了用户访问了多少次就不清楚了。

 

配置expires

nginx特别简单,在server标签里添加expires 多少天即可:

 wKioL1nR68nTmlzbAAFXWCDuwHg202.png-wh_50

 

rebots.txt:爬虫协议,网络爬虫排除标准。告诉机器人你来我的网站来爬虫按照我的文件来查,如以下51cto的做法:

 

 wKiom1nR7DihGjrAAADSY9FgDS4430.png-wh_50wKiom1nR7EzS1314AADB6opO0zU562.png-wh_50

 

rebots时协议,只是告诉别人哪些能爬,哪些不能爬,当然别人想爬还是能爬,但是一旦打官司对方必输,因为它是个行业标准,而下面一些配置防爬虫处理的东西才是真正拒绝哪些爬虫的。


配置防爬虫处理

 wKiom1nR7LXDV2a6AAFFYIaZuhM805.png-wh_50

 

如何让火狐firefox不能访问,而ie可以访问,配置和效果如下:

 wKioL1nR7I7QIlyxAACTd7uxfQg165.png-wh_50

 wKiom1nR7Qmj4YDjAAGmk-qudCk859.png-wh_50

 

 

优化nginx日志轮询,前面已经写过,为什么切割日志,因为一个日志文件长时间可能非常大了,不便于维护和查看,在工作中对于企业大文件尽量不要用vicat来操作,这样网站因为内存被吃完而挂了,日志轮询如下:

 wKiom1nR7YmDiHv4AAEFZFvHDVQ680.png-wh_50

 wKioL1nR7VTjPOHOAAECl-Jojv8600.png-wh_50

 

不记录不需要的访问日志

对于监控检查或哦某些图片的日志,一般不需要记录,因为在统计pv时时按照页面计算,而且日志写入频繁会消耗磁盘IO,降低服务性能。

nginx对相关内容关闭日志如下:

 wKioL1nR7YWDTTu_AABBVaUtAOI387.png-wh_50

apache对相关内容关闭日志如下:

 wKiom1nR7dOhhOqiAAByF8LB3LM538.png-wh_50

访问日志的权限,不应该给用户,最小化apache目录及文件权限设置

 wKioL1nR7Zawnw1UAACaFdnUnxM098.png-wh_50

注意:网站服务的用户不能用root,不然白限制了。

 wKioL1nR7fricbl2AAFwtXNMcgc673.png-wh_50 

 wKioL1nR7gXDh9cbAAGLVTU-_tU538.png-wh_50

限制来源ip访问,当然一般用iptables即可,也可以在配置文件里设置:

wKioL1nR7jug-VaWAAA5tFFmdOI206.png-wh_50

 

网页错误访问的优雅显示

wKioL1nR7lahHob4AAF6aW1peCs052.png-wh_50 

wKiom1nR7q_BfPGrAADea_g72sk525.png-wh_50 


13-优化-tmp目录使用内存文件系统及普通用户启动nginx

 wKiom1nR7uiCFunbAACKOnxW_hw596.png-wh_50


Apach 常用两种进程模式:workerprefork(默认的)

查看编译参数 cat  /application/apache/build/config.nace

--with-mpm=prefork

 

Prefork:使用欧冠的是多个子进程,而每个子进程只有一个线程,每个进程在某个确定的时间只能维持一个连接。请求没来时就创建很多进程,效率高、稳定、安全。但消耗资源更多。小网站用prefork比较好,请求不多,不怕进程占用更多资源,资源多着呢。

通过sed 30,43p /application/apache/conf/extra/httpd-mpm.conf查看以下内容:

wKiom1nZ6NyxsR6yAAPbVyCoG1k906.png-wh_50 

 

Prefork查看apache的并发连接数:ps ef |grep http|wc ,它可接纳的并发没有work的多,特别是硬件不是特别好的情况下。

Worker模式:内存占用比prework低,适合高并发、高流量http服务。但缺点是一个线程崩溃,整个进程会连同一起死掉,由于线程共享内存空间,所以一个程序在运行时必须被识别成每个线程都是安全的,服务稳定性不如prework

 

Pstree:查看workerprefork模式进程数。

 

Referrer:直接通过浏览器打开的网页就没有referer,如果通过超链接过去的就有referer

 

通过http referrer实现防盗链:

wKiom1nZ6QaTYBUpAAKVuUaJ1_8883.png-wh_50 

wKioL1nZ6MegD6pcAAHdhDC5qiw846.png-wh_50

wKiom1nZ6SHzIxRbAAL-cqkwXWQ073.png-wh_50

 

伪静态:将动态伪装为静态在url里实现,让显示网址效果更加人性化不至于?!等掺杂期中,可在nginx配置文件里添加相关匹配项做到伪静态,有的网站自带功能,界面后台操作也可实现伪静态,如下,将需要静态化的打勾即可:

 wKioL1nZ6QTDSN1ZAAN431LlUnE439.png-wh_50

转化为配置文件的如下:

 wKioL1nZ6RPTi3xYAAMiolVnd8g819.png-wh_50

具体实现原理如下:

 wKioL1nZ6R7xm6WgAAJYezIwtVw957.png-wh_50

模仿500错误方法,在nginx.conf配置文件里,添加如下内容即可实现500错误效果:php_admin_value open_basedir /var/html/blog/

 

nginx本身有缓存的功能:

 wKioL1nZ6UCgkqJTAACIFh8I6FM920.png-wh_50 

wKiom1nZ6Zvhstd5AAHmPvvq1Hc741.png-wh_50

 

apache配置文件里一般都需要关闭cgi

 

wKiom1nZ6gmSFWlpAAHYDPu0blY020.png-wh_50

php优化:

wKioL1nZ6hCRlryEAAFtUcZNPPE292.png-wh_50

wKiom1nZ6mzgKHT_AAGar8IOSFw366.png-wh_50

 wKioL1nZ6ieyEvjJAAFl5xkcrcY544.png-wh_50

wKioL1nZ6jLDRR8IAAFez2c5TwA361.png-wh_50

 

 wKiom1nZ6orx5szWAAHwLSMAyFA844.png-wh_50

 

 wKioL1nZ6kSS_TMcAACOisQAduw319.png-wh_50

 wKiom1nZ6p7yjWMFAAFlvKSy16M189.png-wh_50

以上参数对服务器资源很有帮助,但内部开发人员测试时可能需要很长时间,这时可临时放宽一点。

 wKiom1nZ6siCVoOcAAF7k1ragvs232.png-wh_50

 wKiom1nZ6tGz7rNiAAGFQbUlVJg256.png-wh_50

 

    wKioL1nZ6ovjrpcoAABVmtc0kxI962.png-wh_50

 

memcachesession共享,方式如下:

 wKiom1nZ6yeBPaU2AAG4UV8AqKg920.png-wh_50

 wKioL1nZ6ueCyD6MAAIKiiMoYJg706.png-wh_50wKiom1nZ6z6AYqoVAAM8BOauDgw175.png-wh_50

 wKioL1nZ6vfCLSvDAAByVOSpd18429.png-wh_50wKioL1nZ6v-BXJ47AACWbFOIe1s076.png-wh_50

 

 

无交互创建打开网址http验证账户用户名及密码,-b就是无交互:

wKiom1nZ61zB_F97AAA84OPilzw135.png-wh_50 

本文转自  流颗星  51CTO博客,原文链接:http://blog.51cto.com/liukexing/1969953


网友评论

登录后评论
0/500
评论
技术小牛人
+ 关注