让你网络上的某个私密站点只能你一个人访问

前置条件,你得稍微懂得nginx的配置,至少你得懂得lnmp 中nginx 配置的修改(其实所有nginx的配置都一样的。)

首先这个得跟我写的 《写了个小python程序——用python来修改DNSPod的解析记录值》联起来看,这玩意是用来做DDNS的。不过如果你有其他的DDNS的话,例如noip.com 这家的动态DNS的话,那么就可行了。如果没有DDNS的话,你得用我上面的小脚本在每次开机之后运行一下(事实上是每次断网更换IP之后运行一下。)

先说一下原理。

原理就是通过nginx的allow 和deny规则来限制。

首先,通过脚本来抓去你的ddns的IP

这一步我是通过py来实现的,毕竟简单,几句话就OK了。

其次是修改nginx,这个也简单,3句话就搞定了,这个我是通过bash来实现的。

为什么不用py或者单独的bash来实现呢?其一,我学艺不精。其二,我懒(其实这个才是主要的。)

用python脚本来实现获取IP,并写如日志

然后用bash来更新nginx配置。事实证明用python脚本写字符串更新什么的,还是用sed写快的一比~

用法如下在

root 目录下创建2个目录1为python,2为shell

将http://rffan.info/scripts/python/getip.py 放到python 目录下

将http://rffan.info/scripts/bash/change.sh 放到shell目录下。

另外这个change.sh需要改一下东西,包括nginx配置文件的路径。毕竟我是通过yum来安装nginx的,而不是使用的军哥一键包等一键安装工具安装的一般你们的nginx配置文件会在/usr/local/nginx/conf/vhost 目录下面。只要你们把我的/etc/nginx/conf.d 这个目录替换掉就OK了。

另外就是要替换前必须得写好规则,例如

在nginx的server字段里面要添加好

allow xx.xx.xx.xx;

deny all;

必须allow在前,否则deny先生效,所有人都无法访问。

至此,混乱的教程结束,看的懂就看,看不懂也不要找我,我要睡觉。

 

如何让你的CentOS 使用yum 安装nginx 或者Ubuntu使用apt-get安装Nginx

lnmpwithwordpress

nginx在CentOS 的新版本,例如CentOS 7 的yum中是不存在 或者在老版本的CentOS中是很古老的版本。现在阿福写了个脚本,能让CentOS的各个版本都能高高兴兴的使用最新稳定版。

截至写脚本为止nginx最新稳定版为1.8.0 ,最新主线版为1.9.9(不过nginx官方编译版本仍然为1.8.0)。官方编译版本的模块很多,具体如下

nginx version: nginx/1.8.0
built by gcc 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: –prefix=/etc/nginx –sbin-path=/usr/sbin/nginx –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pid-path=/var/run/nginx.pid –lock-path=/var/run/nginx.lock –http-client-body-temp-path=/var/cache/nginx/client_temp –http-proxy-temp-path=/var/cache/nginx/proxy_temp –http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp –http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp –http-scgi-temp-path=/var/cache/nginx/scgi_temp –user=nginx –group=nginx –with-http_ssl_module –with-http_realip_module –with-http_addition_module –with-http_sub_module –with-http_dav_module –with-http_flv_module –with-http_mp4_module –with-http_gunzip_module –with-http_gzip_static_module –with-http_random_index_module –with-http_secure_link_module –with-http_stub_status_module –with-http_auth_request_module –with-mail –with-mail_ssl_module –with-file-aio –with-ipv6 –with-http_spdy_module –with-cc-opt=’-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector –param=ssp-buffer-size=4 -m64 -mtune=generic’

 

包括但不限于uwsgi spdy http2等的支持。效果非常好。很适合那些懒癌发作的小伙伴们(当然严正提醒作为生产环境的小伙伴们,安装的软件越多,越容易出错。所以,并不建议作为生产环境的小伙伴们安装此版本的nginx)

 

使用方法如下:

wget -c http://rffan.info/scripts/setupnginxyum.sh

或者git clone https://github.com/rffanlab/Set-Up-yum-install-for-nginx-on-centos.git 解压后运行该shell

运行之后

直接使用yum install -y nginx

如果你是使用的是Debian系列(包括Ubuntu)

请wget -c http://rffan.info/scripts/setaptnginx.sh

获取之后使用 bash setaptnginx.sh运行。

就可以搞定了。

lnmp的wordpress为静态

 

lnmpwithwordpress

