500 OOPS: vsftpd: refusing to run with writable root inside chroot()

今天把vsftpd升级到了v2.3.5,配置文件还是使用原来的.允许本地用户登录ftp,并且使用chroot限制ftp根目录.启动登录之后发现如下错误:

  1. 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

意思是不能使用chroot限制可写的根目录,看了下vsftpd的更新日志:

  1. Add stronger checks for the configuration error of running with a writeable root directory inside a chroot(). This may bite people who carelessly turned on chroot_local_user but such is life.

好吧,我们如果启用chroot,必须保证ftp根目录不可写,这样对于ftp根直接为网站根目录的用户不方便,所以建议假如ftp根目录是/home/centos,那么网站结构可以这样分,/home/centos/log为日志目录,/home/centos/web为网站根目录,这样我们就可以去掉/home/centos目录的写入权限而不影响网站的正常运行

  1. chmod a-w /home/centos

25个Apache性能优化技巧推荐

Apache至今仍处于web服务器领域的霸主,无人撼动,没有开发者不知道。本篇文章介绍25个Apache性能优化的技巧,如果你能理解并掌握,将让你的Apache性能有显著的提升!

Apache部分:

  • 1. 移除不用的模块。
  • 2. 使用 mod_disk_cache NOT mod_mem_cache 。
  • 3. 扁平架构配置mod_disk_cache。
  • 4. 安装恰当的Expires, Etag, 和 Cache-Control Headers 。
  • 5. 将缓存放在独立的磁盘
  • 6. 使用管道日志替代直接记录
  • 7. 将日志放在不同的磁盘
  • 8. 使用 mod_gzip/mod_deflate 。
  • 9. 将HostnameLookups关闭.
  • 10. 避免在configs中使用主机名。
  • 11. 使用持久连接。
  • 12. 不要设置KeepAliveTimeout太高。
  • 13. 禁用.htaccess。
  • 14. 允许symlinks。
  • 15. 关闭ExtendedStatus。
  • 16. 避免在DirectoryIndex中通配符。

OS 部分:

  • 17. 提高Swappiness。
  • 18. 提高写入缓冲器( Write Buffer)大小。
  • 19. 提高最大打开文件。

应用部分:

    20. 设置图像和样式表的前端代理。

  • 21. 使用mod_passenger for rails。
  • 22. 关闭safe_mode for php。
  • 23. 不要使用threaded mpm with mod_php。
  • 24. 刷新缓冲区预渲染。
  • 25. 频繁访问的数据设置缓存。

原文:http://blog.monitis.com/index.php/2011/07/05/25-apache-performance-tuning-tips/
中文翻译:http://sd.csdn.net/a/20110707/301263.html

nginx替换文本模块Substitution

这个模块可以能够在nginx的应答中搜索并替换文本。
要使用这个模块必须在编译时指定下列编译参数:

  1. –with-http_sub_module option

示例配置:

  1. location / {
  2.   sub_filter      </head>
  3.   ‘</head><script language="javascript" src="$script"></script>’;
  4.   sub_filter_once on;
  5. }

指令

sub_filter

语法:sub_filter text substitution
默认值:none
使用字段:http, server, location
指令允许替换nginx应答体中的一些文本到另外的值,匹配不区分大小写,替换文本可以包含变量,每个location中只能指定一个替换规则。

sub_filter_once

语法:sub_filter_once on|off
默认值:sub_filter_once on
使用字段:http, server, location
设置为off将替换应答中出现的所有匹配字段,默认只会替换第一个出现的匹配值。

sub_filter_types

语法:sub_filter_types mime-type [mime-type …]
默认值:sub_filter_types text/html
使用字段:http, server, location
设置sub_filter检查包含的MIME类型,默认只有text/html。

nginx配置查看http运行请求状态

Stub Status模块(Stub Status),这个模块可以取得一些nginx的运行状态。
要使用这个模块必须在编译时指定下列编译参数:

  1. –with-http_stub_status_module

示例配置:

  1. location /nginx_status {
  2.   stub_status on;
  3.   access_log   off;
  4. }

这个模块可以生成一个类似mathopd状态页面的纯文本信息:

  1. Active connections: 291
  2. server accepts handled requests
  3.   16630948 16630948 31070465
  4. Reading: 6 Writing: 179 Waiting: 106

