歡迎您光臨本站 註冊首頁

從apache遷移到nginx的幾個心得

←手機掃碼閱讀     火星人 @ 2014-03-03 , reply:0

從apache遷移到nginx的幾個心得

從apache遷移到nginx的幾個心得


我們的網站是lvs->apache->tomcat架構的 現在已經全面轉換成lvs->nginx->tomcat架構
以下是我在遷移中遇到的幾個問題  歡迎大家指正

1. 訪問目錄不能自動加上/
當我們去訪問伺服器上的一個目錄時候,他不會自動加上一個/ ,瀏覽器會給出改頁無法打開的錯誤,這個時候瀏覽器去取的地址實際上是upstream中所寫的地址和埠或如果沒有使用upstream時 他就會去訪問servername中設置的內容 比如 我設置的是localhost  瀏覽器會去訪問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.d1xn.com;
  root   /opt/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/index;                       //只在這邊定義是沒有用的
   rewrite ^/(\d+)\.home$ /ZONE/index.html?userId=$1 last;
   index  index.html index.htm;
  }   



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上跑 沒問題)
如果有這個需求呢 就要做如下配置了
error_page   405 =200 @405;
  location @405 {
  proxy_pass      http://PROXY_STATIC;
# root /usr/local/nginx/html;
  }
把所有405錯誤重定向成200 然後吧所有405錯誤的請求全部交給一個代理去執行
或者寫上本地路徑,因為我的路徑比較多 所以重定向請求到一台web伺服器上了



4. 關於防盜鏈
第一虛擬網的需求是 不是從本地來的請求給除一個403
因為在虛擬主機里配置毫無作用 可能是我們用的是虛擬目錄的緣故
所以我們直接對目錄做的防盜鏈
在alias里
別名配置
  location /res/ {
                alias   /opt/src/;
                valid_referers none blocked server_names *.d1xn.com   *.woniu.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結尾的才轉

以上就是我遇到的問題及其解決辦法

[火星人 ] 從apache遷移到nginx的幾個心得已經有531次圍觀

http://coctec.com/docs/service/show-post-1990.html