本节主要内容:
apache升级到nginx时的注意事项。
问题1,当访问服务器上的一个目录时,不会自动加上一个/ ,浏览器会给出改页无法打开的错误,此时浏览器去取的地址实际上是upstream中所写的地址和端口或如果没有使用upstream时 当使用localhost做servername时候 浏览器会去访问http://127.0.0.1/dir。
解决办法:
在每个虚拟主机的server定义中加上
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
注意:
root字段的定义也一定要出现在server中,如果server中没有定义root 错误还将存在。
例子:
listen 800;
server_name www.1.com;
root /opt/1-index; //这边定义了 就会在目录访问的时候加上/ 如果这边没有定义这个 上面的url重写依然不会生效
include vhost/alias.conf;
include vhost/proxy.conf;
if (-d $request_filename) {
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
error_page 405 =200 @405;
location @405 {
proxy_pass http://PROXY_STATIC;
}
location / {
root /opt/1-index; //只在这边定义是没有用的,这边甚至可以不做定义
rewrite ^/(\d+)\.home$ /index.html?userId=$1 last;
index index.html index.htm;
}
问题2,url重写的注意事项:
原有的url支持正则 重写的url不支持正则
rewrite ^/(\d+)\.home$ /index.html?userId=$1 last;
这个重写中 ^/(\d+)\.home$ 这部分支持正则
而/index.html?userId=$1
不要用正则,也不匹配正则 /index.html?*userId=$1 这样就会去找.html?*userId=$1这个url,然后给予一个404 not found。
3,post方式去访问静态文件
Apache、IIS、Nginx等绝大多数web服务器,都不允许静态文件响应POST请求,否则会返回“HTTP/1.1 405 Method not allowed”错误。
(但是之前程序在apache上跑 没问题)
如果有此问题,则按如下配置操作:
location @405 {
proxy_pass http://PROXY_STATIC;
# root /usr/local/nginx/html;
}
把所有405错误重定向成200 然后吧所有405错误的请求全部交给一个代理去执行。
或写上本地路径。
4,防盗链
1.com的需求:不是从本来来的请求给除一个403。
因为在虚拟主机里配置毫无作用,也可能是虚拟机的原因。
直接对目录做的防盗链
在alias中,添加别名配置:
alias /opt/Src/;
valid_referers none blocked server_names *.1.com ;
if ($invalid_referer) {
return 403;
}
}
5,动态请求转发
proxy_pass http://login ;
proxy_set_header X-Real-IP $remote_addr;
}
~ ^/login/(.*\.do)$ #凡是匹配/login/ 下 .do的都转发到一个upstream池里处理。
此处的$符号并不起多大作用,只要是有.do的他会全部转,并不是以.do结尾的才转。
6,php上传文件大小的问题
除了要修改php中的配置,还要修改nginx的配置:
client_max_body_size 10M;
默认值是1M;
我所知道的注意点,就这几条了,希望可以帮助到有需要的朋友吧。
在使用Nginx做Web服务器时,如果没有处理好日志,日志文件可能会很迅速增长。
此时,可以修改nginx.conf 找到access_log:
error_log /dev/null;
日志就不会记录到具体的文件了,而是将全部的访问日志、错误日志输出到/dev/null设备文件中。
修改完,重启Nginx( kill -HUP `cat logs/nginx.pid` )即可。
您可能感兴趣的文章:
nginx 日志分析的实例学习
Nginx日志模块分析详解
Nginx日志分析 Nginx日志切割与Awstats配置
nginx日志配置、Nginx日志分割
有关nginx日志格式的设计分享
nginx日志统计访问时间的例子
nginx日志配置文件的格式说明
一个分割ngnix网站日志的Shell脚本
nginx日志报大量400错误的解决方法
nginx关闭favicon.ico日志记录的方法
nginx与apache日志格式的区别
nginx日志中记录cookie的实现方法
修改nginx访问日志的时间格式的方法
Nginx日志中过滤关键字的写法
nginx 日志分析实例
1、判断手机用户
一般通过User-Agent来判断,我的配置里加上了Java、curl和Wget,方便调试和其它内部项目的抓取。
现在很多手机网关没有发送User-Agent,所以大部分手机发送的User-Agent到了网关就被过滤掉了,相当于是空值。
User-Agent为空且为手机用户比例比较大。
有部分User-Agent为空的是一些蜘蛛或垃圾程序的造访,这些垃圾流量并不那么重要。
希望手机网关将来有相应的标准,不要发送空的User-Agent,就是发送一个字母也好啊。
如果应用有一个独立域名,也未必要做手机判断。譬如新浪有独立域名且深入人心,那它做不做跳转无关紧要。
nginx配置用穷举方式罗列各类手机User-Agent并把空User-Agent也转到手机应用里,非这些情况,则跳到帮助页面。
if ( $http_user_agent ~ "^((.*MIDP.*)|(.*WAP.*)|(.*UP.Browser.*)|(.*Smartphone.*)|(.*Obigo.*)|(.*Mobile.*)|(.*AU.Browser.*)|(.*wxd.Mms.*)|(.*WxdB.Browser.*)|(.*CLDC.*)|(.*UP.Link.*)|(.*KM.Browser.*)|(.*UCWEB.*)|(.*SEMC\-Browser.*)|(.*Mini.*)|(.*Symbian.*)|(.*Palm.*)|(.*Nokia.*)|(.*Panasonic.*)|(.*MOT\-.*)|(.*SonyEricsson.*)|(.*NEC\-.*)|(.*Alcatel.*)|(.*Ericsson.*)|(.*BENQ.*)|(.*BenQ.*)|(.*Amoisonic.*)|(.*Amoi\-.*)|(.*Capitel.*)|(.*PHILIPS.*)|(.*SAMSUNG.*)|(.*Lenovo.*)|(.*Mitsu.*)|(.*Motorola.*)|(.*SHARP.*)|(.*WAPPER.*)|(.*LG\-.*)|(.*LG/.*)|(.*EG900.*)|(.*CECT.*)|(.*Compal.*)|(.*kejian.*)|(.*Bird.*)|(.*BIRD.*)|(.*G900/V1.0.*)|(.*Arima.*)|(.*CTL.*)|(.*TDG.*)|(.*Daxian.*)|(.*DAXIAN.*)|(.*DBTEL.*)|(.*Eastcom.*)|(.*EASTCOM.*)|(.*PANTECH.*)|(.*Dopod.*)|(.*Haier.*)|(.*HAIER.*)|(.*KONKA.*)|(.*KEJIAN.*)|(.*LENOVO.*)|(.*Soutec.*)|(.*SOUTEC.*)|(.*SAGEM.*)|(.*SEC\-.*)|(.*SED\-.*)|(.*EMOL\-.*)|(.*INNO55.*)|(.*ZTE.*)|(.*iPhone.*)|(.*Android.*)|(.*Windows CE.*)|(Wget.*)|(Java.*)|(curl.*)|(Opera.*))$" )
{
set $ismob 1;
proxy_pass http://m.;
}
if ( $http_user_agent ~ ^$ )
{
set $ismob 1;
proxy_pass http://m.;
}
if ( $ismob = 0 )
{
rewrite "^.*$" http://help.m./ permanent;
}
2、Content-Type类型
手机浏览器和普通电脑访问页面有所不同,绝大多数手机不支持text/html这种Content-Type格式。
在web服务方面,除了要做出合适手机浏览的页面,另外一个重要的事情就是要把Content-Type弄对了。
一般手机使用的是text/vnd.wap.wml和application/xhtml+xml,听说text/vnd.wap.wml是老式手机专用,application/xhtml+xml是3g标准指定的Content-Type,另外charset需要指明为UTF-8。
所以,Content-Type类似如下:
对于动态页面,Content-Type可以在程序里设定。
譬如php:
jsp的话,把顶头的page做下修改即可。
动态程序中的设定,到了nginx上默认会继承,所以不用太多考虑。
nginx要做的一个是静态页面,另一个是302跳转。
静态页面的Content-Type改起来不麻烦,修改mime.types:
application/xhtml+xml xml;
把需要的扩展名对应的类型改一改就好了。
然后,在nginx.conf里指定charset UTF-8。
麻烦的是301和302跳转,nginx中使用rewrite的redirect和permanent跳转时,Content-Type怎么改都会是text/html,使用add_header,Content-Type变成了两行,没能达成目的。
用代理到动态程序固然行,但性能和稳定性又成了问题。
最后查阅了nginx源码,发现这个text/html是写死的……
修改c代码:
这里调试的是nginx 0.7.30版的,文件:
568 //r->headers_out.content_type_len = sizeof("text/html") - 1;
569 //r->headers_out.content_type.len = sizeof("text/html") - 1;
570 //r->headers_out.content_type.data = (u_char *) "text/html";
把568 569 570这三行代码注释掉,就可以让nginx跳转时不发送Content-Type。
在电脑的IE/FF浏览器上没有Content-Type也能正常跳转。
必要的话,可以写上Content-Type,可以使用add_header定义:
手机的content-type类型为: