<服务优化>Nginx优化二
目录:
expires缓存功能
优点:
- 访问一次过后,访问速度提高
- 节省带宽
- 服务器压力降低
缺点: 1. 网站改版,用户看到的还是以前的数据
解决方法:
- 过期时间变短
- 手动更新,资源文件更新的时候改名
一般不希望缓存的内容: 1. 频繁更新的内容 如广告,统计
expires配置
一般都配置在location下,location一般放在service和location下 location配置
location ~.*\. (js|css)?$
{
expires 30d;
root html/www;
}
也可以指定目录下的
location ~ ^/(js|css)/
{
expires 30d;
}
也可以单个文件进行配置
location ~(robots.txt)
{
expires 30d;
}
apache expires
expires模块添加
[root@why-2 metadata]# pwd
/root/httpd-2.2.31/modules/metadata
[root@why-2 metadata]# /usr/local/apache/bin/apxs -i -a -c mod_expires.c
/usr/local/apache-2.2.31/build/libtool --silent --mode=compile gcc -prefer-pic -DLINUX -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread -I/usr/local/apache-2.2.31/include -I/usr/local/apache-2.2.31/include -I/usr/local/apache-2.2.31/include -c -o mod_expires.lo mod_expires.c && touch mod_expires.slo
/usr/local/apache-2.2.31/build/libtool --silent --mode=link gcc -o mod_expires.la -rpath /usr/local/apache-2.2.31/modules -module -avoid-version mod_expires.lo
/usr/local/apache-2.2.31/build/instdso.sh SH_LIBTOOL='/usr/local/apache-2.2.31/build/libtool' mod_expires.la /usr/local/apache-2.2.31/modules
/usr/local/apache-2.2.31/build/libtool --mode=install cp mod_expires.la /usr/local/apache-2.2.31/modules/
cp .libs/mod_expires.so /usr/local/apache-2.2.31/modules/mod_expires.so
cp .libs/mod_expires.lai /usr/local/apache-2.2.31/modules/mod_expires.la
cp .libs/mod_expires.a /usr/local/apache-2.2.31/modules/mod_expires.a
chmod 644 /usr/local/apache-2.2.31/modules/mod_expires.a
ranlib /usr/local/apache-2.2.31/modules/mod_expires.a
PATH="$PATH:/sbin" ldconfig -n /usr/local/apache-2.2.31/modules
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/apache-2.2.31/modules
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 755 /usr/local/apache-2.2.31/modules/mod_expires.so
[activating module `expires' in /usr/local/apache-2.2.31/conf/httpd.conf]
[root@why-2 metadata]# ll /usr/local/apache/modules/mod_expires.so
-rwxr-xr-x 1 root root 37390 11月 23 22:40 /usr/local/apache/modules/mod_expires.so
配置文件
ExpiresActive on
ExpiresDefault "access plus 12 mouths"
ExpiresByType text/html "access plus 12 mouths"
ExpiresByType text/css "access plus 12 mouths"
ExpiresByType application/x-javascript "access plus 12 mouths"
image/gif
image/jpeg
jpg
png
video/x-shockware-flash
video/x-flv
配置在主配置文件中,全部生效,也可以配置在vhost文件中,单个虚拟主机生效
nginx防爬虫
server {
listen 80;
server_name 127.0.0.1;
#添加如下内容即可防止爬虫
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot")
{
return 403;
}
在http://tool.chinaz.com/robots/站点可以针对现在的搜索引擎按照想要的规则生成robots.txt文件。
robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。 当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。百度官方建议,仅当您的网站包含不希望被搜索引擎收录的内容时,才需要使用robots.txt文件。如果您希望搜索引擎收录网站上所有内容,请勿建立robots.txt文件。 Robots协议是国际互联网界通行的道德规范,基于以下原则建立:
- 搜索技术应服务于人类,同时尊重信息提供者的意愿,并维护其隐私权;
- 网站有义务保护其使用者的个人信息和隐私不被侵犯。 当然,如果搜索引擎不遵守约定的Robots协议,那么通过在网站下增加robots.txt也是不起作用的。(在正式环境中,可以适当允许搜索引擎抓取收录)
也可以根据日志配置不同浏览器进行测试
日志轮询
mv log $(date +%F -d -1day).log
nginx -s reload
不需要的日志不进行记录 健康检查,图片,日志频繁写入会消耗磁盘IO 例如配置
location ~ .*\. (js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$
{
access_log off;
}
目录权限问题
- 站点目录的用户组都应该设置为root
- 所有目录权限为755
- 文件权限为644
然后根据不同的业务然后通过不同的需要,配置不同的虚拟主机,当然这是需要开发的配合,例如图片目录可以禁止php程序解析
location ~ ^/images/.*\.(php|php5)$
{
deny all;
}
或者单独制定IP或IP段
location ~ ^/images/.*\.(php|php5)$
{
allow 121.42.37.139;
allow 121.42.37.0/24;
deny all;
}
apache需要在
挂载内存
频繁使用的目录挂载为内存
[root@why-1 ~]# mount -t tmpfs -o size=128m tmpfs /tmp
[root@why-1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 20G 5.5G 13G 31% /
tmpfs 246M 72K 246M 1% /dev/shm
/dev/sda1 194M 34M 151M 19% /boot
tmpfs 128M 0 128M 0% /tmp
然后写到/etc/rc.local或/etc/fstab中
Proxy优化
proxy.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 50m;
client_body_buffer_size 256k;
proxy_connect_timeout 30;
proxy_send_timeout 30;
proxy_read_timeout 60;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /tmp/proxy_temp;
proxy_cache_path /tmp/proxy_cache levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=10g;
最后的缓存目录需要自己配置挂载内存的目录
一般proxy配置在location下proxy_cache cache_one
,不过因为配置文件过长,可能会通过include proxy.conf进行配置。
使用普通用户启动nginx
通过参数 -c filename制定配置文件来启动nginx,不过不能使用80端口
[root@why-1 ~]# /usr/local/nginx/sbin/nginx
[root@why-1 ~]# ps -ef | grep nginx
root 2385 1 0 09:00 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 2386 2385 0 09:00 ? 00:00:00 nginx: worker process
root 2419 1812 0 09:12 pts/0 00:00:00 grep nginx
[root@why-1 ~]# useradd why
[root@why-1 ~]# mkdir /home/why/nginx
[root@why-1 ~]# cp -ap /usr/local/nginx/conf/ /home/why/nginx
[root@why-1 ~]# cd /home/why
[root@why-1 why]# vi nginx/conf/nginx.conf
error_log /home/why/nginx/logs/error.log;
worker_processes 1;
pid /home/why/nginx/logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server_tokens off;
server {
listen 8000;
server_name test.why.com;
index index.html;
access_log /home/why/nginx/logs/access.log;
root /home/why/nginx/html;
}
}
# 都写绝对路径
[root@why-1 why]# mkdir nginx/html
[root@why-1 why]# mkdir nginx/logs
[root@why-1 why]# touch nginx/logs/error.log
[root@why-1 why]# touch nginx/logs/access.log
[root@why-1 why]# chown why.why -R nginx
[root@why-1 why]# echo 'why' >> nginx/html/index.html
[root@why-1 why]# su why
[why@why-1 ~]$ /usr/local/nginx/sbin/nginx -c /home/why/nginx/conf/nginx.conf
如果出现写入log的权限问题,可以把logs目录让why组管理,chown -R .why logs 检验
[root@why-1 ~]# netstat -npltu|grep 8000
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 2578/nginx
[root@why-1 ~]# ps -ef | grep nginx
root 2385 1 0 09:00 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 2386 2385 0 09:00 ? 00:00:00 nginx: worker process
why 2593 1 0 09:53 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /home/why/nginx/conf/nginx.conf
why 2594 2593 0 09:53 ? 00:00:00 nginx: worker process
root 2605 2427 0 09:58 pts/1 00:00:00 grep nginx
关闭可以通过以下命令
[why@why-1 ~]$ /usr/local/nginx/sbin/nginx -c /home/why/nginx/conf/nginx.conf -s stop
这样做可以给开发一个直接操作站点却不会对集群服务产生影响的权限,不过这样做没有办法使用80端口,需要sudo来执行,或者进行NAT端口转换。
防盗链
防止其他网站通过非法的调用其他网站的资源进行调用。一般网站流量突然增大,可以进行对日志的统计,访问量大的进行加墙。当然要考虑到推广和合作情况。
通过http的referer实现防盗链
apache
RewriteEngine On #Rewrite功能开启
RewriteCond %{HTTP_PEFERER} !^http://demo.why.cn/.*$ [NC] #判断时候为信任站点,!表示非,如果不是这些域名的话,对下边扩展名的访问,会跳转到
RewriteCond %{HTTP_PEFERER} !^http://demo.why.cn$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://demo.why.cn/img/b.jpg [R,NC]
<VirtualHost *:80>
ServerAdmin 93216193@qq.com
DocumentRoot "/var/html/www"
ServerName www.why.cn
ServerAlias why.com
ErrorLog "logs/www.why.com-error_log"
CustomLog "|/usr/local/sbin/cronolog /var/log/www.why.cn/www.why.cn_%Y%m%d.log" combined
</VirtualHost>
<VirtualHost *:80>
ServerAdmin 93216193@qq.com
DocumentRoot "/var/html/demo"
ServerName demo.why.cn
ErrorLog "logs/demo.why.com-error_log"
CustomLog "logs/demo.why.com-access_log" common
RewriteEngine On
RewriteCond %{HTTP_PEFERER} !^http://demo.why.cn/.*$ [NC]
RewriteCond %{HTTP_PEFERER} !^http://demo.why.cn$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://demo.why.cn/img/b.jpg [R,NC]
</VirtualHost>
图片a.jpg
图片b.jpg
创建测试页面
[root@why-2 www]# vi test.html
[root@why-2 www]# cat !$
cat test.html
<img src="http://demo.why.cn/img/a.jpg">
[root@why-2 html]# ll www/img/
总用量 12
-rw-r--r-- 1 root root 11789 12月 16 2016 b.jpg
[root@why-2 html]# ll demo/img/
总用量 44
-rw-r--r-- 1 root root 44229 12月 11 2016 a.jpg
这样我们盗链的是demo站点的a.jpg,然而现实的是我们制定的图片 把test.html复制到demo目录下,用过demo.why.cn访问
nginx配置
location ~ .*\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$
{
valid_referers none blocked *.why.com;
if ($invalid_referer) {
rewrite ^/ http://www.why.com/img/b.jpg;
}
}
当然这一切都需要根据业务的需求进行配置
加密变换访问路径实现防盗链
通过nginx http accesskey module模块实现
伪静态
伪静态的可以隐藏一些路径,传参的业务逻辑,一般需要和开发一起实现。
伪静态也是通过rewrite来实现的。
apache伪静态配置例子
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page\%3D$4&page=$3&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3&%1
</IfModule>
配置详解
以其中一条配置为例,大同小异
RewriteRule ^(.*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3&%1
一个括号代表一个参数,分别传递到后边的$1,$2等
静态页面http://bbs.why.com/forum-2-1.html
根据上边的规则可以解析为
(.*)对应着$1,值为http://bbs.why.com,匹配域名
(\w+)对应着$2,值为2
([0-9]+)对应着$3,值为1
对应的动态页面替换后就应该为
http://bbs.why.com/forum.php?mod=forumdisplay&fid=2&page=1&%1
nginx伪静态配置例子
rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last;
rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3 last;
if (!-e $request_filename) {
return 404;
}
与apache类似,不过使用的是pcre和perl兼容的 正则表达式。
返回页优化
error_page 403 /403.html;
apahe服务的根目录,配置在server标签
apache禁止用户重载
- AllowOverride None
加快服务的响应速度,因为允许重载会在每个目录下访问控制文件(.htaccess),另外也杜绝了开发人员修改配置的隐患。
关闭没用模块
例如apache的cgi
CDN加速
一般把用户的请求尽可能的往前推送,CDN就是一个很好的选择,现在相对较大的厂商有网宿蓝讯
安全模块
mod_security防跨站脚本,SQL mod_evasice20防DDOS mod_limitipconn针对单点配置 mod_security2防止SQL注入