active connections – 所有打开的连接,包括连接到后端服务器的。
server accepts handled requests – nginx已经接受并处理16630948个连接,31070465个请求(每个连接1.8个请求)。
reading – 正在读取的请求头。
writing – 正在读取的请求主体,正在处理的请求或者正在写入的应答。
waiting – keepalive连接数,等于active – (reading + writing)。

CentOS安装rrdtool

  1. # wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
  2. # rpm -ivh rpmforge-release-0.3.6-1.el5.rf.i386.rpm

会在/etc/yum.repos.d目录生成一些yum源

  1. # yum install rrdtool

nginx防盗链配置

判断一个请求的Referer可以有效的防止盗链,使用nginx相应的HTTP Referer模块(HTTP Referer)可以实现此功能.
当一个请求头的Referer字段中包含一些非正确的字段,这个模块可以禁止这个请求访问站点。
这个头可以随意的伪造,因此,使用这个模块并不能100%的阻止这些请求,绝大多数拒绝的请求来自一些典型的浏览器,可以认为这些典型的浏览器并不能提供一个”Referer”头,甚至是那些正确的请求。
如下例:
location /photos/ {

  1. valid_referers none blocked www.mydomain.com mydomain.com;
  2.  
  3.   if ($invalid_referer) {
  4.     return   403;
  5.   }
  6. }

这里只有一个重要的指令valid_referers:
这个指令在referer头的基础上为 $invalid_referer 变量赋值,其值为0或1。
可以使用这个指令来实现防盗链功能,如果valid_referers列表中没有Referer头的值, $invalid_referer将被设置为1(参照前例)。
参数可以使如下形式:

  • none意为不存在的Referer头
  • blocked意为根据防火墙伪装Referer头,如:“Referer: XXXXXXX”。
  • server_names为一个或多个服务器的列表,0.5.33版本以后可以在名称中使用“*”通配符。

nginx配置gzip压缩

gzip压缩用的是http_gzip_module模块.这个模块支持在线实时压缩输出数据流,使用范例:

  1. gzip             on;
  2.  gzip_min_length  1000;
  3.  gzip_proxied     expired no-cache no-store private auth;
  4. gzip_types       text/plain application/x-javascript text/css text/html application/xml;

gzip on|off
开启或者关闭gzip模块
gzip_min_length 1000
设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。
默认值是0,不管页面多大都压缩。
建议设置成大于1k的字节数,小于1k可能会越压越大。 即: gzip_min_length 1024
gzip_proxied expired no-cache no-store private auth;
Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含”Via”的 header头。
gzip_types text/plain application/xml;
匹配MIME类型进行压缩,(无论是否指定)”text/html”类型总是会被压缩的。

nginx实现访问网站或目录密码认证保护

对于实现访问网站或目录密码认证保护,nginx的HTTP基本认证模块(HTTP Auth Basic)可以实现.
这个模块提供基于用户名与密码的验证来保护你的站点或站点的一部分。 如下例:

  1. location  /  {
  2.   auth_basic            "Restricted";
  3.   auth_basic_user_file  conf/htpasswd;
  4. }

解释:
auth_basic
指令包含一个具有测试用户名和密码的HTTP基本认证,指定的参数将用于认证域。如果将值设置为“off”则忽略下级指令继承的动作。
auth_basic_user_file
指令为验证域指定了密码文件,0.6.7版本以后这里指定的文件是nginx.conf所在目录的相对路径,而不是–prefix指定的路径。
这个文件格式如下:

  1. user:pass
  2. user2:pass2:comment
  3. user3:pass3

如果没有apache的htpasswd程序,可以使用pl程序生成:
程序地址:http://trac.edgewall.org/export/10890/trunk/contrib/htpasswd.py
使用方法: ./htpasswd.py -b -c pass.txt admin 123456
pass.txt为密码文件,admin是用户名,123456是密码.

Nginx拒绝或允许指定IP

nginx拒绝或允许指定IP,是使用模块HTTP访问控制模块(HTTP Access).
控制规则按照声明的顺序进行检查,首条匹配IP的访问规则将被启用。
如下例:

  1. location / {
  2.   deny    192.168.1.1;
  3.   allow   192.168.1.0/24;
  4.   allow   10.1.1.0/16;
  5.   deny    all;
  6. }