lnmp可以说是咱们玩VPS的利器啊。但是很可惜的是,军哥的lnmp中的wordpress为静态规则有些问题。这让我的朋友今天出了点小问题。他在wordpress根目录创建了一个go的子目录,然后在这个子目录下放了个index,但是开启了为静态之后,居然会出现404 。这显然是wordpress的为静态出问题了。

经过阿福不懈的寻找,终于找到了新的wordpress为静态替代军哥的新的为静态。

规则如下:

location / {
if (!-e $request_filename) {
       rewrite ^.+/?(/wp-.*) $1 last;
       rewrite ^.+/?(/.*\.php)$ $1 last;
       rewrite ^(.+)$ /index.php?q=$1 last;
    }
}

将这个规则替代/usr/local/nginx/conf/wordpress.conf中的内容即可获得成功。

手动更改apache的.htaccess伪静态规则为nginx伪静态规则

avsn
很多时候,我们玩的vps的时候都不会选择装apache,因为apache很占用资源,而nginx的小巧和高效让我们爱不释手,更重要的是nginx有一键包,能够让你很轻松的就能够搭建生产环境。因此选择nginx对于我们这些菜鸟来说就非常的有必要了。而伪静态对于SEO来说又是非常重要的,因此,将apache上的伪静态换成nginx就非常重要了。

下面是两者伪静态的对比:

apache:

RewriteEngine On

RewriteRule ^/([a-z]+)/p_([0-9]+)\.html$ /list\.php\?id=$1

nginx:

 rewrite ^/([a-z]+)/p_([0-9]+)\.html$ /list.php?id=$1 last;

 

两者有啥区别呢?嘿嘿,相信细心的童鞋已经看出区别来了。

就是讲RewriteRule替换成rewrite

将/list\.php\?id=$1中的”\”去掉,即:/list.php?id=$1

酱紫,一个崭新的apache下的.htaccess伪静态就替换成了nginx的伪静态了~

NginX 反代系列教程[转载]

发现以前写的几篇教程,挺模糊的,有人看了摸不清头脑。(由于当时我也不太懂……),现在重新写一遍,并增加注释。

如果你用的是军哥的LNMP,而且又需要替换内容,则需要重新编译nginx。如果不需要替换内存,仅用于加速自己的网站,则不需要重新编译。

1.安装Nginx

你可以用源安装/编译安装/一键包(此处省略)

2.新增虚拟主机配置文件用于反代

找到您的nginx conf所在位置,一般编译的在/usr/local/nginx/conf/,从源安装的在/etc/nginx

在nginx.conf的http层加入以下内容:

1
2
3
4
5
6
7
8
9
10
11
proxy_connect_timeout    5;
proxy_read_timeout       60;
proxy_send_timeout       5;
proxy_buffer_size        16k;
proxy_buffers            4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path   /home/cache/temp;
#临时文件目录
proxy_cache_path  /home/cache/path levels=1:2 keys_zone=cache_one:5m inactive=7d max_size=1g;
#5m为内存占用,1g为最大硬盘占用,cache_one为缓存区名字,如果修改则下文的配置亦要相应修改。
1
2
3
mkdir /home/cache/path -p
mkdir /home/cache/temp
chmod 777 -R /home/cache

新增虚拟主机配置:

1
2
vi /usr/local/nginx/conf/vhost/example.com.conf
#example.com是你要绑定的域名

配置文件内容:{后端(ip为1.2.3.4)绑定域名example.com,前端绑定域名example.com,域名解析到前端,实现cdn加速。}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
server{
listen 80;
server_name example.com www.example.com;
#绑定的域名
index index.php;
#默认首页
access_log off;
#off 关闭日志
location / {
proxy_cache_key “$scheme://$host$request_uri”;
#缓存key规则,用于自动清除缓存。
proxy_cache cache_one;
#缓存区名称,与前面定义的相同
proxy_cache_valid  200 304 3h;
proxy_cache_valid 301 3d;
proxy_cache_valid any 10s;
#200 304状态缓存3小时
301状态缓存3天
其他状态缓存(如502 404)10秒
proxy_set_header   X-Real-IP  $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
#向后端传递访客ip
proxy_set_header   Referer http://example.com;
#强制定义Referer,程序验证判断会用到
proxy_set_header   Host $host;
#定义主机头
proxy_pass http://1.2.3.4;
#指定后端ip,可以加端口
#proxy_cache_use_stale invalid_header error timeout http_502
#当后端出现错误、超时、502状态时启用过期缓存,慎用。
        }
}

如无意外,重启nginx后把example.com绑定到前端就可以访问了

1
/etc/init.d/nginx restart

 

下面介绍的是反代别人的网站(类似于小偷),并替换相关内容

