Nginx是俄羅斯人編寫的十分輕量級的HTTP服務器,Nginx,它的發音爲「engine X」,是一個高性能的HTTP和反向代理服務器,同時也是一個iMaP/POP3/SMTP 代理服務器。Nginx是由俄羅斯人 igor Sysoev爲俄羅斯訪問量第二的 Rambler.ru站點開發的,它已經在該站點運行超過兩年半了。igor Sysoev在創建的項目時,使用基於BSD許可。php
Nginx:html
1> 輕量級,採用 C 進行編寫,一樣的 web 服務,會佔用更少的內存及資源;前端
2> 抗併發,nginx 以 epoll and kqueue 做爲開發模型,處理請求是異步非阻塞的,負載能力比 apache 高不少,而 apache 則是阻塞型的。在高併發下 nginx 能保持低資源低消耗高性能 ,而 apache 在 PHP 處理慢或者前端壓力很大的狀況下,很容易出現進程數飆升,從而拒絕服務的現象;node
3> nginx 處理靜態文件好,靜態處理性能比 apache 高三倍以上;mysql
4> nginx 的設計高度模塊化,編寫模塊相對簡單;nginx
5> nginx 配置簡潔,正則配置讓不少事情變得簡單,並且改完配置能使用 -t 測試配置有沒有問題,apache 配置複雜 ,重啓的時候發現配置出錯了,會崩潰;web
6> nginx 做爲負載均衡服務器,支持 7 層負載均衡;算法
7> nginx 自己就是一個反向代理服務器,並且能夠做爲很是優秀的郵件代理服務器;sql
8> 啓動特別容易, 而且幾乎能夠作到 7*24 不間斷運行,即便運行數個月也不須要從新啓動,還可以不間斷服務的狀況下進行軟件版本的升級;數據庫
9> 社區活躍,各類高性能模塊出品迅速。
apache:
1> apache 的 rewrite 比 nginx 強大,在 rewrite 頻繁的狀況下,用 apache;
2> apache 發展到如今,模塊超多,基本想到的均可以找到;
3> apache 更爲成熟,少 bug ,nginx 的 bug 相對較多;
4> apache 超穩定;
5> apache 對 PHP 支持比較簡單,nginx 須要配合其餘後端用;
6> apache 在處理動態請求有優點,nginx 在這方面是雞肋,通常動態請求要 apache 去作,nginx 適合靜態和反向。
總的來講
二者最核心的區別在於 apache 是同步多進程模型,一個鏈接對應一個進程,而 nginx 是異步的,多個鏈接(萬級別)能夠對應一個進程。通常來講,須要性能的 web 服務,用 nginx 。若是不須要性能只求穩定,更考慮 apache ,後者的各類功能模塊實現得比前者,例如 ssl 的模塊就比前者好,可配置項多。epoll(freebsd 上是 kqueue ) 網絡 IO 模型是 nginx 處理性能高的根本理由,但並非全部的狀況下都是 epoll 大獲全勝的,若是自己提供靜態服務的就只有寥寥幾個文件,apache 的 select 模型或許比 epoll 更高性能。固然,這只是根據網絡 IO 模型的原理做的一個假設,真正的應用仍是須要實測了再說的。
更爲通用的方案是,前端 nginx 抗併發,後端 apache 集羣,配合起來會更好。
簡單來講,集羣就是指一組相互獨立的計算機,利用高速通訊網絡組成的一個較大的計算機服務系統,每一個集羣節點都是運行各自服務的獨立服務器。這些服務器之間能夠彼此通訊,協同向用戶提供應用程序、系統資源和數據,並以單一系統的模式加以管理。當用戶客戶機請求集羣系統時,集羣給用戶的感受就是一個單一的服務器,而實際上用戶請求的是一組集羣服務器。
集羣主要包括幾大特色:高性能、價格有效性、可伸縮性、高可用性、透明性、可管理性和可編程性。
常見的負載均衡的架構包括有負載均衡集羣、高可用性集羣、高性能計算集羣等等。這裏着重介紹負載均衡集羣,其餘的集羣方式不作介紹。
負載均衡集羣爲企業提供了更爲實用、性價比更高的系統架構解決方案。負載集羣能夠把不少客戶集中的訪問請求負載壓力盡量平均分攤到計算機集羣中處理。客戶訪問請求負載均衡一般包含應用程序處理負載均衡和網絡流量負載。這樣的系統很是適合使用同一組應用程序爲大量用戶提供服務的模式,每一個節點均可以承當必定的訪問請求負載壓力,而且能夠實現訪問請求在各節點之間動態分配,以實現負載均衡。
負載均衡集羣運行時,通常是經過一個或多個前端負載均衡器將客戶訪問請求分發到後端的一組服務器上,從而達到整個系統的高性能和高可用性。通常高可用性集羣和負載均衡集羣使用相似的技術,或同時具備高可用與負載均衡的特色。負載均衡的做用爲:分擔用戶訪問及數據流量、保持業務的連續性、應用於Web業務及數據庫從庫等服務器的業務。
互聯網企業中常見的開源集羣軟件有:Nginx、lVS、Haproxy、Keepalived等,硬件有F五、Netscaler等。
嚴格地說,Nginx僅僅是做爲Nginx Proxy反向代理使用的,由於反向代理功能表現的效果是負載均衡集羣的效果,因此也叫作Nginx負載均衡。反向代理和負載均衡的區別在於負載均衡一般都是對請求的數據包的轉發(也有可能會改寫數據包)、傳遞,其中DR模式明顯的特徵就是從負載均衡下面的節點服務器來看,接收到的請求仍是來自負載均衡器的客戶端的真實用戶。而反向代理,反向代理接收訪問用戶的請求後,會代理用戶從新發起請求代理下的節點服務器,最後把數據返回給客戶端用戶。在節點服務器來看,訪問節點服務器的客戶端用戶是反向代理服務器,而不是真實的網站訪問用戶。Nginx負載均衡的模塊主要有兩個,ngx_http_proxy_module,ngx_http_upstream_module。編譯的時候須要把這兩個模塊編譯進去。
[root@localhost ~]# yum install nginx -y
Nginx佔用的也是80端口,啓動Nginx時首先將httpd關閉
[root@localhost ~]# ss -tnl State Recv-Q Send-Q local address:Port Peer address:Port liSTEN 0 128 *:111 *:* liSTEN 0 128 *:22 *:* liSTEN 0 100 127.0.0.1:25 *:* liSTEN 0 128 :::111 :::* liSTEN 0 128 :::22 :::* liSTEN 0 100 ::1:25 :::* [root@localhost ~]# systemctl restart nginx #啓動Nginx LISTEN 0 128 *:80 *:*
[root@localhost ~]# nginx -V #查看Nginx版本 nginx version: nginx/1.12.2
[root@localhost ~]# vim /etc/nginx/nginx.conf user nginx; #Nginx用戶 [root@localhost ~]# ps aux | grep nginx nginx 2361 0.0 0.3 121200 3124 ? S 23:04 0:00 nginx: worker process worker_processes auto; #工做進程,auto同步於虛擬機內核數 更改進程數Nginx進程會改變 worker_processes 5; [root@localhost ~]# ps aux | grep nginx nginx nginx 2410 0.0 0.3 121200 3128 ? S 23:17 0:00 nginx: worker process nginx 2411 0.0 0.3 121200 3128 ? S 23:17 0:00 nginx: worker process nginx 2412 0.0 0.3 121200 3128 ? S 23:17 0:00 nginx: worker process nginx 2413 0.0 0.3 121200 3128 ? S 23:17 0:00 nginx: worker process nginx 2414 0.0 0.3 121200 3128 ? S 23:17 0:00 nginx: worker process events { worker_connections 1024; #一個進程能夠生成1024個線程 } error_log /var/log/nginx/error.log; #錯誤日誌 pid /run/nginx.pid; #pid存放路徑 include /usr/share/nginx/modules/*.conf; #加載文件 http { #web全局信息 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 /var/log/nginx/access.log main; # sendfile on; #發送文件相關 tcp_nopush on; # tcp_nodelay on; # keepalive_timeout 65; # 長連接超時時間,65秒後自動斷開 types_hash_max_size 2048; #hash加密 include /etc/nginx/mime.types; default_type application/octet-stream; # load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { #虛擬主機 listen 80 default_server; #監聽端口 listen [::]:80 default_server; #ipv6 server_name _; #域名 root /usr/share/nginx/html; #網站根目錄 root /var/www/htlm; #修改成/var(習慣) index index.html; #默認首頁文件 # load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } location / { } error_page 404 /404.html; #404頁面文件 location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { }
[root@localhost ~]# nginx -t #Nginx檢測配置 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@localhost ~]# systemctl restart nginx #重啓
root@localhost ~]# mkdir -p /var/www/html #給首頁文件寫入內容 [root@localhost ~]# cd /var/www/html [root@localhost html]# touch index.html [root@localhost html]# echo "4" > index.html [root@localhost html]# cat index.html 4 [root@localhost html]# cd [root@localhost ~]# setenforce 0 [root@localhost ~]# systemctl stop firewalld
在windows端輸入主機ip訪問
編寫404 文件:
[root@localhost ~]# cd /var/www/html [root@localhost html]# vim 404.html The page is missing ~ :wq
在windows瀏覽器界面輸入不存在的網頁,查看404文件
正向解析:在收到客戶端請求以後,會修改源IP地址和端口
反向解析:在收到客戶端請求以後,會修改目標IP地址和端口
上游服務器:代理服務器後端的哪些真正給客戶端提供服務的節點,這樣的服務器稱之爲上游服務器。
下游服務器:客戶端就是下游節點。
模塊ngx_http_proxy_module
指令
proxy_pass:指定上游服務器的ip和端口
proxy_set_header:指定在從新封裝請求報文的時候,添加一個新的首部
Syntax: proxy_pass URl; #語法 Default: — #沒有默認值 Context: location, if in location, limit_except #定義位置
規則:
必定要先啓動集羣節點服務機的apache服務,做爲支持(systemctl restart httpd);服務機192.168.16.5的網首文件
[root@localhost html]# cat index.html
you are wonderful
[root@localhost ~]# vim /etc/nginx/nginx.conf location /zxj { #搜索zxj的時候自動跳轉到192.168.16.5服務器上去 proxy_pass http://192.168.16.5/; # /表示徹底代理。能匹配到 } #location能夠寫多個 [root@localhost ~]# systemctl restart nginx
windows端訪問輸入本機ip及匹配名便可跳轉到服務機
不加/即不是徹底代理時則鏈接不到
不加徹底代理是能夠在.5服務機的相應目錄下目錄zxj並將index.html文件拷入,反向代理會搜索此目錄。
調度器:分發用戶的請求到一個後端節點
上游服務器(真實服務器):每一個真正用來處理用戶請求的節點都是一個上游服務器
CIP:client,客戶端的IP地址
RIP:real,真實服務器的IP地址
VIP:virtual,虛擬IP,用戶所看到的是也是虛擬IP
ngx_stream_proxy_module
upstream
做用:定義一個上游服務器組
格式
upstream name {
server 上游服務器1 參數 參數;
server 上游服務器1 參數 參數;
server 上游服務器1 參數 參數;
}
Syntax: proxy_pass address; #語法
Default: — #無默認值
Context: server #定義在server
weight=#:設置服務器的權重(數字越大,權重越高);
backup: 設置服務器處於備用狀態(其餘節點出現故障,備用節點纔開始工做);
down:設置讓一個節點處於離線狀態(常常用在維護一個節點的狀況下);
max_fails=number:設置連續幾回轉發失敗就認爲該節點出現故障,而後就再也不向該節點轉發用戶請求了;
fail_timeout=time: 和上個參數組合使用,做用是設置等待上游服務器響應超時時間。
.5首頁文件爲 you are wonderful;.7首頁文件爲7777777777
[root@localhost ~]# vim /etc/nginx/nginx.conf upstream zxj { # 集羣名 server 192.168.16.5 weight=5 max_fails=2 fail_timeout=2; #.5權重爲5 server 192.168.16.7 weight=1 max_fails=2 fail_timeout=2; #.7權重爲1 #假設訪問6次請求,.5承擔5次客戶端請求,.7承擔 1次客戶端請求 } server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /var/www/html; index index.html; # load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { proxy_pass http://zxj/; #改成集羣名 ;wq
windows端輸入客戶機訪問
刷新5次後
1> 反向代理proxy後跟一個具體的ip地址;負載均衡proxy後跟的是集羣名;
2> 反向代理代理到的是某一個特定的服務器,而負載均衡器是根據算法調度到集羣中的某個節點上。
[root@localhost html]# yum install nginx mariadb-server php php-mysql php-fpm -y #完整的LNMP架構
server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /var/www/html; index index.php index.html; #添加php # load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location ~ php$ { #正則 fastcgi_pass 127.0.0.1:9000; #php-fpm的監聽端口 include fastcgi.conf; #加載文件 } [root@localhost ~]# nginx -t #檢查 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@localhost ~]# systemctl restart nginx #重啓
[root@localhost ~]# cd /var/www/html [root@localhost html]# rz
[root@localhost html]#unzip wordpress-3.3.1-zh_CN.zip [root@localhost html]# ls 404.html index.html wordpress wordpress-3.3.1-zh_CN.zip [root@localhost html]# mv wordpress/* . #將全部文件移動到當前目錄 [root@localhost html]# cp wp-config-sample.php wp-config.php [root@localhost html]# vim wp-config.php #更改配置文件 /** WordPress 數據庫的名稱 */ define('DB_NaME', 'zxj'); /** MySQl 數據庫用戶名 */ define('DB_USER', 'zxj'); /** MySQl 數據庫密碼 */ define('DB_PaSSWORD', '123'); ;wq [root@localhost html]# systemctl restart mariadb #啓動數據庫 [root@localhost html]# mysql -u root -p #進入數據庫 MariaDB [(none)]> create database zxj; #建立數據庫 MariaDB [(none)]> grant all on *.* to zxj@'localhost' identified by '123'; #受權用戶 MariaDB [(none)]> exit #退出 Bye [root@localhost html]# #配置完成
在windows端訪問
成功上線!