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/

phpmyadmin错误The plain HTTP request was sent to HTTPS port

今天在配置nginx的https支持,把phpmyadmin放在一个子目录下,即https://ip/phpmyadmin,登录出现The plain HTTP request was sent to HTTPS port错误,现给出解决方法:
1.在location ~ .php$区域添加fastcgi_param HTTPS on;如以下代码:

  1. location ~ .php$ {
  2.                 fastcgi_index index.php;
  3.                 include /etc/nginx/fastcgi_params;
  4.                 fastcgi_param HTTPS on;
  5.                 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  6.                 fastcgi_pass 127.0.0.1:9000;
  7.         }

2.在http区域添加

  1. map $scheme $fastcgi_https {
  2. default off;
  3. https on;
  4. }

如例子:

  1. http
  2. {
  3. map $scheme $fastcgi_https {
  4. default off;
  5. https on;
  6. }
  7.  
  8.     include       /etc/nginx/mime.types;
  9.     default_type  application/octet-stream;
  10. ………
  11. }

之后重载nginx即生效.

nginx使用ssl模块配置HTTPS支持

默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖于OpenSSL库和一些引用文件,通常这些文件并不在同一个软件包中。通常这个文件名类似libssl-dev。

生成证书

可以通过以下步骤生成一个简单的证书:
首先,进入你想创建证书和私钥的目录,例如:

  1. $ cd /usr/local/nginx/conf

创建服务器私钥,命令会让你输入一个口令:

  1. $ openssl genrsa -des3 -out server.key 1024

创建签名请求的证书(CSR):

  1. $ openssl req -new -key server.key -out server.csr

在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:

  1. $ cp server.key server.key.org
  2. $ openssl rsa -in server.key.org -out server.key

配置nginx

最后标记证书使用上述私钥和CSR:

  1. $ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

修改Nginx配置文件,让其包含新标记的证书和私钥:

  1. server {
  2.     server_name YOUR_DOMAINNAME_HERE;
  3.     listen 443;
  4.     ssl on;
  5.     ssl_certificate /usr/local/nginx/conf/server.crt;
  6.     ssl_certificate_key /usr/local/nginx/conf/server.key;
  7. }

重启nginx。
这样就可以通过以下方式访问:
https://YOUR_DOMAINNAME_HERE
另外还可以加入如下代码实现80端口重定向到443

  1. server {
  2. listen 80;
  3. server_name ww.webres.wang;
  4. rewrite ^(.*) https://$server_name$1 permanent;
  5. }

 

Apache tomcat JRE安装配置

tomcat处理静态不如Apache,所以我们使用jk_mod模块达到apache处理静态内容,tomcat处理jsp文件的目的。

安装JRE

http://www.oracle.com下载JRE软件。

  1. wget http://download.oracle.com/otn-pub/java/jdk/7u2-b13/jre-7u2-linux-i586.tar.gz
  2. tar xzf jre-7u2-linux-i586.tar.gz
  3. mv jre1.7.0_02/ /usr/local/jre

tomcat安装

到http://tomcat.apache.org/下载tomcat

  1. wget http://labs.renren.com/apache-mirror/tomcat/tomcat-7/v7.0.23/bin/apache-tomcat-7.0.23.tar.gz
  2. tar xzf apache-tomcat-7.0.23.tar.gz
  3. mv apache-tomcat-7.0.23 /usr/local/tomcat

设置环境变量

  1. vi /etc/profile

在文件末尾增加:

  1. export JRE_HOME=/usr/local/jre

执行source命令使生效

  1. source /etc/profile

tomcat根目录设置

1.打开tomcat安装目录下面conf目录下的server.xml文件。
2.找到如下文字:

  1. <Host name="localhost" appBase="webapps"
  2.        unpackWARs="true" autoDeploy="true">

3.在上面找到的文字后面添加如下内容

  1. <Context path="" docBase="/usr/local/apache/htadocs" debug="0" reloadable="true" />

/usr/local/apache/htadocs即为根目录地址。

安装apache

  1. wget http://mirror.bit.edu.cn/apache//httpd/httpd-2.2.22.tar.gz
  2. tar xzf httpd-2.2.22.tar.gz
  3. cd httpd-2.2.22
  4. ./configure –prefix=/usr/local/apache
  5. make && make install

安装jk_mod模块

  1. wget http://www.apache.org/dist/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.33-src.tar.gz
  2. tar xzf tomcat-connectors-1.2.33-src.tar.gz
  3. cd tomcat-connectors-1.2.33-src/native
  4. ./configure –with-apxs=/usr/local/apache/bin/apxs
  5. make && make install

apache与tomcat连接配置