1.编译nginX:

1
2
3
4
5
6
7
8
9
10
11
cd /root
apt-get update
apt-get install -y git gcc g++ make automake
#安装依赖包,Centos将apt-get更改为yum
git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module
wget http://nginx.org/download/nginx-1.2.8.tar.gz
tar zxvf nginx-1.2.8.tar.gz
cd nginx-1.2.8
./configure –user=www –group=www –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module –with-http_gzip_static_module –with-ipv6 –with-http_sub_module –add-module=/root/ngx_http_substitutions_filter_module
make
make install

如果您用的系统是Debian,就不需要编译了。

1
2
3
4
5
6
echo “deb http://packages.dotdeb.org squeeze all” >>/etc/apt/sources.list
echo “deb-src http://packages.dotdeb.org squeeze all” >>/etc/apt/sources.list
#添加dotdeb源,已多次介绍dotdeb源的好处
apt-get update
apt-get install nginx-full
#nginx-full这个包里面包含着所有需要用到的模块。

2.修改nginx.conf

编译的在/usr/local/nginx/conf/nginx.conf,源安装的在/etc/nginx/nginx.conf

以example.com反代www.baidu.com并替换内容为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
user  www;
worker_processes  2;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
                use epoll;
    worker_connections  1024;
}
http {
… #此处省略一万字
                proxy_connect_timeout    5;
                proxy_read_timeout       60;
                proxy_send_timeout       5;
                proxy_buffer_size        16k;
                proxy_buffers            4 64k;
                proxy_busy_buffers_size 128k;
                proxy_temp_file_write_size 128k;
                proxy_temp_path   /home/cache/temp;
                proxy_cache_path  /home/cache/one levels=1:2 keys_zone=cache_one:3m inactive=7d max_size=1g;
server {
   listen       80;
   server_name  example.com;
   index index.php;
        #默认首页
  location / {
    subs_filter_types text/html text/css text/xml;
    subs_filter www.baidu.com example.com gi;
#替换模块,下文详解。
    proxy_cache_key “$scheme://$host$request_uri”;
#缓存key规则,用于自动清除缓存。
    proxy_cache cache_one;
#缓存区名称,必须与前面定义的相同
    proxy_cache_valid  200 304 3h;
    proxy_cache_valid 301 3d;
    proxy_cache_valid any 10s;
#200 304状态缓存3小时
#301状态缓存3天
#其他状态缓存(如502 404)10秒
    proxy_set_header   X-Real-IP  $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
#向后端传递访客ip
    proxy_set_header   Referer http://www.baidu.com;
#强制定义Referer,程序验证判断会用到
    proxy_set_header   Host www.baidu.com;
#定义主机头
    proxy_pass http://1.2.3.4;
#指定后端ip
    proxy_set_header Accept-Encoding “”;
#清除编码
   proxy_cache_use_stale invalid_header error timeout http_502
#当后端出现错误、超时、502状态时启用过期缓存
        }
    }
}

温馨提示:如果您要替换的内容里面有中文,请将conf文件保存为utf-8 without BOM编码。

关于ngx_http_substitutions_filter_module的说明:(本模块是中国人写的,但是说明只有英文版,在此我翻译一下)

描述 nginx_substitutions_filter 是一个nginx替换模块,就跟apache的 mod_substitute模块一样

使用距离

location / {

subs_filter_types text/html text/css text/xml; subs_filter st(\d*).example.com $1.example.com ir; subs_filter a.example.com s.example.com;

}

涉及指令: * subs_filter_types

* subs_filter

subs_filter_types 语法: *subs_filter_types mime-type [mime-types] *

默认: *subs_filter_types text/html*

内容: *http, server, location*

*subs_filter_types* 是用来指定替换文件类型的 默认仅仅替换text/html类型的文件。

*如果您反代的论坛出现登录跳转源站之类的问题,请检查这个项目。

 

proxy_set_header Accept-Encoding “”;

subs_filter 语法: *subs_filter source_str destination_str [gior] *

默认: *none*

内容: *http, server, location*

*subs_filter* 是用来替换文本的,可以使用正则

* *g*(默认):替换匹配项。

* *i*:区分大小写的匹配

* *o*: 只匹配发现的第一个。

* *r*: 正则。

 

先讲这么多,有错误欢迎提出。

关于自动清空缓存的,我也没弄明白,先不写了。

原文来自:月妹子的博客

*参考资料:

Nginx Wiki   http://wiki.nginx.org/HttpProxyModule

YaoWeibin Github    https://github.com/yaoweibin/ngx_http_substitutions_filter_module

