关于Nginx的资料
参考《使用163开源镜像升级你的Centos 》
如果设置源服务器为163的,你有很多服务器需要处理,那建立一个本地缓存服务器是一个很好的选择,更新一次后,那之后的更新速度可就快的要命啊。。
配置nginx为类似如下样子,自行修改自己的需求:
yum的配置可以如下:
就这样OK了!
如果设置源服务器为163的,你有很多服务器需要处理,那建立一个本地缓存服务器是一个很好的选择,更新一次后,那之后的更新速度可就快的要命啊。。
配置nginx为类似如下样子,自行修改自己的需求:
upstream backend {
server mirrors.163.com:80 ;
}
server {
#server_name www.aslibra.com;
server_name mirrors.aslibra.com;
set $index 'index.htm';
set $store_file $request_filename;
#root /Data/www.aslibra.com;
root /Data/mirrors/mirrors.163.com;
if ($uri ~ /$ ){
set $store_file $request_filename$index;
}
location /centos/ {
index index.htm;
proxy_store on;
proxy_temp_path /Data/mirrors/tmp;
proxy_set_header Host mirrors.163.com;
proxy_store_access user:rw group:rw all:rw;
if ( !-e $store_file ) {
proxy_pass http://backend;
}
}
}
server mirrors.163.com:80 ;
}
server {
#server_name www.aslibra.com;
server_name mirrors.aslibra.com;
set $index 'index.htm';
set $store_file $request_filename;
#root /Data/www.aslibra.com;
root /Data/mirrors/mirrors.163.com;
if ($uri ~ /$ ){
set $store_file $request_filename$index;
}
location /centos/ {
index index.htm;
proxy_store on;
proxy_temp_path /Data/mirrors/tmp;
proxy_set_header Host mirrors.163.com;
proxy_store_access user:rw group:rw all:rw;
if ( !-e $store_file ) {
proxy_pass http://backend;
}
}
}
yum的配置可以如下:
[base]
name=CentOS-$releasever - Base
baseurl=http://mirrors.aslibra.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
[updates]
name=CentOS-$releasever - Updates
baseurl=http://mirrors.aslibra.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
[addons]
name=CentOS-$releasever - Addons
baseurl=http://mirrors.aslibra.com/centos/$releasever/addons/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
[extras]
name=CentOS-$releasever - Extras
baseurl=http://mirrors.aslibra.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://mirrors.aslibra.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
name=CentOS-$releasever - Base
baseurl=http://mirrors.aslibra.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
[updates]
name=CentOS-$releasever - Updates
baseurl=http://mirrors.aslibra.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
[addons]
name=CentOS-$releasever - Addons
baseurl=http://mirrors.aslibra.com/centos/$releasever/addons/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
[extras]
name=CentOS-$releasever - Extras
baseurl=http://mirrors.aslibra.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://mirrors.aslibra.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
就这样OK了!
以下几个是解决安装过程碰到的pcre和md5的问题
其中pcre-devel是解决pcre的,剩余两个解决md5的,很简便。
参考阅读:the HTTP rewrite module requires the PCRE library
yum -y install pcre-devel openssl openssl-devel
其中pcre-devel是解决pcre的,剩余两个解决md5的,很简便。
参考阅读:the HTTP rewrite module requires the PCRE library
曾经几次发生404的问题导致服务器请求很慢,这个问题一直都还没有明确原因。
为什么404错误会导致连接数特别高?
上面是nginx在404错误时,和修复404错误之后的变化,404错误居然能够产生有1k多的连接。
更换为lighttpd也是一样,顶不住。。
reading的数量特别高,导致访问其它服务特别慢。汗一把。。有空再细看资料,大家平时多注意。。。
为什么404错误会导致连接数特别高?
引用
Active connections: 1118
server accepts handled requests
48870809 48870809 48557219
Reading: 1116 Writing: 2 Waiting: 0
Active connections: 17
server accepts handled requests
50852281 50852281 50537511
Reading: 16 Writing: 1 Waiting: 0
server accepts handled requests
48870809 48870809 48557219
Reading: 1116 Writing: 2 Waiting: 0
Active connections: 17
server accepts handled requests
50852281 50852281 50537511
Reading: 16 Writing: 1 Waiting: 0
上面是nginx在404错误时,和修复404错误之后的变化,404错误居然能够产生有1k多的连接。
更换为lighttpd也是一样,顶不住。。
reading的数量特别高,导致访问其它服务特别慢。汗一把。。有空再细看资料,大家平时多注意。。。
由于要rewrite一个地址从
/mag/xx/xxx/ -> /m/xxx
但原先 /mag/xx/more/ 要保留
这就得写一个比较奇特的正则了,尝试了比较多的写法也没成功
最先想的是:
[]的写法并不凑效,里面是匹配单个字符的,这样无效,匹配不了
还是小范同学不错,研究的深入,提供了非某单词的写法 (?!more)
这个写法勉强可以应付了,后面的匹配单元虽说还不完美,但也能够对付我的所有需求内容了。
有需要的可以参考此写法。
常用分组语法
捕获
(exp) 匹配exp,并捕获文本到自动命名的组里
(?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?
参考资料:正则表达式
/mag/xx/xxx/ -> /m/xxx
但原先 /mag/xx/more/ 要保留
这就得写一个比较奇特的正则了,尝试了比较多的写法也没成功
最先想的是:
location ~* ^/mag/[^/]+/[^(more)]+/ {
rewrite ^/mag/[^/]+/(.*) /m/$1 permanent;
}
rewrite ^/mag/[^/]+/(.*) /m/$1 permanent;
}
[]的写法并不凑效,里面是匹配单个字符的,这样无效,匹配不了
还是小范同学不错,研究的深入,提供了非某单词的写法 (?!more)
location ~* ^/mag/[^/]+/(?!more)([^/]+)/ {
rewrite ^/mag/[^/]+/(.*) /m/$1 permanent;
}
rewrite ^/mag/[^/]+/(.*) /m/$1 permanent;
}
这个写法勉强可以应付了,后面的匹配单元虽说还不完美,但也能够对付我的所有需求内容了。
有需要的可以参考此写法。
引用
常用分组语法
捕获
(exp) 匹配exp,并捕获文本到自动命名的组里
(?
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?
参考资料:正则表达式
Nginx的代理功能太完善了,我们看看proxy_redirect参数的作用。
案例说明:
要做一个html.aslibra.com的域名处理很多网站的html内容,当然是后端的服务器了,目录分析
html.zcom.com/img.aslibra.com/
html.zcom.com/css.aslibra.com/
访问的域名是该目录下的域名,那前端nginx的配置应该类似这样:
但这样访问目录时如果没有以“/”结尾,则服务器会返回301redirect:
html.aslibra.com这个域名并非公布的域名,返回给客户端是会自然产生错误的
Nginx可以很好的处理这个问题:
加一行proxy_redirect后,正常了:
就这么样就ok啦~
不过貌似不支持变量出现在地址里,这个就郁闷了,必须指定相应域名。
对于多个域名匹配的server,redirect设置不能写作'/'了,否则会用第一个域名作为redirect域名
可以写几个匹配规则:
案例说明:
要做一个html.aslibra.com的域名处理很多网站的html内容,当然是后端的服务器了,目录分析
html.zcom.com/img.aslibra.com/
html.zcom.com/css.aslibra.com/
访问的域名是该目录下的域名,那前端nginx的配置应该类似这样:
server {
server_name img.aslibra.com;
location / {
rewrite ^(.*) /$http_host$1 break;
proxy_set_header Host html.aslibra.com;
proxy_pass http://cache-89;
}
}
server_name img.aslibra.com;
location / {
rewrite ^(.*) /$http_host$1 break;
proxy_set_header Host html.aslibra.com;
proxy_pass http://cache-89;
}
}
但这样访问目录时如果没有以“/”结尾,则服务器会返回301redirect:
[root@aslibra ~]# curl -I http://img.aslibra.com/www
HTTP/1.1 301 Moved Permanently
Server: nginx/0.7.59
Date: Tue, 21 Jul 2009 15:28:58 GMT
Connection: keep-alive
Location: http://html.aslibra.com/img.aslibra.com/www/
HTTP/1.1 301 Moved Permanently
Server: nginx/0.7.59
Date: Tue, 21 Jul 2009 15:28:58 GMT
Connection: keep-alive
Location: http://html.aslibra.com/img.aslibra.com/www/
html.aslibra.com这个域名并非公布的域名,返回给客户端是会自然产生错误的
Nginx可以很好的处理这个问题:
server {
server_name img.aslibra.com;
location / {
rewrite ^(.*) /$http_host$1 break;
proxy_set_header Host html.aslibra.com;
proxy_pass http://cache-89;
proxy_redirect http://html.aslibra.com/img.aslibra.com/ /;
}
}
server_name img.aslibra.com;
location / {
rewrite ^(.*) /$http_host$1 break;
proxy_set_header Host html.aslibra.com;
proxy_pass http://cache-89;
proxy_redirect http://html.aslibra.com/img.aslibra.com/ /;
}
}
加一行proxy_redirect后,正常了:
[root@aslibra ~]# curl -I http://img.aslibra.com/www
HTTP/1.1 301 Moved Permanently
Server: nginx/0.7.59
Date: Tue, 21 Jul 2009 15:23:49 GMT
Content-Type: text/html
Location: http://img.aslibra.com/www/
Connection: keep-alive
Content-Length: 185
Expires: Tue, 21 Jul 2009 16:23:49 GMT
Cache-Control: max-age=3600
HTTP/1.1 301 Moved Permanently
Server: nginx/0.7.59
Date: Tue, 21 Jul 2009 15:23:49 GMT
Content-Type: text/html
Location: http://img.aslibra.com/www/
Connection: keep-alive
Content-Length: 185
Expires: Tue, 21 Jul 2009 16:23:49 GMT
Cache-Control: max-age=3600
就这么样就ok啦~
不过貌似不支持变量出现在地址里,这个就郁闷了,必须指定相应域名。
对于多个域名匹配的server,redirect设置不能写作'/'了,否则会用第一个域名作为redirect域名
可以写几个匹配规则:
proxy_redirect http://html.aslibra.com/img.aslibra.com/ http://img.aslibra.com/;
proxy_redirect http://html.aslibra.com/css.aslibra.com/ http://css.aslibra.com/;
proxy_redirect http://html.aslibra.com/css.aslibra.com/ http://css.aslibra.com/;
Nginx的代理功能很强大,主要体现在可以设置返给后端服务器的http头信息,这一点可以让我们方便的实现很多需求。
比如要做一个镜像,这个当然有可能是好事。
http://a.aslibra.com/s/main.jpg
我需要访问 http://b.aslibra.com/s/main.jpg 也是一样的内容呢?
利用缓存功能就可以了,以上例子还加上了简单破解防盗链的方法,就是加上正确的referer的头信息就可以了
upstream自己可以设定,修改了host的信息,使得相当于本地访问backend使用了要做镜像的域名。
同理,要多个域名是一样的内容是,那可以多个域名使用同样的server设定,简单的指定host值即可,不列举了。
比如要做一个镜像,这个当然有可能是好事。
http://a.aslibra.com/s/main.jpg
我需要访问 http://b.aslibra.com/s/main.jpg 也是一样的内容呢?
server {
server_name b.aslibra.com;
root /Data/webapps/b.aslibra.com;
error_page 404 = @fetch;
location @fetch {
internal;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_set_header Host a.aslibra.com;
proxy_set_header referer http://a.aslibra.com/;
proxy_pass http://backend;
root /Data/webapps/b.aslibra.com;
}
}
server_name b.aslibra.com;
root /Data/webapps/b.aslibra.com;
error_page 404 = @fetch;
location @fetch {
internal;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_set_header Host a.aslibra.com;
proxy_set_header referer http://a.aslibra.com/;
proxy_pass http://backend;
root /Data/webapps/b.aslibra.com;
}
}
利用缓存功能就可以了,以上例子还加上了简单破解防盗链的方法,就是加上正确的referer的头信息就可以了
upstream自己可以设定,修改了host的信息,使得相当于本地访问backend使用了要做镜像的域名。
同理,要多个域名是一样的内容是,那可以多个域名使用同样的server设定,简单的指定host值即可,不列举了。
升级一下Nginx,笔记一下:
升级后的信息:
参考资料:
Nginx中文文档 > 运行和控制 Nginx - 命令行参数和信号
wget http://sysoev.ru/nginx/nginx-0.7.59.tar.gz
tar xfz nginx-0.7.59.tar.gz
cd nginx-0.7.59
./configure --prefix=/Data/apps/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module \
&& make && make install
#平滑升级可执行程序,使用新的 nginx 可执行程序替换旧的
kill -USR2 `cat /Data/apps/nginx/logs/nginx.pid`
#你可以让旧进程停止工作
kill -QUIT `cat /Data/apps/nginx/logs/nginx.pid.oldbin`
#如果不需要完全停止旧进程,还希望恢复的,你必须发送 WINCH 信号给旧的主进程,然后,它的工作进程就将开始从容关闭
kill -WINCH `cat /Data/apps/nginx/logs/nginx.pid.oldbin`
tar xfz nginx-0.7.59.tar.gz
cd nginx-0.7.59
./configure --prefix=/Data/apps/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module \
&& make && make install
#平滑升级可执行程序,使用新的 nginx 可执行程序替换旧的
kill -USR2 `cat /Data/apps/nginx/logs/nginx.pid`
#你可以让旧进程停止工作
kill -QUIT `cat /Data/apps/nginx/logs/nginx.pid.oldbin`
#如果不需要完全停止旧进程,还希望恢复的,你必须发送 WINCH 信号给旧的主进程,然后,它的工作进程就将开始从容关闭
kill -WINCH `cat /Data/apps/nginx/logs/nginx.pid.oldbin`
升级后的信息:
[root@localhost nginx]# curl -I http://localhost
HTTP/1.1 403 Forbidden
Server: nginx/0.7.59
Date: Wed, 10 Jun 2009 15:04:14 GMT
Content-Type: text/html
Content-Length: 169
HTTP/1.1 403 Forbidden
Server: nginx/0.7.59
Date: Wed, 10 Jun 2009 15:04:14 GMT
Content-Type: text/html
Content-Length: 169
参考资料:
Nginx中文文档 > 运行和控制 Nginx - 命令行参数和信号