配置与tomcat连接主要有三个文件:
httpd.conf,workers.properties,uriworkermap.properties
1、httpd.conf

  1. # 加载 mod_jk 模块
  2. LoadModule jk_module modules/mod_jk.so
  3. #
  4. # 配置mod_jk模块
  5. #
  6. <IfModule jk_module>
  7. JkWorkersFile conf/workers.properties
  8. JkMountFile conf/uriworkermap.properties
  9. JkLogFile logs/mod_jk.log
  10. JkLogLevel warn
  11. </IfModule>

2、workers.properties

  1. #定义两个可用的worker wlb和jkstatus
  2. worker.list=wlb,jkstatus
  3.  
  4. #定义一个物理为ajp13w,类型ajp13(可以定义多个用作负载均衡)
  5. worker.ajp13w.type=ajp13
  6. worker.ajp13w.host=localhost
  7. worker.ajp13w.port=8009
  8.  
  9. #定义一个逻辑worker wlb,类型为lb,用来管理物理worker ajp13w
  10. worker.wlb.type=lb
  11. worker.wlb.balance_workers=ajp13w
  12.  
  13. #定义一个类型为status的worker jkstatus,用来监控 JK 本身
  14. worker.jkstatus.type=status

3、uriworkermap.properties

  1. #这文件作用是指定哪些url由worker wlb处理,哪些文件不允许wlb处理。
  2. /*=wlb
  3. /status=jkstatus
  4. /examples/*=wlb
  5. !/*.jpg=wlb
  6. !/*.png=wlb
  7. !/*.css=wlb
  8. !/*.js=wlb
  9. !/*.htm=wlb
  10. !/*.html=wlb
  11.  
  12. #/jkstatus由worker status处理,静态的由apache处理,剩下的由wlb处理。

启动程序

  1. /usr/local/apache/bin/apachectl -k start
  2. /usr/local/tomcat/bin/startup.sh

CentOS安装iRedMail web邮件服务器

中文名为“艾瑞得邮件”,由 rhms 项目 更名而来。是针对 Red Hat(R) Enterprise Linux 和 CentOS 设计的邮件服务器解决方案,是在操作系统安装好后使用的一套 shell 脚本,用于快速部署一套功能完善的邮件服务器解决方案。iredmail谷歌开源地址:http://code.google.com/p/iredmail/

iredmail系统要求

iredmail安装需要干净的系统环境,意思是服务器不存在与iredmail相关的组件,如apache,mysql,OpenLDAP,postfix,Dovecot,Amavisd等。否则会覆盖原来的配置文件,甚至导致iredmail安装失败。
为了能安装iredmail,你需要满足以下两个条件:
1、一个干净的系统,如RHEL,CentOS,Scientific Linux 系统。
2、不低于512MB的内存。

安装前的准备

1、设置一个完全合格的域名(FQDN)主机名
执行命令hostname -f以查看当前主机名:

  1. $ hostname -f
  2. demo.iredmail.org

在RHEL/CentOS/Scientific Linux系统,设置hostname通常是改以下两个文件
/etc/sysconfig/network 主机名设置。
/etc/hosts 主机名解析,需要放在第一位。
2、激活yum软件库以安装新软件包
CentOS系统软件库配置文件在/etc/yum.repos.d/目录下,后缀是.repo,打开这些文件,如果包含”enabled=1″,表示已经激活。
3、下载最新发布的iRedMail
到这里下载:http://code.google.com/p/iredmail/wiki/Download?tm=2
解压软件包:

  1. # cd /root/
  2. # tar xjf iRedMail-x.y.z.tar.bz2

开始安装iRedMail

如果服务器在中国,由于域名被墙,需要打开文件/root/iRedMail-x.y.z/pkgs/get_all.sh,查找iredmail.org替换为173.254.22.21。

  1. # cd /root/iRedMail-x.y.z/
  2. # bash iRedMail.sh

下面是安装截图:
1)欢迎安装界面.
Postfix
2)指定存储邮箱的路径,默认是/var/vmail/。
Postfix
3)选择存储帐号的后端,选择你熟悉的。之后你可以iRedAdmin管理帐号。
Postfix
4)如果选择的后端是OpenLDAP,接下来会问两个问题。
4.1)LDAP后缀
Postfix
4.2)LDAP密码
Postfix
5)设置mysql root密码
Postfix
6)设置你第一个邮箱域名
Postfix
7)设置邮箱管理地址
Postfix
8)设置邮箱后台管理密码
Postfix
9)设置邮箱用户密码
Postfix
10)选择可选组件安装
Postfix
11)设置默认语言
Postfix
回答完这些问题之后,安装程序问是否开始安装,输入y即可。

安装完成之后需要知道的重要事情

1、阅读/root/iRedMail-x.y.z/iRedMail.tips,它包含一些与iredmail相关的信息
2、为SPF设置dns记录http://code.google.com/p/iredmail/wiki/DNS_SPF
3、为DKIM设置DNS记录http://code.google.com/p/iredmail/wiki/DNS_DKIM

webmail和其它一些程序的入口

Webmail http://your_server/mail/ (or /webmail, /roundcube)
iRedAdmin (admin panel) httpS://your_server/iredadmin/
phpMyAdmin httpS://your_server/phpmyadmin/
phpLDAPadmin httpS://your_server/phpldapadmin/
Awstats httpS://your_server/awstats/awstats.pl?config=web (or ?config=smtp)

使用监控宝监控snmp性能

snmp能收集服务器性能的各项数据,如CPU使用率,内存使用率,CPU负载,系统进程数,磁盘空间使用率,网络流量,磁盘I/O等,而使用监控宝处理这些数据能很直观地显示出来。下面介绍如何配置

安装snmp

1、到http://www.net-snmp.org/下载最新版的snmp安装包。

  1. wget http://softlayer-dal.dl.sourceforge.net/project/net-snmp/net-snmp/5.7.2/net-snmp-5.7.2.tar.gz
  2. tar xzf net-snmp-5.7.2.tar.gz
  3. cd net-snmp-5.7.2
  4. ./configure –prefix=/usr/local/snmp –with-mib-modules=ucd-snmp/diskio –with-default-snmp-version=3 –[email protected]  –with-sys-location=Unknown  –with-logfile=/var/log/snmpd.log –with-persistent-directory=/var/net-snmp
  5. make
  6. make install

可能会出现Can’t locate ExtUtils/MakeMaker.pm错误,centos使用yum install perl-ExtUtils-MakeMaker安装。
2、设置安全的验证方式
我们这里使用v3验证方式。
创建snmpd.conf文件:

  1. vi /usr/local/snmp/share/snmp/snmpd.conf

然后添加一个只读帐号,如下:

  1. rouser jiankongbao auth

可以看到,在v3中,“rouser”用于表示只读帐号类型,随后的“jiankongbao”是指定的用户名,后边的“auth”指明需要验证。
接下来,我们还要添加“jiankongbao”这个用户,这就是v3中的特殊机制,我们打开以下配置文件:

  1. vi /var/net-snmp/snmpd.conf

这个文件会在snmpd启动的时候被自动调用,我们需要在它里边添加创建用户的指令,如下:

  1. createUser jiankongbao MD5 mypassword

这行配置的意思是创建一个名为“jiankongbao”的用户,密码为“mypassword”,并且用MD5进行加密传输。这里要提醒的是:
密码至少要有8个字节
这是SNMP协议的规定,如果小于8个字节,通信将无法进行。
值得注意的是,一旦snmpd启动后,出于安全考虑,以上这行配置会被snmpd自动删除,当然,snmpd会将这些配置以密文的形式记录在其它文件中,重新启动snmpd是不需要再次添加这些配置的,除非你希望创建新的用户。
以上配置中的用户名、密码和加密方式,在监控宝添加服务器的时候需要添加。
3、启动SNMP代理程序
经过配置后,现在可以启动snmpd,如下:

  1. /usr/local/snmp/sbin/snmpd

如果要关闭,则可以直接kill这个进程,如下:

  1. killall -9 snmpd

在监控宝中添加服务器

现在我们来看看如何在监控宝中添加服务器监控,通过新增的导航,你会很容易进入添加服务器的页面,这里分为两部分,首先是填写服务器信息,包括服务器名称和IP地址,以及操作系统类型。
这些都非常简单,之所以要选择操作系统类型,是因为Linux和Windows的机制存在一些差异,所以它们的SNMP信息库会有一些不同,我们需要根据不同的系统来提供相应的监控项目。
监控
接下来是SNMP设置,主要是选择不同的SNMP协议,以及填写身份验证信息,前边已经有过详细的介绍,这里你只需要将前边配置的信息如实填写即可。
监控
监控

填写完后,点击提交按钮,这时候监控宝会使用这些信息来尝试连接你的SNMP监控代理,需要一些时间,这一步非常重要。
监控
不妙,如果你填写的信息无法连接到服务器的SNMP代理程序,监控宝会提示你,这时候,请你仔细检查之前介绍的那些配置,以及防火墙策略,也许你没有开放udp161端口。
监控
找到问题后再次提交,如果连接成功,则会看到成功页面,如下:
监控
然后点击“添加监控项目”,便可以为这台服务器选择监控项目,对于Linux服务器,监控宝目前提供了以下的监控项目,你可以全部勾选,然后提交。
监控
然后就等待数据和图表吧,一切就这么简单,如果有疑问或需要帮助,请发邮件到 help (at) jiankongbao.com
*注:此文发表时,监控宝的服务器监控功能尚未正式发布。
参考:http://blog.jiankongbao.com/?p=160
   http://wiki.jiankongbao.com/doku.php/%E6%96%87%E6%A1%A3:%E5%AE%89%E5%85%A8%E6%8C%87%E5%BC%95#linux_snmp