-
LANMP优化,主要针对LNMP的优化
-
root@LAMP ~]# cat /etc/redhat-release
-
CentOS release 6.5 (Final)
-
查看nginx的编译参数
-
/application/nginx/sbin/nginx -V
-
查看apache的编译参数
-
cat /application/apache/build/config.nice
-
-
查看mysql的编译参数
-
grep CONFIGURE_LINE /application/mysql/bin/mysqlbug
-
查看PHP的编译参数
-
/application/php/bin/php -i|grep configure
-
-
-
先调整字符集
-
echo 'export LC_ALL=C'>> /etc/profile
-
source /etc/profile
-
安装perl相关软件
-
yum -y install perl-devel
-
-
eaccelerator插件安装过程
-
tar jxf eaccelerator-0.9.6.tar.bz2
-
cd eaccelerator-0.9.6
-
/application/php/bin/phpize
-
./configure --enable-eaccelerator=shared --with-php-config=/application/php/bin/php-config
-
make
-
make install
-
ls /application/php5.3.27/lib/php/extensions/no-debug-zts-20090626/
-
LNMP查看
-
ls -l /application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
可能遇到的错误
Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment vari
yum -y install autoconf
-
-
memcache客户端安装过程
-
tar xf memcache-2.2.5.tgz
-
cd memcache-2.2.5
-
/application/php/bin/phpize
-
./configure --with-php-config=/application/php/bin/php-config
-
make
-
make install
-
ls /application/php5.3.27/lib/php/extensions/no-debug-zts-20090626/
-
LNMP查看
-
ls -l /application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
-
-
-
PDO安装
-
tar xf PDO_MYSQL-1.0.2.tgz
-
cd PDO_MYSQL-1.0.2
-
/application/php/bin/phpize
-
./configure --with-php-config=/application/php/bin/php-config --with-pdo-mysql=/application/mysql
-
make
-
make install
-
ls /application/php5.3.27/lib/php/extensions/no-debug-zts-20090626/
-
LNMP查看
-
ls -l /application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
-
-
-
php引擎图像处理软件ImageMagick安装
-
tar zxf ImageMagick.tar.gz
-
cd ImageMagick-6.5.1-2/
-
./configure
-
make
-
make install
-
-
tar zxf imagick-2.3.0.tgz
-
cd imagick-2.3.0
-
/application/php/bin/phpize
-
./configure --with-php-config=/application/php/bin/php-config
-
#configure 的参数路径要正确配置。
-
make
-
make install
-
ls /application/php5.3.27/lib/php/extensions/no-debug-zts-20090626
-
-
LNMP
-
cd /application/php/lib/
-
vim php.ini
-
-
搜索/extension_dir
-
extension_dir = "/application/php5.3.27/lib/php/extensions/no-debug-zts-20090626"
-
在结尾添加
-
extension = imagick.so
-
extension = memcache.so
-
extension = pdo_mysql.so
-
-
然后再bbs目录中创建个test1.php的测试文件
-
[root@TCS bbs]# cat test1.php
-
<?php
-
phpinfo();
-
?>
-
-
-
LAMP
-
extension_dir = "/application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/"
-
在结尾添加
-
extension = imagick.so
-
extension = memcache.so
-
extension = pdo_mysql.so
-
-
然后再/var/html/blog目录中创建测试文件
-
[root@oldboy blog]# cat index.php
-
<?php
-
phpinfo();
-
?>
-
-
分别在电脑上查看已经编译好LAMP或者LNMP环境参数
-
-
-
1.1 Apache隐藏版本号
-
[root@LAMP ~]# egrep "Server|ServerS" /application/apache/conf/extra/httpd-default.conf
-
# This configuration file reflects default settings for Apache HTTP Server.
-
# ServerName directive.
-
# ServerTokens
-
# This directive configures what you return as the Server HTTP response
-
ServerTokens Full
-
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
-
ServerSignature On
-
[root@LAMP ~]#
-
分别改为如下:
-
ServerTokens Prod
-
ServerSignature Off
-
-
1.2 nginx隐藏版本号
-
在 /application/nginx/conf/nginx.conf中的http标签内添加如下
-
server_tokens off;
-
-
-
-
2.1 nginx更改默认的用户以及用户组,在编译安装的时候就已经指定了用户跟用户组
-
./configure --user=nginx --group=nginx --prefix=/application/nginx1.6.2 \
-
--with-http_stub_status_module --with-http_ssl_module
-
如果在编译时候不指定默认为noboby;
-
[root@TCS conf]# grep "#user" nginx.conf.default
-
#user nobody;
-
-
2.2 Apache默认用直接修改配置文件内容:
-
[root@LAMP ~]# egrep "User|Group" /application/apache/conf/httpd.conf
-
# User/Group: The name (or #number) of the user/group to run httpd as.
-
User www
-
Group www
-
-
根据硬件调整nginx子进程,(比如cpu核数,输入top,按1查看cpu个数,一般设置cpu核数相当,或者x2)
-
worker_processes 2;
-
-
指定事件模块,epoll是linux下高效的工作模式
-
在nginx.conf中第4行指定,events标签下
-
use epoll;
-
-
隐藏nginx服务软件名信息,在软件编译时的源码包中
-
[root@TCS tools]# cd nginx-1.6.2
-
[root@TCS nginx-1.6.2]# vim src/http/ngx_http_header_filter_module.c
-
49行 static char ngx_http_server_string[] = "Server: nginx" CRLF;
-
50行 static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
-
修改为
-
static char ngx_http_server_string[] = "Server: BWS" CRLF;
-
static char ngx_http_server_full_string[] = "Server: BWS" CRLF;
-
-
隐藏错误信息避免爆出关键字nginx及其版本号
-
[root@TCS nginx-1.6.2]# vim src/http/ngx_http_special_response.c
-
大概29行将nginx替换为BWS
-
-
-
2.3 性能优化-配置nginx gzip压缩功能
-
nginx gzip 压缩模块提供了对文件内容压缩的功能,允许nginx服务器将输出内容在发送之到客户端之前根据具体的策略进行压缩,以节约网站带宽,同时提升用户体验。
-
此功能同Apache的mod_deflate压缩功能,依赖ngx_http_gzip_module模块,默认已安装,我们已经详细介绍过压缩功能。
-
常见要压缩的的内容,如所有程序文件(js,css,html);而图片、视频、flash文件等文件不进行压缩。
-
-
对应的压缩参数说明如下:
-
<==开启gzip压缩功能。
-
gzip_min_length 1k;
-
<==设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K,如果小于1K可能会越压缩越大。(即:大于1k才压缩,小于1k不压缩)
-
-
gzip_buffers 4 16k;
-
<==压缩缓冲区大小。表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是与原始数据大小相同的内存空间来存储gzip压缩结果。
-
-
gzip_http_version 1.0;
-
<==压缩版本(默认1.1,前端squid2.5时使用1.0)用户设置识别http协议版本,默认是1.1,默认大部分浏览器已经支持GZIP
-
解压,使用默认即可
-
-
gzip_comp_level 2;
-
<==压缩比率。用来指定GZIP压缩比,1压缩比最小,处理速度最快;9压缩比例最大,传输速度最快,但处理最慢,也比较消耗cpu资源。
-
-
gzip_types text/plain application/x-javascript text/css application/xml;
-
-
<==用来指定压缩类型,“text/hmtl”类型总是会被压缩。
-
-
gzip_vary on;
-
<==veray header 支持。该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如使用squid缓存经过nginx压缩的数据。
-
-
[root@TCS /]# cd /application/nginx/conf/
-
[root@TCS conf]# vim nginx.conf
-
在http标签添加如下
-
gzip on;
-
gzip_min_length 1k;
-
gzip_buffers 4 32k;
-
gzip_comp_level 9;
-
gzip_types text/css text/xml application/javascript;
-
gzip_vary on;
-
-
不同版本压缩的类型也不同,压缩的类型的配置文件在源码安装包的 mime.types 文件中
-
/home/oldboy/tools/nginx-1.6.2/conf
-
重启服务:../sbin/nginx reload;打开火狐浏览器,再设置里添加组件yslow,此附加组件需要以下附加组件才能正常工作Firebug;
-
打开网站,按F12,显示yslow组件的相关信息,Components里显示压缩的类型跟压缩比例;
-
-
-
-
性能优化-apache压缩功能
-
在http的主配置或者虚拟主机文件中添加
-
-
DeflateCompressionLevel 9
-
SetOutputFilter DEFLATE
-
AddOutputFilterByType DEFLATE text/html text/plain text/xml
-
AddOutputFilterByType DEFLATE application/javascript
-
AddOutputFilterByType DEFLATE text/css
-
</ifmodule>
-
-
-
2.4、nginx expire缓存功能
-
在网站开发和运营中,对于图片,CSS,JS等元素更改机会较少,特别是图片,这时可以将图片设置在浏览器本地缓存365天或者更长;
-
CSS,JS,hmtl等代码缓存10天,这样用户第一次打开页面后,会在本地的浏览器缓存相应的上述内容,这样缓存可以提高下次用户打开类似页面的加速度,并节省服务器端大量的带宽。
-
此功能同Apache的expire,这里通过location的功能,将需要缓存的扩展名列出来,然后指定缓存时间
-
expire功能优点可以降低网站带宽,同时提升用户访问体验,减轻服务的压力;
-
expire缺点是被缓存的页面或者数据更新,用户看到的可能还是旧的内容,反而影响用户体验;
-
解决办法:
-
1.对于经常需要变动的图片或者文件,可以缩短对象缓存时间,可以将这些图片设置为缓存期一天;
-
2.第二个网站改版或者更新时,可以在服务器将缓存的对象改名(网站代码程序等)
-
a.对于网站的图片,附件,一般不会被用户修改,用户层面的修改图片实际是重新上传到服务器,虽然内容一样但是已经是新的图片名;
-
b.网站改版升级会修改JS,CSS元素;若改版时对这些元素改了名,会使得前端的CDN及用户端需要重新缓存内容;
-
企业网站缓存日期案例:
-
1、51cto 1周
-
2、sina 15天
-
3、京东 25年
-
4、淘宝 10年
-
-
一般不希望被缓存的内容:
-
1)广告图片
-
2)网站流量统计工具
-
3)更新频繁的文件(google的logo)
-
-
根据目录进行判断,添加 expires 功能范例
-
在bbs虚拟主机的server标签中
-
{[root@TCS extra]# vim bbs.conf 中添加如下
-
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
-
{
-
expires 3650d;
-
}
-
location ~ .*\.(js|css)?$
-
{
-
expires 30d;
-
}
-
-
根据目录进行配置示例;还可以单个文件进行控制:
-
location ~^/(images|javascript|js|css|flash|media|static)/ {
-
expire 360d;
-
}
-
location ~(robots.txt){
-
expires 7d;
-
break;
-
}
-
-
robots.txt 1.设置可以禁止各种搜索引擎访问的资源;缺点:暴露网站目录结构;
-
#Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取
-
-
-性能优化-apache expire功能实战
-
-
[root@oldboy extra]# vim httpd-vhosts.conf
-
在虚拟主机相对应的标签中添加,比如blog虚拟主机的VirtualHost标签中
-
ExpiresActive on
-
ExpiresDefault "access plus 12 month"
-
ExpiresByType text/html "access plus 12 months"
-
ExpiresByType text/css "access plus 12 months"
-
ExpiresByType image/gif "access plus 12 months"
-
ExpiresByType image/jpeg "access plus 12 months"
-
ExpiresByType image/jpg "access plus 12 months"
-
ExpiresByType image/png "access plus 12 months"
-
EXpiresByType application/x-shockwave-flash "access plus 12 months"
-
EXpiresByType application/x-javascript "access plus 12 months"
-
ExpiresByType video/x-flv "access plus 12 months
-
-
-
2.5 事件处理模型优化
-
nginx的连接处理机制在于不同的操作系统采用不同的IO模型,在linux使用epoll的IO多路复用模型,
-
在FreeBSD使用kqueue的IO多路复用模型,在Solaris使用/dev/poll方式的IO多路复用模型,在Windows中使用的是icop等等。
-
根据系统类型不同选择不同use[kqueue|rtsig|epoll|/dev/poll|select|poll];该参数结合系统使用,
-
不同系统使用参数不同,我们使用的是Centos6.5,因此我们调整为epoll模型
-
events {
-
worker_connections 1024;
-
use epoll; #指定epoll模型
-
}
-
-
2.6 调整nginx单个进程允许客户端最大连接数;
-
worker_connections 20480;
-
worker_connections也是个模块指令,用于定义Nginx每个进程的最大连接数,默认是1024,
-
客户端最大连接数由worker_processes和worker_connections决定,即Max_client=worker_processes * worker_connections,
-
进程的最大连接数受linux系统进程的最大打开文件数限制,在执行操作系统命令“umilited -HSn 65535”或者配置相应的文件后
-
worker_connections的设置才生效
-
-
2.7 配置每个进程最大文件打开数
-
worker_rlimit_nofile 65536;
-
该参数的意思为每个进程打开的最大文件数,可以设置为系统优化受的ulimit -HSn的结果,在第一章系统安装时调
-
整文件描述符和这个处理的一个问题。
-
2.6跟2.7 配置参数不是越大越好,最好设为服务器承受的极限点;
-
-
2.8 开启高效的文件传输模式
-
可防止网络及磁盘I/O阻塞,提升Nginx工作效率;
-
在http标签字段下
-
sendfile on;
-
tcp_nopush on; <====sendfile参数用户开启文件高效传输模式。只有在sendfile on模式才有效;
-
-
2.9 优化Nginx连接参数,调整连接超时时间
-
php服务,建议希望短连接;java建议长连接,主要是保护服务器的硬件资源,cpu mem,连接数;
-
在nginx主配置文件的http标签下
-
-
keepalive_timeout 60;
-
<==设置客户端保持会话的超时时间,超过这个时间,服务器会关闭连接。
-
tcp_nodelay on;
-
<==打开tcp_nodelay,包含了keepalive参数才有效
-
-
client_header_timeout 15;
-
<==设置客户端请求读取超时时间,如果超过这个时间,客户端还没发送任何数据,Nginx将返回“Rquest timeout (408)”错误.
-
-
client_body_timeout 15;
-
<==设置客户端请求主体读取超时时间,如果超过这个时间,客户端还没发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60.
-
-
send_timeout 15;
-
<==指定响应客户端的超时时间,这个超时时间仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
-
-
-
3.0 上传文件大小限制(动态应用)
-
主配置nginx的http标签下加入如下参数,具体大小根据你自己的业务做调整。
-
即http协议原理中请求报文的请求主体,此功能在PHP参数中还有设置
-
client_max_body_size 10m;
-
-
3.1 fastcgi调优(配合PHP引擎动态服务)
-
fastcgi是nginx和php调度的一个接口或者工具;
-
cache 写入缓冲区 ;buffer 读取缓冲区;
-
fastcgi_connect_timeout 300;
-
<==指定连接到后端FastCGI的超时时间
-
-
fastcgi_send_timeout 300;
-
<==向Fastcgi传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。
-
-
fastcgi_read_timeout 300;
-
<==指定接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间
-
-
fastcgi_buffer_size 64k;
-
<==指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64k的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers 选项指定的缓冲区大小。
-
fastcgi_buffers 4 64k;
-
-
<==指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求,如果一个PHP脚本产生的页面大小为256K,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到Fastcgi_temp指定的路径中,但是这并不是好方法;因为内存中的数据处理速度要快于硬盘,一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本产生的页面大小为256KB,那么可以把这个值设置为“16 16K”、“4 64K”等。
-
-
fastcgi_busy_buffers_size 128k;
-
<==建议为fastcgi_buffers 的两倍
-
-
fastcgi_temp_file_write_size 128k;
-
<==在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,设置上述数值设置太小时若负载上来时能报 502 Bad Gateway
-
-
fastcgi_cache ucode_nginx;
-
<==表示开启FastCGI缓存并为其指定一个名称,开启缓存非常有用,可以有效降低CPU的负载,并且防止502错误的发生,但是开启缓存也可能会引起其他问题,要根据具体情况选择。
-
-
-
fastcgi_cache_valid 200 302 1h;
-
<==用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一个小时。
-
-
fastcgi_cache_valid 301 1d;
-
<==将301应答缓存1天
-
-
fastcgi_cache_valid any 1m;
-
<==将其他应答缓存为1分钟
-
-
fastcgi_cache_min_uses 1;
-
<==缓存在fastcgi_cache_path指令inactive参数时间内的最少使用次数
-
fastcgi_cache_path
-
<==定义缓存的路径
-
-
实例:修改nginx.conf配置文件
-
在http标签中添加如下:
-
fastcgi_connect_timeout 300;
-
fastcgi_send_timeout 300;
-
fastcgi_read_timeout 300;
-
fastcgi_buffer_size 64k;
-
fastcgi_buffers 4 64k;
-
fastcgi_busy_buffers_size 128k;
-
fastcgi_temp_file_write_size 128k;
-
#fastcgi_temp_path /data/ngx_fcgi_tmp;
-
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
-
#fastcgi_temp_path:生成fastcgi_cache临时文件目录,fastcgi_cache_path:fastcgi_cache缓存目录,
-
可以设置目录哈希层级,比如2:2会生成256*256个字目录,keys_zone是这个缓存空间的名字,cache是用多少内存
-
(这样热门的内容nginx直接放内存,提高访问速度),inactive表示默认失效时间,max_size表示最多用多少硬盘空间;
-
-
location ~ .*\.(php|php5)?$
-
{
-
fastcgi_pass 127.0.0.1:9000;
-
fastcgi_index index.php;
-
include fastcgi.conf;
-
fastcgi_cache_valid 200 302 1h;
-
fastcgi_cache_valid 301 1d;
-
fastcgi_cache_valid any 1m;
-
fastcgi_cache_min_uses 1;
-
fastcgi_cache_use_stale error timeout invalid_header http_500;
-
fastcgi_cache_key
-
}
-
#fastcgi_cache_key:定义fastcgi_cache的key,示例中就以请求的URI作为缓存的key,Nginx会取这个key的md5作为缓存文件,
-
如果设置了缓存哈希目录,Nginx会从后往前取相应的位数做为目录。
-
-
nginx fastcgi_pass与proxy_pass优化参数的不同说明.
-
nginx做web服务器之外还有反向代理的功能,nginx连动态业务是连接fastcgi,nginx做反向代理的时候也得向后抛,叫做proxy_pass
-
proxy_pass作反向代理的时候前面是一个upstream模块;
-
-
-
-
3.2 Nginx防蜘蛛爬虫处理
-
方法一:修改nginx.conf,禁止网络爬虫的ua,返回403。
-
-
#添加如下内容即可防止爬虫
-
-
http://blog.csdn.net/xifeijian/article/details/38615695
-
-
3.3 nginx日志相关优化与安全
-
nginx没有类似Apache的cronolog日志分割处理的功能,但是,可以通过nginxNginx的信号控制功能或者reload重载,然后利用脚本来实现日志的自动切割。
-
cat cut_nginx_log.sh
-
cd /application/nginx/logs && \
-
/bin/mv www_access.log www_access_$(date +%F -d -1day).log
-
/application/nginx/sbin/nginx -s reload
-
通过mv把当前的log改成带时间的log,如果每个虚拟站点目录都有log,相应加上,然后重新加载
-
让此脚本在每天凌晨0点执行,就可以实现日志的每天分割功能了,操作结果如下:
-
00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh >/dev/null 2>&1
-
-
3.4-nginx不记录不需要的访问日志;
-
对于负载均衡器健康节点检查的某些(图片,js,css)的日志,一般不需要记录,因为在统计PV时是按照页面计算,而且日志写入频繁会消耗IO,降低服务性能。具体语法如下:
-
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
-
access_log off;
-
}
-
-
appache
-
配置方法:
-
">
-
SetEnv IMAG 1
-
-
-
3.5 -nginx日志目录权限控制
-
nginx、Apache主进程都是用root用户启动,所以不给权限也可以写入,即700程序可以往里面写入数据
-
假如日志目录为、app/logs,则授权方法
-
chown -R root.root /app/logs
-
chmod -R 700 /app/logs
-
-
3.6 根据扩展名限制程序和文件的访问题(同样适用于nginx)
-
为了保证Apache的网站不遭受木马入侵上传及修改文件。
-
安全的权限:
-
1、站点内所有目录的用户和组都应该为root,
-
2、站点内所有目录默认权限是755;(1+2不能往目录放文件)
-
3、所有文件默认权限为644;(不能改文件)
-
注意:网站服务的用户不能用root,网站用户nginx,这样通过80端口进来充其量也就是nginx权限;
-
以上权限的设置可以做到防止黑客上传木马,以及修改站点文件,但是,合理的用户上传内容也被拒之门外了,那么如何解决可以让合法的用户上传文件又不至于被黑客利用攻击呢?
-
比较安全的方法是找到上传的目录,授权nginx可以访问,
-
另一种是在比较好的网站业务架构中,应该把资源文件,包括用户上传的图片,附件等的服务和程序
-
-
3.7 nginx站点目录及文件URL访问控制
-
nginx下禁止访问资源目录下的php程序文件,配置方法如下:
-
范例1:nginx配置限制指定目录下的php程序被解析
-
location ~ ^/images/.*\.(php|php5)$
-
{
-
|deny all;
-
-
}
-
-
location ~ ^/static/.*\.(php|php5)$
-
-
{
-
-
deny all;
-
}
-
-
location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$
-
{
-
deny all;
-
}
-
-
这些目录的限制必须写在nginx处理PHP服务配置的前面:
-
location ~ .*\.(php|php5)?$
-
{
-
fastcgi_pass 127.0.0.1:9000
-
fastcgi_index index.php
-
include fcgi.conf
-
}
-
-
范例2:nginx下配置禁止访问*.txt文件
-
location ~* \.(txt|doc)${
-
if (-f $request_filename){
-
root /data/www/www;
-
#rewrite ...可以重定向到某个URL
-
break
-
}
-
}
-
-
location ~*\.(txt|doc){
-
-
root /data/www/www;
-
deny all;
-
-
}
-
-
3.8 限制网站来源IP访问
-
使用ngx_http_acces_module限制网站ip来源访问
-
案例环境:phpmyadmin数据库的web客户端,内部开发人员用的。
-
范例1:禁止某目录让外界访问,但允许某IP访问该目录,且支持PHP解析
-
location ~ ^ /oldboy/{
-
allow 202.111.12.121;
-
deny all;
-
}
-
-
location ~ .*\.(php|php5)?${
-
-
}
-
-
范例2限制及指定IP或者ip段访问
-
location / {
-
deny 192.168.1.1;
-
allow 192.168.1.0/24;
-
allow 10.1.1.0/16;
-
deny all;
-
-
参考:
-
企业问题案例:Nginx做反向代理的时候可以限制客户端IP吗?
-
可以:使用if来控制或者利用deny和allow只允许IP访问,命令如下:
-
location / {
-
root html/bbs;
-
index index.php index.html index.htm;
-
allow 10.0.0.10;
-
deny all;
-
}
-
-
3.9 Nginx错误页面优雅显示的配置
-
当我们访问网站时,由于特殊的原因,经常会出现诸如403,404,503等错误,这极大的影响用户的访问体验,所以我们很有必要做一下错误页面的优雅显示,以提升用户的浏览体验。
-
404错误本地优雅显示
-
更改nginx.conf配置文件,在server模块中加入
-
error_page 404 /404.html;
-
403错误本地优雅显示
-
error_page 403 /403.html;
-
这个文件不是系统的根,是站点目录的根;
-
默认nginx为50x.html
-
[root@LNMP html]# ls
-
50x.html bbs blog index.html www
-
-
错误状态码URL重定向,命令如下
-
error_page 404
-
#当出现404错误时,会跳转得到指定的URL
-
-
4.0 tmp目录使用内存文件系统tmpfs
-
主要是提高效率,配置eaccelerator缓存目录
-
mkdir -p /tmp/eaccelerator #此目录可以用tmpfs内存文件系统,
-
chowm -R /tmp/eaccelerator
-
示例挂载
-
[root@TCS extra]# mkdir /opt/tmp/
-
[root@TCS extra]# mv /tmp/* /opt/tmp/
-
[root@TCS extra]# mount -t tmpfs -o size=16m tmpfs /tmp
-
[root@TCS extra]# df -h
-
Filesystem Size Used Avail Use% Mounted on
-
/dev/mapper/vg_tcs-lv_root 18G 2.9G 14G 18% /
-
tmpfs 242M 0 242M 0% /dev/shm
-
/dev/sda1 485M 33M 427M 8% /boot
-
tmpfs 16M 0 16M 0% /tmp
-
[root@TCS extra]# vi /etc/rc.local 添加开机自启;
-
-
4.1 配置Nginx图片及目录防盗链
-
盗链是指一个网站的资源(图片或附件)未经允许在其它网站提供浏览和下载。
-
尤其热门资源的盗链,对网站带宽的消耗非常大
-
根据http referer实现防盗链
-
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理
-
利用 referer,并且针对扩展名rewrite重定向
-
location ~* \.(gif|jpg|png|swf|flv)$ {
-
valid_referers none blocked *.bbs.com bbs.com;
-
if ($invalid_referer) {
-
rewrite ^/ [](http:///)
-
#return 404;
-
}
-
}
-
-
location ~* \.(gif|jpg|png|swf|flv)$ {
-
valid_referers none blocked *.bbs.com server_names ~\.google\. ~\.baidu\.;
-
if ($invalid_referer) {
-
return 403;
-
#rewrite ^/
-
}
-
}
-
none
“Referer” 来源头部为空的情况
blocked
“Referer”来源头部不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头.
server_names
“Referer”来源头部包含当前的server_names(当前域名)
-
以上所有来至bbs.com和域名中包含google和baidu的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等
-
于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面,如果使用下面的rewrite,那么盗链的图片都会显示403.jpg。如果用户直接在浏览器输入你的图片地址,那么图片显示正常,因为它符合none这个规则;
-
除了使用location对文件访问进行限制,也可以对特定目录进行限制,下面的配置会禁止访问images目录下所有文件
location /images/ {
valid_referers none blocked bbs.com *.bbs.com;
if ($invalid_referer) {
return 403;
}
-
4.2 Nginx安全之监牢模式
-
所谓的“监牢”是指让nginx服务运行限制在指定目录中,保证该软件只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。这样即使被破坏或侵入,所受的损失也不大。
-
为什么要使用nginx监牢模式
-
默认情况下,nginx的master进程使用的是root用户,worker进程使用的是nginx指定的普通用户,使用root用户跑nginx的master进程有两个最大的问题:
-
1、 管理权限必须是root,这就使得最小化分配权限原则遇到难题。
-
2、 使用root跑nginx服务,一旦网站出现漏洞,用户就可以很容易地获得服务器的root权限。
-
3、 可以实现,不用给开发人员root权限,只是普通运维人员管理员权限就可以很好的管理nginx服务。
-
解决方案如下:
-
-
1、 给nginx服务降权,用inca用户跑nginx服务,给开发及运维设置普通账号,只要和inca同组即可管理nginx,该方案解决了nginx管理问题,防止root分配权限过大。
-
-
2、 开发人员使用普通账号即可管理nginx服务以及站点下的程序,看日志。
-
-
3、 采取项目负责制制度,即谁负责项目维护出问题就是谁负责,这么一来,开发就不会和运维来争root权限了。
-
-
4、 这样就很好的解决2个问题:nginx多实例,不会使用root跑服务。
-
[root@LNMP ~]# /application/nginx/sbin/nginx -h
-
nginx version: nginx/1.6.2
-
Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]
-
-
Options:
-
-?,-h : this help
-
-v : show version and exit
-
-V : show version and configure options then exit
-
-t : test configuration and exit
-
-q : suppress non-error messages during configuration testing
-
-s signal : send signal to a master process: stop, quit, reopen, reload
-
-p prefix : set prefix path (default: /application/nginx1.6.2/)
-
-c filename : set configuration file (default: conf/nginx.conf)
-
-g directives : set global directives out of configuration file
-
-
4. 默认情况下nginx用户是有master和worker组成的,如果nginx被攻克了,它就可以控制master进程以root权限往它想要写的目录写东西。那么我们就要做这么一个监牢模式。
-
5. 利用linux的用户权限把站点放在home目录下,控制这个站点的nginx使用inca这个模式,这样黑客连上我的服务器有可能拿到inca权限,但是呢拿到这个权限只能管理这个home目录,跳不出我的linux的权限体系,最多也就是一个普通用户连上我的服务器,对我的linux没有破坏作用。整个用户家目录有配置文件有log,让用户可以管理这些东西。
-
6. 缺点:不能够使用80端口,需要使用1024以上的端口
-
7. 具体实现:
-
[root@LNMP~]# useradd inca
-
[root@LNMP~]# su - inca
-
[inca@LNMP~]$ mkdir logs conf www
-
[inca@LNMP~]$ cd conf/
-
[inca@LNMPconf]$ pwd
-
/home/inca/conf
-
[inca@LNMPconf]$ vim nginx.conf
-
worker_processes 4;
-
worker_cpu_affinity 0001 0010 0100 1000;
-
worker_rlimit_nofile 65535;
-
error_log /home/inca/logs/error.log;
-
user inca inca;
-
pid /home/inca/logs/nginx.pid;
-
events {
-
use epoll;
-
worker_connections 10240;
-
}
-
http {
-
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
-
'$status $body_bytes_sent "$http_referer" '
-
'"$http_user_agent" "$http_x_forwarded_for"';
-
server {
-
listen 8080;
-
server_name
-
root /home/inca/www;
-
access_log /home/inca/logs/web_blog_access.log main;
-
location / {
-
index index.php index.html index.htm;
-
}
-
}
-
}
-
[inca@LNMPconf]$ cp /usr/local/nginx/conf/mime.types .
-
[inca@LNMPconf]$ echo "8080" >/home/inca/www/index.html
[inca@LNMPconf]$ /usr/local/nginx/sbin/nginx -c /home/inca/conf/nginx.conf #启动服务
[inca@LNMP~]$ lsof -i:8080 #查看服务
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 10732 inca 5u IPv4 1593874 0t0 TCP *:webcache (LISTEN)
nginx 10733 inca 5u IPv4 1593874 0t0 TCP *:webcache (LISTEN)
nginx 10734 inca 5u IPv4 1593874 0t0 TCP *:webcache (LISTEN)
nginx 10735 inca 5u IPv4 1593874 0t0 TCP *:webcache (LISTEN)
nginx 10736 inca 5u IPv4 1593874 0t0 TCP *:webcache (LISTEN)
[inca@LNMP~]$ ps -ef|grep nginx #查看进程
root 10639 1 0 09:08 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 10640 10639 0 09:08 ? 00:00:00 nginx: worker process
inca 10732 1 0 09:50 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /home/inca/conf/nginx.conf
inca 10733 10732 0 09:50 ? 00:00:00 nginx: worker process
inca 10734 10732 0 09:50 ? 00:00:00 nginx: worker process
inca 10735 10732 0 09:50 ? 00:00:00 nginx: worker process
inca 10736 10732 0 09:50 ? 00:00:00 nginx: worker process
inca 10741 10650 0 09:52 pts/1 00:00:00 grep nginx
[inca@LNMP~]$ killall nginx #杀掉nginx进程
nginx(10639): Operation not permitted
nginx(10640): Operation not permitted #提示操作不允许
[inca@LNMP~]$ ps -ef|grep nginx #查看进程,只有inca管理的nginx被杀掉,目的实现
root 10639 1 0 09:08 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 10640 10639 0 09:08 ? 00:00:00 nginx: worker process
inca 10744 10650 0 09:52 pts/1 00:00:00 grep nginx
打开浏览器访问网站+端口号
查看apachec的模式
/application/apache/bin/apachectl -l|sed -n '/worker\|prefork/p'
/application/apache/bin/apachectl -V
并发连接数查看
[root@oldboy ~]# pstree -a| grep http|wc -l
58
-
-
4.4apache使用Rewrite规则实现Discuz伪静态的配置
-优化-apache服务bbs伪静态的配置及伪静态规则
{ unzip Discuz_X3.2_SC_UTF8.zip
mv upload/ * .
rm -rf install/
创建数据库,权限
mysql -u root -p
mysql> create database bbs;
mysql> grant all on bbs.* to bbs@'localhost' identified by 'bbs123';
刷新权限
mysql> flush privileges;
mysql> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| | localhost |
| bbs | localhost |
| root | localhost |
| | oldboy |
| root | oldboy |
+------+-----------+
6 rows in set (0.00 sec)
-
windows7 客户端host解析网站,网页访问
授权
[root@oldboy bbs]# chown -R config/ data/ uc_*
下一步,全新安装,安装数据库,数据库前缀old_
进入管理中心 全局界面下的SEO优化,勾选全部 查看当前的 Rewrite 规则URL 静态化
将Rewrite规则复制黏贴到apache相对应的bbs虚拟主机中
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
检查语法,重启apache
/application/apache/bin/apachectl -t
/application/apache/bin/apachectl graceful
然后刷新浏览器
forum-2-1.html
显示以静态的方式显示
nginx的伪静态思路也是一样
Nginx Web Server
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;
}
}
nginx英文官方文档
nginx.org/en/docs/
-
ngx_http_limit_req_module控制Nginx并发连接数量以及控制客户端请求Nginx的速率
缓存模块
rewrite模块