raksmart活动促销

分享

写回答

发帖

Apache升级到了nginx的几个注意点

国外VPS云主机 国外VPS云主机 1854 人阅读 | 3 人回复

发表于 2009-2-14 18:40:36 | 显示全部楼层 |阅读模式

最近把整站从apache升级到了nginx,客户的站点大概有30台服务器大部分架构位
tomcat+apache,只有一个php页面。
以下是我升级遇到的几个问题的注意点:
1、当我们去访问服务器上的一个目录时候,他不会自动加上一个/ ,浏览器会给出改页无法打开的
错误,这个时候浏览器去取的地址实际上是upstream中所写的地址和端口或如果没有使用
upstream时 当使用localhost做servername时候 浏览器会去访问http://127.0.0.1/dir。
解决办法:
在每个虚拟主机的server定义中加上
if (-d $request_filename) {
                           rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
                }
注意 root字段的定义也一定要出现在server中 如果server中没有定义root 错误还将存在
例子:
server {
                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上跑 没问题)
如果有这个需求呢 就要做如下配置了
error_page   405 =200 @405;
                location @405 {
                proxy_pass      http://PROXY_STATIC;
        #        root /usr/local/nginx/html;
                }
把所有405错误重定向成200 然后吧所有405错误的请求全部交给一个代理去执行
或者写上本地路径,因为我的路径比较多 所以重定向请求到一台web服务器上了
4、关于防盗链
1.com的需求是不是从本来来的请求给除一个403
因为在虚拟主机里配置毫无作用 可能是我们用的是虚拟目录的缘故
所以我们直接对目录做的防盗链
在alias里
别名配置
                location /res/ {
                alias   /opt/Src/;
                valid_referers none blocked server_names *.1.com ;
                if ($invalid_referer) {
        return 403;
                }
        }
5、关于动态请求转发
location  ~ ^/login/(.*\.do)$ {
                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;
以上就是我要提到的几个基本的注意点 。

回答|共 3 个

bamboo

发表于 2009-2-14 18:44:16 | 显示全部楼层

十分感谢分享。  
这些东西都很好啊。

以三楼代码为例,请问你提到的第一个问题的那部分代码插入哪里比较好?

[ 本帖最后由 bamboo 于 2009-2-14 06:51 PM 编辑 ]

bamboo

发表于 2009-2-14 18:50:52 | 显示全部楼层

server
{
   listen       80;
   server_name  www.domain.com;
   index index.html index.htm index.php;
   root  /data0/htdocs/www;

   location ~ .*\.(php|php5)?$
   {      
     #fastcgi_pass  unix:/tmp/php-cgi.sock;
     fastcgi_pass  127.0.0.1:9000;
     fastcgi_index index.php;
     include fcgi.conf;
   }

   log_format  wwwlogs  '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $http_x_forwarded_for';
   access_log  /data1/logs/wwwlogs.log  wwwlogs;
}

jean

发表于 2009-2-15 19:39:23 | 显示全部楼层

回复 3# 的帖子

在server段就ok
您需要登录后才可以回帖 登录 | 注册

本版积分规则