網頁

2013年12月20日 星期五

Ubuntu佈署 反向代理 Nginx (Tomcat+Mysql+PHP)


佈署反向代理 Nginx

什麼是Nginx呢?
Nginx 是一個類似 Apache 的 Server 平台。
相信不少人都有使用 Apache Server  的經驗
也有使用過 Tomcat 的經驗,並知道一個跑 80 port 一個是 8080 port
那一定有人會想說 不想讓 User 去記那麼多 port 有什麼方法呢?

有! 透過 Nginx 來做反向代理,User 只需要打 URL , port 部份 由 Server 收到後自行轉換


執行環境先確定是否有run apache 環境,可以先關閉。
sudo service apache2 stop


1. Nginx

安裝
sudo apt-get install nginx

啟動 Nginx
sudo service nginx start

透過Browser開啟
http://localhost/
確認 Nginx是否啟動 (顯示 Welcome to Nginx!)

關閉Nginx
sudo service nginx stop

2.PHP

安裝PHP相關套件
sudo apt-get install php5 php5-gd php5-cli php5-cgi php5-fpm php5-mysql php5-mcrypt
設定Nginx
sudo vim /etc/nginx/sites-available/default
修改 root那行指向的位置 通常是
root /var/www
修改 index那行
index index.html index.htm index.php
在底下加入
location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi_params;
        }
若系統是 Ubuntu 12.10 (含以上)
則 fastcgi_pass 127.0.0.1:9000; 需改為
fastcgi_pass unix:/var/run/php5-fpm.sock; 才會動作

測試是否成功
在/var/www 資料夾新增一筆檔案 test.php 內容如下
<?php phpinfo();?>
啟動Nginx 並測試是否成功顯示
sudo service nginx start
http://localhost/test.php
如果有出現PHP資訊代表成功,關閉Nginx
sudo service nginx stop

3.MySQL

安裝
sudo apt-get install mysql-server
安裝過程中會要求root密碼

測試
mysql -u root -p
輸入密碼,若登入成功 可 quit 或 exit 離開

MySQL 管理套件 phpMyAdmin
phpMyAdmin官方下載最新的包 解開丟到/var/www
這邊就不作 累述

4.Tomcat

安裝
到官方下載package包 解開丟入 /opt/tomcat7
sudo tar zxvf apache-tomcat-7.0.47.tar.gz
sudo mv apache-tomcat-7.0.47 /opt/tomcat7
啟動並測試
sudo /opt/tomcat7/bin/startup.sh
http://localhost:8080
看到tomcat 貓貓管理頁面代表成功

關閉Tomcat
sudo /opt/tomcat7/bin/shutdown.sh
整合Nginx
修改 server.xml
sudo vim /opt/tomcat7/conf/server.xml
<Host name="localhost"  appBase="webapps"...部份改為
<Host name="localhost"  appBase="/var/www" //非必要 只是將專案位置更改而已
修改nginx下proxy_params:
sudo vim /etc/nginx/proxy_params
完整內容如下
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size       4k;
proxy_buffers           4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
修改nginx配置
sudo vim /etc/nginx/sites-available/default
index行改為
index index.html index.htm index.php index.jsp
添加location
location ~ \.jsp$ {
                index index.jsp;
                proxy_pass http://localhost:8080;
                include proxy_params;
        }
測試
在/var/www/資料夾下 新增一筆 index.jsp
sudo mkdir -p /var/www/jsp
sudo vim /var/www/jsp/index.jsp
輸入
<HTML>
        <BODY>
          <%
             out.println("IP:");
             out.println(request.getHeader("x-forwarded-for"));
          %>
        <BODY/>
<HTML/>
啟動Nginx 和Tomcat並測試
sudo /opt/tomcat7/bin/startup.sh
sudo service nginx start
http://localhost/jsp/
有顯示出IP情形代表成功

Tomcat 在佈署上 很容易發生 outOfmemory 可參考
http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/

5.個人使用經驗

相信有在使用Tomcat的人應該會有使用.war檔來Deploy的經歷
其實在Tomcat default設定中有 auto Deploy
所以只要 把war檔丟入 /var/www中就會自動佈署

但是!如果你還是想要管理介面 那將tomcat底下webapp所有資料cp到/var/www下
sudo cp -r /opt/tomcat7/webapps/* /var/www/
http://localhost:8080 此時就會看到管理頁了
而在佈署需要透過 servlet 或 會經由 web.xml 去控制的專案
可能會有控制權被 Nginx 吃掉的情形
此時可以新增 location 把控制全丟給project本身 只需要指定他run在8080 port就好

修改
sudo vim /etc/nginx/sites-available/default

新增
location /projectname/  {
                proxy_pass      http://localhost:8080;
                proxy_redirect  off;
                proxy_pass_request_headers on;
                include proxy_params;
        }
重啟Nginx
sudo service nginx restart
Done.

參考文章:

1 則留言:

  1. 知道 Nginx proxt 這東西許久了,沒想到有個「反向代理」的說法,又上了一課啊!

    回覆刪除