从apache迁移到nginx的几个心得

发布于 2022-10-15 08:33:27 字数 3953 浏览 23 评论 0

从apache迁移到nginx的几个心得

我们的网站是lvs->apache->tomcat架构的 现在已经全面转换成lvs->nginx->tomcat架构
以下是我在迁移中遇到的几个问题  欢迎大家指正

1. 访问目录不能自动加上/
当我们去访问服务器上的一个目录时候,他不会自动加上一个/ ,浏览器会给出改页无法打开的错误,这个时候浏览器去取的地址实际上是upstream中所写的地址和端口或如果没有使用upstream时 他就会去访问servername中设置的内容 比如 我设置的是localhost  浏览器会去访问http://127.0.0.1/dir
解决办法
在每个虚拟主机的server定义中加上

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

复制代码注意 root字段的定义也一定要出现在server中 如果server中没有定义root 错误还将存在
例子:

  1. server {
  2.   listen  800;
  3.   server_name www.d1xn.com;
  4.   root   /opt/index;              //这边定义了 就会在目录访问的时候加上/  如果这边没有定义这个 上面的url重写依然不会生效
  5.   include  vhost/alias.conf;
  6.   include  vhost/proxy.conf;
  7.   if (-d $request_filename) {
  8.       rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
  9.   }
  10.   error_page   405 =200 @405;
  11.   location @405 {
  12.   proxy_pass      http://PROXY_STATIC;
  13.   }
  14.   location / {
  15.    root   /opt/index;                       //只在这边定义是没有用的
  16.    rewrite ^/(\d+)\.home$ /ZONE/index.html?userId=$1 last;
  17.    index  index.html index.htm;
  18.   }   

复制代码2.URL重写的注意事项:
原有的url支持正则  重写的url不支持正则
rewrite ^/(\d+)\.home$ /ZONE/index.html?userId=$1 last;
这个重写中 ^/(\d+)\.home$ 这部分支持正则
而/ZONE/index.html?userId=$1
不要用正则 也不匹配正则 /ZONE/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上跑 没问题)
如果有这个需求呢 就要做如下配置了

  1. error_page   405 =200 @405;
  2.   location @405 {
  3.   proxy_pass      http://PROXY_STATIC;
  4. # root /usr/local/nginx/html;
  5.   }

复制代码把所有405错误重定向成200 然后吧所有405错误的请求全部交给一个代理去执行
或者写上本地路径,因为我的路径比较多 所以重定向请求到一台web服务器上了

4. 关于防盗链
第一虚拟网的需求是 不是从本地来的请求给除一个403
因为在虚拟主机里配置毫无作用 可能是我们用的是虚拟目录的缘故
所以我们直接对目录做的防盗链
在alias里
别名配置

  1. location /res/ {
  2.                 alias   /opt/src/;
  3.                 valid_referers none blocked server_names *.d1xn.com   *.woniu.com;
  4.                 if ($invalid_referer) {
  5.      return 403;
  6.                 }
  7.         }

复制代码5,关于动态请求转发

  1. location  ~ ^/login/(.*\.do)$ {
  2.                 proxy_pass      http://login ;
  3.     proxy_set_header  X-Real-IP  $remote_addr;
  4. }

复制代码~ ^/login/(.*\.do)$ 这个表示 凡是匹配/login/ 下 .do的都转发到一个upstream池里处理 这里的$符号并不起多大作用 只要是有.do的他会全部转 并不是以.do结尾的才转

以上就是我遇到的问题及其解决办法

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

方圜几里 2022-10-22 08:33:27

本帖最后由 realcriss 于 2011-04-26 17:28 编辑

多谢这种经验分享。。

请教下,当apache有大量的(几百个)vhost虚机配置文件,请教下如何能快捷、准确的转成nginx 虚机格式? 多谢

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文