上面的例子中仅允许192.168.1.0/24和10.1.1.0/16网络段访问这个location字段,但192.168.1.1是个例外。
注意规则的匹配顺序,如果你使用过apache你可能会认为你可以随意控制规则的顺序并且他们能够正常的工作,但实际上不行,下面的这个例子将拒绝掉所有的连接:

  1. location / {
  2.   #这里将永远输出403错误。
  3.   deny all;
  4.   #这些指令不会被启用,因为到达的连接在第一条已经被拒绝
  5.   deny    192.168.1.1;
  6.   allow   192.168.1.0/24;
  7.   allow   10.1.1.0/1
  8. }

Nginx实现HTTP负载均衡

下面是配置nginx负载均衡的简单示例文件,主要作用是:
www.s135.com 和 blog.s135.com 域名均指向 Nginx 所在的服务器IP。用户访问http://www.s135.com,将其负载均衡到192.168.1.2:80、92.168.1.3:80、192.168.1.4:80、192.168.1.5:80四台服务器。用户访问http://blog.s135.com,将其负载均衡到192.168.1.7服务器的8080、8081、8082端口。获取用户真实IP.

  1. user  www www;
  2.  
  3. worker_processes 10;
  4.  
  5. #error_log  logs/error.log;
  6. #error_log  logs/error.log  notice;
  7. #error_log  logs/error.log  info;
  8.  
  9. #pid        logs/nginx.pid;
  10.  
  11. #最大文件描述符
  12. worker_rlimit_nofile 51200;
  13.  
  14. events
  15. {
  16.       use epoll;
  17.  
  18.       worker_connections 51200;
  19. }
  20.  
  21. http
  22. {
  23.       include       conf/mime.types;
  24.       default_type  application/octet-stream;
  25.  
  26.       keepalive_timeout 120;
  27.  
  28.       tcp_nodelay on;
  29.  
  30.       upstream  www.s135.com  {
  31.               server   192.168.1.2:80;
  32.               server   192.168.1.3:80;
  33.               server   192.168.1.4:80;
  34.               server   192.168.1.5:80;
  35.       }
  36.  
  37.       upstream  blog.s135.com  {
  38.               server   192.168.1.7:8080;
  39.               server   192.168.1.7:8081;
  40.               server   192.168.1.7:8082;
  41.       }
  42.  
  43.       server
  44.       {
  45.               listen  80;
  46.               server_name  www.s135.com;
  47.  
  48.               location / {
  49.                        proxy_pass        http://www.s135.com;
  50.                        proxy_set_header   Host             $host;
  51.                        proxy_set_header   X-Real-IP        $remote_addr;
  52.                        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  53.               }
  54.  
  55.               log_format  www_s135_com  ‘$remote_addr – $remote_user [$time_local] $request ‘
  56.                                 ‘"$status" $body_bytes_sent "$http_referer" ‘
  57.                                 ‘"$http_user_agent" "$http_x_forwarded_for"’;
  58.               access_log  /data1/logs/www.log  www_s135_com;
  59.       }
  60.  
  61.       server
  62.       {
  63.               listen  80;
  64.               server_name  blog.s135.com;
  65.  
  66.               location / {
  67.                        proxy_pass        http://blog.s135.com;
  68.                        proxy_set_header   Host             $host;
  69.                        proxy_set_header   X-Real-IP        $remote_addr;
  70.                        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  71.               }
  72.  
  73.               log_format  blog_s135_com  ‘$remote_addr – $remote_user [$time_local] $request ‘
  74.                                 ‘"$status" $body_bytes_sent "$http_referer" ‘
  75.                                 ‘"$http_user_agent" "$http_x_forwarded_for"’;
  76.               access_log  /data1/logs/blog.log  blog_s135_com;
  77.       }
  78. }

这里主要用到两个模块:
1.HTTP负载均衡模块(HTTP Upstream),其中的一些字段解释:
server:指定后端服务器的名称和一些参数,可以使用域名,IP,端口,或者unix socket。如果指定为域名,则首先将其解析为IP。
upstream:这个字段设置一群服务器,可以将这个字段放在proxy_pass和fastcgi_pass指令中作为一个单独的实体,它们可以可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。
2.HTTP代理模块(HTTP Proxy)
这个模块可以转发请求到其他的服务器。
proxy_pass:这个指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式
proxy_set_header:这个指令允许将发送到被代理服务器的请求头重新定义或者增加一些字段。这个值可以是一个文本,变量或者它们的组合。
参考网址:
HTTP代理模块(HTTP Proxy)
HTTP负载均衡模块(HTTP Upstream)
http://blog.s135.com/post/306/