Nginx是一個高性能的自由、開源的HTTP和反向代理服務器,特色是***佔用內存少***,併發性能強。css
[root@localhost nginx-1.12]# ls -l
總用量 2956
-rw-r--r--. 1 root root 981687 12月 21 16:09 nginx-1.12.2.tar.gz
-rw-r--r--. 1 root root 2041593 12月 21 16:09 pcre-8.37.tar.gz
複製代碼
nginx-1.12.2.tar.gz
:nginx源碼包,用於安裝Nginxhtml
pcre-8.37.tar.gz
:Perl庫, 是一個用C語言編寫的正則表達式函數庫 。java
[root@localhost nginx-1.12]# tar zxf pcre-8.37.tar.gz
複製代碼
[root@localhost pcre-8.37]# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether make supports nested variables... (cached) yes
checking for style of include used by make... GNU
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/root/nginx-1.12/pcre-8.37': configure: error: no acceptable C compiler found in $PATH See `config.log' for more details
複製代碼
若是出現上述錯誤,表示咱們沒有C的編譯器,須要安裝gcc/gcc-c++(gcc是C的編譯器,gcc-c++是C++的編譯器)linux
root@localhost pcre-8.37]# yum install gcc gcc-c++ -y
複製代碼
[root@localhost pcre-8.37]# ./configure
[root@localhost pcre-8.37]# make && make install
複製代碼
./configure:會檢查當前系統的相關配置,也能夠經過參數指定相關配置參數nginx
make:編譯c++
make install:安裝web
若是以上操做沒有報錯,表示編譯安裝完成正則表達式
#執行pcre-config --version可用回顯版本號,則表示pcre安裝成功
[root@localhost pcre-8.37]# pcre-config --version
8.37
複製代碼
[root@localhost pcre-8.37]# yum install -y make zlib zlib-devel libtool openssl openssl-develb
複製代碼
[root@localhost nginx-1.12]# tar zxf nginx-1.12.2.tar.gz
複製代碼
[root@localhost nginx-1.12]# ls
apache-tomcat-7.0.70.tar.gz nginx-1.12.2 nginx-1.12.2.tar.gz pcre-8.37 pcre-8.37.tar.gz
[root@localhost nginx-1.12]# cd nginx-1.12.2
[root@localhost nginx-1.12.2]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
[root@localhost nginx-1.12.2]# ./configure
[root@localhost nginx-1.12.2]# make && make install
複製代碼
./configure:會檢查當前系統的相關配置,也能夠經過參數指定相關配置參數算法
make:編譯數據庫
make install:安裝
#/usr/local/nginx:nginx源碼安裝的默認路徑
[root@localhost nginx-1.12.2]# cd /usr/local/nginx/sbin/
#nginx:nginx的二進制文件,用於啓動、中止服務、從新加載配置文件等
[root@localhost sbin]# ./nginx
複製代碼
經過ps -aef | grep nginxf發現相關進程已存在
[root@localhost sbin]# ps -aef | grep nginx
root 24981 1 0 17:16 ? 00:00:00 nginx: master process ./nginx
nobody 24982 24981 0 17:16 ? 00:00:00 nginx: worker process
root 24985 9621 0 17:18 pts/1 00:00:00 grep --color=auto nginx
複製代碼
經過netstat -tualnp發現nginx正在監聽80端口
訪問nginx服務器80端口,測試Nginx是否能夠正常訪問
若是出現上述狀況,則是由於防火牆過濾引發的,此時能夠經過增長80端口的規則列表,或者關閉防火牆便可解決。
firewall-cmd:查看防火牆
關於firewall-cmd命令可參考: wangchujiang.com/linux-comma…
[root@localhost sbin]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
複製代碼
# 添加80端口到防火牆規則中
[root@localhost sbin]# firewall-cmd --permanent --add-port=80/tcp
success
# 從新載入防火牆,不會中斷已經創建的鏈接
[root@localhost sbin]# firewall-cmd --reload
success
複製代碼
# 中止防火牆
[root@localhost sbin]# systemctl stop firewalld
# 禁止防火牆的開機自啓
[root@localhost sbin]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
複製代碼
再次訪問nginx服務器80端口,此時Nginx能夠正常訪問
或者經過curl nginx服務器的ip地址,也能夠測試
[root@localhost sbin]# curl 192.168.245.130
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
複製代碼
注意:nginx的命令操做,默認必須在nginx的安裝目錄下的sbin目錄中操做(能夠經過配置環境變量解決) 默認位置在**/usr/local/nginx/sbin**下
若是不知道nginx的目錄位置,可使用whereis命令獲取
[root@localhost sbin]# whereis nginx
nginx: /usr/local/nginx
複製代碼
[root@localhost sbin]# ./nginx -v
nginx version: nginx/1.12.2
複製代碼
[root@localhost sbin]# ./nginx
複製代碼
[root@localhost sbin]# ./nginx -s stop
複製代碼
[root@localhost sbin]# ./nginx -s reload
複製代碼
nginx的主配置文件位於:/usr/local/nginx/conf/nginx.conf
從配置文件開始到events塊之間的內容,主要設置一些影響nginx服務器總體運行時的配置指令。
#user nobody;
#worker_processes:值越大,可處理的併發數據量也就越多
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
複製代碼
nginx服務器與用戶的網絡鏈接配置信息
#worker_connections:nginx支持的最大鏈接數
events {
worker_connections 1024;
}
複製代碼
用於代理、緩存和日誌等相關功能和第三方模塊的配置。好比咱們常說的反向代理、負載均衡等等,都是經過配置http塊實現的。http塊中又包含http全局塊和server塊。
http全局塊
包含文件引入、MIME-TYPE定義、日誌自定義、鏈接超時時間、單連接請求數上限等內容。
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
複製代碼
server塊
每一個http塊能夠包含多個server塊,每一個server塊至關於一個虛擬主機。
虛擬主機:能夠理解爲經過nginx將一個物理的服務器(nginx服務器),經過server塊的方式劃分爲多個虛機服務器對用戶提供訪問。
server {
#server全局塊
#配置虛擬主機的監聽配置和虛擬主機的名稱和IP配置
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#location塊
#根據接收到的請求字符串對虛擬主機名稱以外的字符串進行匹配,
#對特定的請求進行處理、地址重定向、數據緩存和應答控制等功能
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
複製代碼
反向代理是指以代理服務器來接收來自互聯網上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從內部服務器上獲得的結果經過代理服務器返回給來自互聯網上請求鏈接的客戶端,此時代理服務器對外的表現形式就是一個反向代理服務器。
好比咱們(用戶)去租房子(Web服務器),一般狀況下都是經過平臺(代理服務器)去租。這個時候咱們是跟平臺去聯繫的,並不知道房東是誰。還有一種多是房東委託本身的朋友去管理,這個時候跟咱們聯繫的也不是房東本人,而是他的朋友(代理服務器),這個過程就叫反向代理。而房東的朋友也就承擔了「代理服務器」的這個角色。
需求:
訪問
192.168.245.130:80
端口,代理到192.168.245.131:8080
端口
1. 安裝JDK(tomcat須要依賴於JDK環境)
JDK是Java語言的軟件開發工具包,JDK是整個java開發的核心,它包含了JAVA的運行環境(JVM+Java系統類庫)和JAVA工具。
安裝JDK,由於Tomcat須要JDK的環境支持
[root@nginx-02 ~]# ls -l
總用量 196020
-rw-r--r--. 1 root root 9830232 12月 22 15:40 apache-tomcat-8.0.33.zip
-rw-r--r--. 1 root root 190890122 12月 22 15:41 jdk-8u171-linux-x64.tar.gz
複製代碼
jdk-8u171-linux-x64.tar.gz
到/usr/local
目錄中[root@nginx-02 ~]# tar zxf jdk-8u171-linux-x64.tar.gz -C /usr/local/
[root@nginx-02 jdk1.8.0_171]# pwd
/usr/local/jdk1.8.0_171
[root@nginx-02 jdk1.8.0_171]# ls -l
總用量 25964
drwxr-xr-x. 2 10 143 4096 3月 29 2018 bin
-r--r--r--. 1 10 143 3244 3月 29 2018 COPYRIGHT
drwxr-xr-x. 4 10 143 122 3月 29 2018 db
drwxr-xr-x. 3 10 143 132 3月 29 2018 include
-rw-r--r--. 1 10 143 5203779 3月 29 2018 javafx-src.zip
drwxr-xr-x. 5 10 143 185 3月 29 2018 jre
drwxr-xr-x. 5 10 143 245 3月 29 2018 lib
-r--r--r--. 1 10 143 40 3月 29 2018 LICENSE
drwxr-xr-x. 4 10 143 47 3月 29 2018 man
-r--r--r--. 1 10 143 159 3月 29 2018 README.html
-rw-r--r--. 1 10 143 424 3月 29 2018 release
-rw-r--r--. 1 10 143 21098592 3月 29 2018 src.zip
-rw-r--r--. 1 10 143 106782 3月 29 2018 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r--. 1 10 143 145180 3月 29 2018 THIRDPARTYLICENSEREADME.txt
複製代碼
/etc/profile
配置JAVA環境變量,在尾部加入如下內容# 配置JAVA環境變量
export JAVA_HOME=/usr/local/jdk1.8.0_171
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
複製代碼
[root@nginx-02 ~]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
[root@nginx-02 ~]# javac -version
javac 1.8.0_171
複製代碼
2. 安裝Tomcat
Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器, 一般用於部署Java語言編寫的網站應用。
/usr/local/
目錄#查看該目錄下面是否存在tomcat文件
[root@nginx-02 ~]# ls
apache-tomcat-8.0.33.zip jdk-8u171-linux-x64.tar.gz
#安裝unzip工具命令
[root@nginx-02 ~]# yum install -y unzip
#使用unzip命令解壓tomcat安裝文件到/usr/local目錄下
[root@nginx-02 ~]# unzip apache-tomcat-8.0.33.zip -d /usr/local/
#進入/usr/local目錄
[root@nginx-02 ~]# cd /usr/local/
#查看是否存在解壓後的tomcat文件目錄
[root@nginx-02 local]# ls
apache-tomcat-8.0.33 bin etc games include jdk1.8.0_171 lib lib64 libexec sbin share src
#爲apache-tomcat目錄下的全部文件執行755權限
[root@nginx-02 local]# chmod 755 -R apache-tomcat-8.0.33/
#進入tomcat目錄下的bin目錄
[root@nginx-02 local]# cd apache-tomcat-8.0.33/bin/
[root@nginx-02 bin]# ls
bootstrap.jar catalina-tasks.xml configtest.bat digest.bat setclasspath.sh startup.bat tomcat-native.tar.gz version.bat
catalina.bat commons-daemon.jar configtest.sh digest.sh shutdown.bat startup.sh tool-wrapper.bat version.sh
catalina.sh commons-daemon-native.tar.gz daemon.sh setclasspath.bat shutdown.sh tomcat-juli.jar tool-wrapper.sh
#使用bash命令運行startup.sh腳本,啓動tomcat服務器
[root@nginx-02 bin]# bash startup.sh
Using CATALINA_BASE: /usr/local/apache-tomcat-8.0.33
Using CATALINA_HOME: /usr/local/apache-tomcat-8.0.33
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-8.0.33/temp
Using JRE_HOME: /usr/local/jdk1.8.0_171/jre
Using CLASSPATH: /usr/local/apache-tomcat-8.0.33/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.33/bin/tomcat-juli.jar
Tomcat started.
#監測logs目錄下catalina.out文件的日誌內容,查看是否有報錯信息,沒有則表示啓動成功
[root@nginx-02 bin]# tail -100f ../logs/catalina.out
複製代碼
看到以上內容表示tomcat已成功啓動
若是內容沒法正常顯示,通常爲防火牆問題,執行下面代碼,從新刷新訪問便可
#將8080端口加入防火牆規則列表
[root@nginx-02 bin]# firewall-cmd --add-port=8080/tcp --permanent
success
#從新載入防火牆配置文件
[root@nginx-02 bin]# firewall-cmd --reload
success
複製代碼
3. 配置Nginx反向代理
說明:
主機nginx-01爲nginx服務器 IP:192.168.245.130
主機nginx-02爲Tomcat服務器 IP:192.168.245.131
瀏覽器訪問主機nginx-01(192.168.245.130)80端口,代理到主機nginx-02(192.168.245.131)8080端口,瀏覽器顯示nginx-02(192.168.245.131)的tomcat內容,表示反向代理成功
複製代碼
vim /usr/local/nginx/conf/nginx.conf
複製代碼
#配置server,能夠理解爲一個虛擬主機
server {
#監聽端口
listen 80;
#監聽主機
server_name 192.168.245.130;
#路徑位置
location / {
root html;
index index.html index.htm;
#被代理的服務器,tomcat服務器地址
proxy_pass http://192.168.245.131:8080/;
}
}
複製代碼
[root@nginx-01 sbin]# ls
nginx
[root@nginx-01 sbin]# ./nginx -s reload
複製代碼
訪問nginx-01(192.168.245.130),查看瀏覽器效果
需求:
訪問
192.168.245.130/house
代理到192.168.245.131:8080/house
訪問
192.168.245.130/food
代理到192.168.245.132:8090/food
nginx-0二、nginx-03安裝Tomcat和JDK
這個在案列一已經詳細說明了,在此再也不重複。
在nginx-0二、nginx-03配置站點目錄
若是是在同服務器部署多個Tomcat,爲了不端口衝突,是須要修改Tomcat的對外訪問端口8080;
若是是在不一樣的服務器部署Tomcat,就不會存在端口的衝突問題,那麼端口也就能夠不用修改了,固然若是你想修改,也是能夠的;
[root@nginx-03 conf]# pwd
/usr/local/apache-tomcat-8.0.33-8090/conf
[root@nginx-03 conf]# vim server.xml
複製代碼
nginx-02
nginx-03
配置nginx反向代理
server {
# 監聽端口
listen 80;
# 表示監聽本地主機,建議寫Ip地址
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
# 當請求的url中包含house的內容時,代理到http://192.168.245.131:8080/house站點中
location ~ /house {
proxy_pass http://192.168.245.131:8080;
}
# 當請求的url中包含food的內容時,代理到http://192.168.245.132:8090/food站點中
location ~ /food {
proxy_pass http://192.168.245.132:8090;
}
}
複製代碼
語法:
location [= | ~ | ~* | ^~ | ^~] uri {
}
複製代碼
*注意:若是uri包含正則表達式,則必需要有~或者~標識。
nginx.conf
配置文件,使配置生效[root@nginx-01 sbin]# ./nginx -s reload
複製代碼
192.168.245.130/house
返回192.168.245.131:8080/house
192.168.245.130/food
返回192.168.245.132:8090/food
負載平衡(Load balancing)是一種計算機技術,用來在多個計算機(計算機集羣)、網絡鏈接、CPU、磁盤驅動器或其餘資源中分配負載,以達到最優化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。 使用帶有負載平衡的多個服務器組件,取代單一的組件,能夠經過冗餘提升可靠性。負載平衡服務一般是由專用軟件和硬件來完成。 主要做用是將大量做業合理地分攤到多個操做單元上進行執行,用於解決互聯網架構中的高併發和高可用的問題。
引用於《維基百科》
舉個例子:好比某飯店爲了提高飯店的服務能力,飯店可能會僱傭多個廚師,而這些廚師就組成了一個廚師集羣。而當用戶在店內點菜的時候,就須要一個專業人員可以把全部客戶的菜單均勻的分配給店內的廚師。這樣才能最大程度的提高飯店的服務能力。
需求:訪問nginx-01(192.168.245.130:80)將流量均衡到nginx-02(192.168.245.131:8080)和nginx-03(192.168.245.132:8080)
upstream tomcatserver{
server 192.168.245.131:8080;
server 192.168.245.132:8080;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://tomcatserver;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
複製代碼
nginx爲了方便咱們解決負載問題,提供了幾種負載均衡的算法模式,使咱們能夠根據需求場景去選擇負載均衡的方式。
upstream tomcatserver{
server 192.168.245.131:8080;
server 192.168.245.132:8080;
server 192.168.245.133:8080;
server 192.168.245.134:8080;
}
複製代碼
輪詢算法是nginx實現負載均衡的默認算法。輪詢策略按照順序選擇組內(upstream模塊配置的服務器節點)服務器處理請求。若是一個服務器在處理請求的過程當中出現錯誤,請求會被按照順序依次交給組內的下一個服務器進行處理,依次類推,直到返回正常的響應爲止。若是全部的組內服務器都出現錯誤,則返回最後一個服務器的處理結果。
upstream tomcatserver{
server 192.168.245.131:8080 weight=5;
server 192.168.245.132:8080 weight=3;
server 192.168.245.133:8080;
server 192.168.245.134:8080;
}
複製代碼
爲upstream組內的服務器設置權重,權重值高的服務器被優先用於處理請求。此時組內服務器的選擇策略爲加權輪詢。組內全部服務器的權重值默認爲1,即採用輪詢的方式處理請求。
upstream tomcatserver{
ip_hash;
server 192.168.245.131:8080;
server 192.168.245.132:8080;
server 192.168.245.133:8080;
server 192.168.245.134:8080;
}
複製代碼
ip_hash用於實現會話保持功能,將某個客戶端的屢次請求重定向到組內同一臺服務器上,保證客戶端與服務器之間創建穩定的會話。只有當服務器處於無效的狀態時(down機),客戶端請求才會被下一個服務器接收和處理。注意:使用ip_hash後不能使用weight;
upstream tomcatserver{
fair;
server 192.168.245.131:8080;
server 192.168.245.132:8080;
server 192.168.245.133:8080;
server 192.168.245.134:8080;
}
複製代碼
按照upstream組內服務器的響應時間來分配請求,響應時間短的優先分配,須要第三方模塊的支持。
談動靜分離以前,先說一下什麼是動,什麼是靜。
通常網站能夠分爲靜態網站、動態網站。靜態網站是指不須要去訪問數據庫資源的網站,一般稱爲靜態網站。須要經過去查詢數據庫獲取數據庫的,咱們通常稱爲動態網站,動態網站可不是網站上能夠動的動畫效果的網站就是動態網站哈。
動靜分離的好處
- api接口服務化:動靜分離以後,後端應用更爲服務化,只須要經過提供api接口便可,能夠爲多個功能模塊甚至是多個平臺的功能使用,能夠有效的節省後端人力,更便於功能維護。
- 先後端開發並行:先後端只須要關心接口協議便可,各自的開發相互不干擾,並行開發,並行自測,能夠有效的提升開發時間,也能夠有些的減小聯調時間 。
- 減輕後端服務器壓力,提升靜態資源訪問速度:後端不用再將模板渲染爲html返回給用戶端,且靜態服務器能夠採用更爲專業的技術提升靜態資源的訪問速度。
- 動靜分離後, 即便動態服務不可用, 但靜態資源不會受到影響
爲了更好的模擬動靜分離的效果。咱們的需求以下:
- 訪問nginx(192.168.245.130)時,經過nginx代理訪問咱們的後端tomcat。
- 訪問靜態資源(192.168.245.130/index.html)時,訪問nginx上的靜態資源站點
- tomcat作tomcat集羣,避免因單臺tomcat死掉後,形成其餘tomcat服務不可用。
- tomcat所有死掉,靜態頁面也能夠正常訪問。
配置tomcat服務,使用tomcat7和tomcat8用來模擬後端
配置靜態服務
nginx的源碼安裝默認靜態資源目錄通常在
/usr/local/nginx/html
目錄下,在目錄下默認存放着Nginx的歡迎頁面文件
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
root /usr/local/nginx/html/food;
}
複製代碼
root指令用於指定資源目錄的位置,這裏的意思是匹配到請求的uri中若是包含html、gif、jpg、png等後綴的靜態資源文件時,去訪問
/usr/local/nginx/html/food
這個目錄下的資源。
攔截全部非靜態的資源請求,經過proxy_pass發送到名爲tomcatserver的upstream模塊進行負載均衡(默認使用輪詢策略),將請求轉發給後端tomcat服務器,實現負載和tomcat集羣。
至此,基本的動靜分離配置就完成了。
說明:
若是此時訪問經過nginx訪問後端服務若是發生以下狀況屬於正常現象。
緣由以下:訪問後端服務時,由於須要加載靜態資源文件,就觸發了靜態資源的訪問規則,這個時候就會去/usr/local/nginx/html/food
目錄下面找,但實際上tomcat所須要的靜態資源並不在該目錄下,因此就找不到該資源,頁面樣式資源文件找不到報404也就不足爲奇了。可是後端服務是能夠正常訪問的。一般狀況下動靜分離後的網站架構,後端只提供接口的訪問服務,這裏只是爲了演示效果。