配置 Nginx 实现常用功能
以下引自百度:
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx 的配置项很多,配置起来比较复杂。如果需要考虑更好的性能,则配置起来比较麻烦。现在就一些 Nginx 常用功能的配置做一些说明。
一个最简单的 nginx.conf 配置示例:
events {
# 需要保留这一个段落,可以为空
}
http {
server {
listen 127.0.0.1:8080;
location / {
root /data/webdir/test/;
}
}
}
启动 Nginx 后,访问 http://127.0.0.1:8080 ,如果 /data/webdir/test/index.html 文件存在的话,就会显示 index.html 内容,否则返回 404 。
主机名配置:
server_name www.test.com test.com server_name *.test.com server_name ~^\.test\.com$
URI 匹配
location = / {
# 完全匹配 =
# 大小写敏感 ~
# 忽略大小写 ~*
}
location ^~ /images/ {
# 前半部分匹配 ^~
# 可以使用正则,如:
# location ~* \.(gif|jpg|png)$ { }
}
location / {
# 如果以上都未匹配,会进入这里
}
根目录设置
location / {
root /data/webdir/test/;
}
别名设置
location /blog {
alias /data/webdir/test/blog/;
}
location ~ ^/blog/(\d+)/([\w-]+)$ {
# /blog/20141202/article-name
# -> /blog/20141202-article-name.md
alias /data/webdir/test/blog/$1-$2.md;
}
首页设置
index /html/index.html /php/index.php;
重定向页面设置
error_page 404 /404.html;
error_page 502 503 /50x.html;
error_page 404 =200 /1x1.gif;
location / {
error_page 404 @fallback;
}
location @fallback {
# 将请求反向代理到上游服务器处理
proxy_pass http://localhost:9000;
}
try_files 设置
try_files $uri $uri.html $uri/index.html @other;
location @other {
# 尝试寻找匹配 uri 的文件,失败了就会转到上游处理
proxy_pass http://localhost:9000;
}
location / {
# 尝试寻找匹配 uri 的文件,没找到直接返回 502
try_files $uri $uri.html =502;
}
过大或超长的 Post&Get 请求的时候,可适当调整下面的配置:
http {
...
client_body_buffer_size 10m;
client_max_body_size 300m;
...
}
反向代理
proxy_pass 将请求转发到有处理能力的端上,默认不会转发请求中的 Host 头部
location /blog {
prox_pass http://localhost:9000;
### 下面都是次要关注项
proxy_set_header Host $host;
proxy_method POST;
# 指定不转发的头部字段
proxy_hide_header Cache-Control;
proxy_hide_header Other-Header;
# 指定转发的头部字段
proxy_pass_header Server-IP;
proxy_pass_header Server-Name;
# 是否转发包体
proxy_pass_request_body on | off;
# 是否转发头部
proxy_pass_request_headers on | off;
# 显形/隐形 URI,上游发生重定向时,Nginx 是否同步更改 uri
proxy_redirect on | off;
}
在反向代理的实际应用中,我们比较多的是将一些反向代理的站点配置文件按端口或按站点进行拆分,然后再在 nginx.conf 中引用。如:
http {
...
...
server {
listen 80 default;
listen 8080 default;
listen 8081 default;
return 500;
}
include reverse_proxy_80.conf
include reverse_proxy_8080.conf
include reverse_proxy_8081.conf
}
在 reverse_proxy_80.conf 的配置是:
server {
listen 80;
server_name www.test.com;
charset utf-8;
access_log /var/log/nginx/www.test.com/access.log main;
error_log /var/log/nginx/www.test.com/error.log info;
location / {
# 如果代理前的端口与代理后的不一样,就要在这儿注明了,如把 www.test.com:8080 反向代理后为 www.test.com:80 ,那么在后面加“:8080”就可以了。
proxy_pass http://wwww.test.com;
proxy_set_header X-Real-IP $remote_addr;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
鸣谢:本文部分内容引自 http://blog.jobbole.com/108039/