⑴ 怎樣實現前端nginx後端apache
說明:
nginx處理靜態內容是把好手,apache雖然佔用內存多了點,性能上稍遜,但一直比較穩健。倒是nginx的FastCGI有時候會出現502
Bad Gateway錯誤。一個可選的方法是nginx做前端代理,處理靜態內容,動態請求統統轉發給後端apache。
本文就是實現Nginx作為前端,apache作為後端。當用戶訪問的是80埠的nginx,然後nginx將靜態內容留給自己,其餘的轉發給非80端
口的apache,apache處理完畢後再回傳給nginx。例如這里我分別訪問www.test.com/a.html,www.test.com
/info.php。nginx因為做前面,nginx的訪問日誌應該都有a.html,info.php的記錄;而apache作為後端,只處理php
請求,應該只有info.php的訪問記錄。
實現:
1.修改nginx配置文件,將php動態請求轉發給apache
# cat /usr/local/nginx/conf/vhosts/test.conf
server
{
listen 80;
server_name www.test.com test.com;
index index.html index.htm index.php default.html default.htm default.php;
root /home/www/data/test;
access_log /usr/local/nginx/logs/test-access.log;
# nginx找不到文件時,轉發請求給後端Apache
error_page 404 @proxy;
# 這是原來lnmp時,nginx自己將php請求提交到127.0.0.1:9000。現在由apache來處理,因此注釋掉這段。
#location ~ .*\.(php|php5)?$
#{
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# include fastcgi.conf;
#}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
# 動態文件.php請求轉發給後端Apache
location ~ \.php$ {
# 向後端伺服器發起請求時添加指定的header頭信息
proxy_set_header Host $http_host;
# 向後端伺服器發送真實 IP
proxy_set_header X-Real-IP $remote_addr;
# 讓後端如php能直接通過變數獲取真實IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
# nginx找不到文件時,轉發請求給後端Apache
location @proxy {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
}
然後只要開啟nginx監聽80埠,apache監聽8080埠,開啟php,就可以了。這邊,我同時開啟nginx,apache的訪問日誌。當我
訪問www.test.com/a.html,www.test.com/info.php時,nginx記錄下了所有a.html,info.html
的訪問請求。
nginx訪問日誌
192.168.45.30 - - [19/Jun/2013:14:41:06 +0800] "GET /a.html HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.45.30 - - [19/Jun/2013:14:41:06 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.45.30 - - [19/Jun/2013:14:41:08 +0800] "GET /info.php HTTP/1.1" 200 10518 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.45.30 - - [19/Jun/2013:14:41:08 +0800] "GET /info.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2158 "http://www.test.com/info.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.45.30 - - [19/Jun/2013:14:41:08 +0800] "GET /info.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2536 "http://www.test.com/info.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.45.30 - - [19/Jun/2013:14:41:08 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.45.30 - - [19/Jun/2013:14:41:09 +0800] "GET /info.php HTTP/1.1" 200 10518 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
當我訪問www.test.com/a.html,www.test.com/info.php時,apache只記錄了info.html的訪問請求。說明nginx將php請求轉發給了apache。這里可以看到來源都是127.0.0.1。而不是真實的來源ip。
apache訪問日誌
127.0.0.1 - - [19/Jun/2013:11:04:16 +0800] "GET /favicon.ico HTTP/1.0" 404 209
127.0.0.1 - - [19/Jun/2013:11:04:23 +0800] "GET /favicon.ico HTTP/1.0" 404 209
127.0.0.1 - - [19/Jun/2013:11:04:31 +0800] "GET /favicon.ico HTTP/1.0" 404 209
127.0.0.1 - - [19/Jun/2013:11:04:34 +0800] "GET /favicon.ico HTTP/1.0" 404 209
127.0.0.1 - - [19/Jun/2013:11:04:39 +0800] "GET /favicon.ico HTTP/1.0" 404 209
127.0.0.1 - - [19/Jun/2013:11:05:09 +0800] "GET /favicon.ico HTTP/1.0" 404 209
127.0.0.1 - - [19/Jun/2013:11:05:18 +0800] "GET /favicon.ico HTTP/1.0" 404 209
127.0.0.1 - - [19/Jun/2013:11:05:24 +0800] "GET /info.php HTTP/1.0" 200 55447
127.0.0.1 - - [19/Jun/2013:11:05:24 +0800] "GET /info.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.0" 200 2524
127.0.0.1 - - [19/Jun/2013:11:05:24 +0800] "GET /info.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.0" 200 2146
127.0.0.1 - - [19/Jun/2013:11:05:24 +0800] "GET /favicon.ico HTTP/1.0" 404 209
2.apache添加mod_rpaf, 獲取nginx轉發過來的真實IP
mod_rpaf模塊不是必須安裝,除非你需要開啟apache日誌,但有多此一舉之嫌,因為已經有nginx日誌了,再開apache日誌話就出現重復了。
Apache rpaf模塊作用是獲取Nginx轉發過來的真實IP,否則在Apache日子中來訪IP全部為127.0.0.1。
# wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
# tar zxvf mod_rpaf-0.6.tar.gz
# cd mod_rpaf-0.6
# /usr/local/www/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
安裝過程中,若出現error: 'conn_rec' has no member named
'remote_ip,請參考附錄1.mod_rpaf-2.0.c error: 'conn_rec' has no
member named 'remote_ip
# vim /usr/local/apache/conf/httpd.conf //在LoadMole後添加以下內容
LoadMole rpaf_mole moles/mod_rpaf-2.0.so
RPAFenable On
RPAFproxy_ips 127.0.0.1
RPAFsethostname On
RPAFheader X-Forwarded-For
下面是apache添加了mod_rpaf模塊後,apache的訪問日誌
192.168.45.30 - - [19/Jun/2013:14:41:09 +0800] "GET /info.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2158 "http://www.test.com/info.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.45.30 - - [19/Jun/2013:14:41:09 +0800] "GET /info.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2536 "http://www.test.com/info.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.45.30 - - [19/Jun/2013:14:41:09 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.45.30 - - [19/Jun/2013:14:41:09 +0800] "GET /info.php HTTP/1.1" 200 10520 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.45.30 - - [19/Jun/2013:14:41:09 +0800] "GET /info.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2536 "http://www.test.com/info.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
附錄:
附錄1.mod_rpaf-2.0.c error: 'conn_rec' has no member named
'remote_ip
mod_rpaf-2.0.c: In function 'rpaf_cleanup':
mod_rpaf-2.0.c:150: error: 'conn_rec' has no member named
'remote_ip'
mod_rpaf-2.0.c:151: error: 'conn_rec' has no member named
'remote_addr'
mod_rpaf-2.0.c:151: warning: implicit declaration of function
'inet_addr'
mod_rpaf-2.0.c:151: error: 'conn_rec' has no member named
'remote_ip'
mod_rpaf-2.0.c: In function 'change_remote_ip':
mod_rpaf-2.0.c:164: error: 'conn_rec' has no member named
'remote_ip'
mod_rpaf-2.0.c:183: error: 'conn_rec' has no member named
'remote_ip'
mod_rpaf-2.0.c:186: error: 'conn_rec' has no member named
'remote_ip'
mod_rpaf-2.0.c:187: error: 'conn_rec' has no member named
'remote_addr'
mod_rpaf-2.0.c:187: error: 'conn_rec' has no member named
'remote_ip'
apxs:Error: Command failed with rc=65536
只要將mod_rpaf-2.0.c的150、151、164、183、186、187這幾行的remote_ip修改成client_ip,remote_addr修改成client_addr,
然後再/usr/local/www/apache/bin/apxs -i -c -n mod_rpaf-2.0.so
mod_rpaf-2.0.c即可
⑵ docker快速搭建前端開發環境(2容器內運行與開發)
回顧上期,明哥打包好了一個前端鏡像
第一期內容回顧: https://www.jianshu.com/p/d7718adee07e
1.找到上回我們打包好的鏡像,啟動!
docker run -it -p3000:80 my_vue:2.0 /bin/bash
-p:埠映射:主機(宿主)埠:容器埠
我們訪問伺服器的3000埠實際上是訪問容器的80埠
還有印象的小夥伴應該記得test2是我們上次clone的vue項目
執行npm run build 得到dist文件夾
找到nginx配置文件中的server(虛擬主機) ps:居然還include文件。有點難找。。
將nginx虛擬主機網頁根目錄指向list
listen:虛擬主機的服務埠(默認80)
root:用於指定虛擬主機的網頁根目錄(改為指向dist)
try_files: 按順序檢查文件是否存在,返回第一個找到的文件
4. 重啟容器中的nginx(nginx -t排錯)
成功訪問到明哥的vue項目!
docker run -it -p宿主機埠:容器埠 -v宿主機文件夾:容器文件夾 my_vue:2.0 /bin/bash
我們-v綁定後,在本機中修改文件,容器中文件也會對應修改。
完結撒花!
⑶ 前端常用的幾種在線代碼編輯器各有什麼優勢
JS Bin - Collaborative JavaScript Debugging
介紹一款在線編輯器:jsbin jsbin的用法
優點:不需要登錄,即發即預覽
缺點:速度不靠譜
RunJS - 在線編輯、展示、分享、交流你的 JavaScript 代碼
優點:國內訪問速度快,可以上傳圖片(左下角)
缺點:需要登錄,用戶名
Create a new fiddle
優點:功能強大,歷史記錄給力,缺點:訪問速度慢
⑷ java web現在流行用什麼框架
主流 Java Web 開發框架有Spring 框架、MyBatis 框架、 Hibernate 框架、 Struts 2 框架等。
1、Spring 框架
Spring 框架是一個輕量級的框架,滲透了 Java EE 技術的方方面面。Spring 框架是由於軟體開發的復雜性而創建的,是一個開源框架。Spring 框架的用途不僅限於伺服器端的開發,從簡單性、可測試性和松耦合性角度而言,絕大部分 Java 應用都可以從 Spring 框架中受益。
2、MyBatis 框架
MyBatis 框架是一個優秀的數據持久層框架,可在實體類和 SQL 語句之間建立映射關系,是一種半自動化的 ORM 實現。Mybatis 的封裝性要低於 Hibernate 框架,且性能優異、簡單易學,因此應用較為廣泛。
3、Hibernate 框架
Hibernate 框架不僅是一個優秀的持久化框架,也是一個開放源代碼的對象關系映射框架。它對 JDBC 進行了輕量級的對象封裝,將 POJO 與資料庫表建立映射關系,形成一個全自動的 ORM 框架。Hibernate 框架可以自動生成 SQL 語句,且自動執行。
4、Struts 2 框架
Struts 2 框架以 WebWork 的優秀設計思想為核心,吸收 Struts 框架的部分優點,提供了一個更加簡潔的基於 MVC 設計模式實現的 Web 應用程序框架,它本質上相當於一個 Servlet。在 MVC 設計模式中,Struts 2 框架作為控制器(Controller)來建立模型與視圖的數據交互。
(4)bin前端框架擴展閱讀:
Java Web 開發框架應用要點:
搭建Java Web應用的開發環境-----部署Tomcat伺服器、用eclipse創建Server服務、構建Java Web項目、建立第一個JSP文件、 運行JSP文件。
第一個要點是掌握tomcat的安裝和部署。在Windows系統上安裝Tomcat相對簡單,下載壓縮包解壓縮到任意目錄即可(目錄名稱不要含有中文字元)。進入tomcat的bin目錄,可以直接運行startup.bat啟動tomcat服務。
第二個要點是在eclipse中添加Server服務。把tomcat與eclipse進行關聯,方便eclipse管理tomcat。
第三個要點是構建Java Web項目。Web項目開發的第一步就是要建立項目。在新建Project項目時,選擇Dynamic Web Project項目類型,即可創建Web項目。
第四個要點是建立的項目如何在Server中運行。選擇要運行的JSP文件,單擊右鍵,在彈出的菜單中選擇Run on Server命令即可,初次運行項目時,需要配置項目在哪個Server中運行(如有多個Server)。