Nginx配置301重定向,搞定从不带www 301到带www

这个。。。其实阿福觉得这个题目非常的绕。绕的有点头晕。好吧,其实可以不用管后面的,只管前面的。这个问题是一个朋友很久以前问阿福的。具体多久?别问阿福。。阿福这个人懒。

好吧,现在趁着生病,整个人很闲就研究一下。其实这玩意很简单,因为阿福当时告诉他的就是wordpress后台的设置里面设置了url地址的话,他会自动跳转的。不过 那玩意不适合其他程序的,因此还得再根源上入手。

根源就是nginx

而解药呢就是:

rewrite ^/(.*)$ http://www.rffan.info/$1 permanent;

但是怎么服用呢?是外敷还是内服?别急,且听阿福慢慢道来。

上面这个语句就是咱们301的关键点。但是还有一个关键点就是nginx的vhost 配置文件的server字段:

server {

listen:80;

server_name rffan.info www.rffan.info;

}

上面这个字段是一个非常美妙的字段让我们领略到了既能访问www又能访问不带www的好处。但是很可惜SEO的需求,咱们得治了“既”“又”的毛病。既然解药都有了,那么我们为何还在这里扯皮呢?赶紧加进入吧。别急,还有一道关卡,如果单单把上面的rewrite加进入conf的话可能会报错。

server {

listen:80;

server_name rffan.info www.rffan.info;

rewrite ^/(.*)$ http://www.rffan.info/$1 permanent;

}

那么该如何改进呢?加个判断呗~于是乎最终的server字段改动就出炉了。

server {

listen:80;

server_name rffan.info www.rffan.info;

if ($host = ‘rffan.info’){

rewrite ^/(.*)$ http://www.rffan.info/$1 permanent;

}

大功告成,另外玩过C的可别吐槽,虽然nginx是用c编的,但是很可惜他的判断相同还是不相同不是用“==”而是“=”这个很难以置信吧?

}

给军歌的lnmp开启fastcgi-cache来给你的lnmp加速——来自MJJ月妹纸

阿福目前也在研究中。。。各种的不懂,因为到目前为止阿福还止步于linux初级阶段。文章转载之,实践之,若有问题。。别找阿福。找那个MJJ,原文网址:http://jybb.me/nginx-fastcgi_cache

开启FastCGI Cache步骤非常简单

1、新建文件夹存放缓存文件

1
mkdir /home/cache/fcgi -p

2、修改nginx.conf文件(LNMP一键包目录在/usr/local/nginx/conf/nginx.conf),在http层加入:

1
2
fastcgi_cache_path /home/cache/fcgi levels=1:2 keys_zone=fcgi:15m inactive=1d max_size=1g;
#15m为内存占用  1g为硬盘最大占用空间

3、修改位于vhost目录下的站点文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
location ~ .*\.(php|php5)?$
            {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/wwwroot/网站目录$fastcgi_script_name;  #把网站目录修改成自己的
            include        fastcgi_params;
            fastcgi_cache fcgi;    #表示开启FastCGI缓存并为其指定一个名称。
            fastcgi_cache_valid 200 302 301 1h;     #缓存http状态200 302 301 1小时
            fastcgi_cache_valid any 1m; #其他应答代码缓存1分钟。
            fastcgi_cache_min_uses 1;   #设置链接请求几次就被缓存。
            fastcgi_cache_use_stale error timeout invalid_header http_500;    #定义哪些情况下用过期缓存
            fastcgi_cache_key $request_method://$host$request_uri;  #注意一定要加上$request_method作为cache key,否则如果HEAD类型的先请求会导致后面的GET请求返回为空
}
4、重启nginx即可
1
/etc/init.d/nginx restart

5、打开站点,看缓存目录是否增大

1
du -sh /home/cache/fcgi

摘记:Nginx访问二级目录的时候不加/(反斜杠)无法访问

以下系自摘记,因为前几天逛朋友博客的时候发先了据说wordpress 404的问题,阿福也曾经报道过类似的情况,都是不能自动加/然后直接404了,但是当时阿福是自己手动输入的,现在找到了代码,记录以下。等待测试后找出这段代码的具体使用方法(是在nginx的conf使用还是在主机的配置conf下使用都是一个问题。不过应该挺简单的,玩vps的童鞋可以自己去折腾了。玩主机的。貌似没有使用这个代码的必要主机都是apache的。)

Nginx访问二级目录的时候不加/(反斜杠)无法访问,现在给出解决办法。

我用的是正则表达式自动加/(反斜杠)。

if (-d $request_filename){
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}