Nginx是俄羅斯人編寫的十分輕量級的HTTP服務器,Nginx,它的發音爲「engine X」,是一個高性能的HTTP和反向代理服務器,同時也是一個IMAP/POP3/SMTP 代理服務器。Nginx是由俄羅斯人 Igor Sysoev爲俄羅斯訪問量第二的 Rambler.ru站點開發的,它已經在該站點運行超過兩年半了。Igor Sysoev在創建的項目時,使用基於BSD許可。其特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。javascript
apache 仍然是目前的主流,擁有豐富的特性,成熟的技術和開發社區php
二者最核心的區別在於 apache 是同步多進程模型,一個鏈接對應一個進程,而 nginx 是異步的,多個鏈接(萬級別)能夠對應一個進程css
通常來講,須要性能的 web 服務,用 nginx 。若是不須要性能只求穩定,更考慮 apache ,後者的各類功能模塊實現得比前者,例如 ssl 的模塊就比前者好,可配置項多。epoll(freebsd 上是 kqueue ) 網絡 IO 模型是 nginx 處理性能高的根本理由,但並非全部的狀況下都是 epoll 大獲全勝的,若是自己提供靜態服務的就只有寥寥幾個文件,apache 的 select 模型或許比 epoll 更高性能。固然,這只是根據網絡 IO 模型的原理做的一個假設,真正的應用仍是須要實測了再說的。html
更爲通用的方案是,前端 nginx 抗併發,後端 apache 集羣,配合起來會更好。前端
該文件在 /etc/nginx/nginx.confjava
#nginx進程,通常設置爲和cpu核數同樣 worker_processes 4; #錯誤日誌存放目錄 error_log /data1/logs/error.log crit; #運行用戶,默認便是nginx,可不設置 user nginx #進程pid存放位置 pid /application/nginx/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. #最大文件打開數(鏈接),可設置爲系統優化後的ulimit -HSn的結果 worker_rlimit_nofile 51200; cpu親和力配置,讓不一樣的進程使用不一樣的cpu worker_cpu_affinity 0001 0010 0100 1000 0001 00100100 1000; #工做模式及鏈接數上限 events { use epoll; #epoll是多路複用IO(I/O Multiplexing)中的一種方式,可是僅用於linux2.6以上內核,能夠大大提升nginx的性能 worker_connections 1024; #;單個後臺worker process進程的最大併發連接數 } ################################################### http { include mime.types; #文件擴展名與類型映射表 default_type application/octet-stream; #默認文件類型 #隱藏響應header和錯誤通知中的版本號 server_tokens off; #開啓高效傳輸模式 sendfile on; ------------------------------------------------------------------------------------------------- #激活tcp_nopush參數能夠容許把httpresponse header和文件的開始放在一個文件裏發佈, 積極的做用是減小網絡報文段的數量 tcp_nopush on; #激活tcp_nodelay,內核會等待將更多的字節組成一個數據包,從而提升I/O性能 tcp_nodelay on; #鏈接超時時間,單位是秒 keepalive_timeout 60; #開啓gzip壓縮功能 gzip on; #設置容許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取。默認值是0,表示無論頁面多大都進行壓縮。建議設置成大於1K。若是小於1K可能會越壓越大。 gzip_min_length 1k; #壓縮緩衝區大小。表示申請4個單位爲16K的內存做爲壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果。 gzip_buffers 4 16k; #壓縮版本(默認1.1,前端爲squid2.5時使用1.0)用於設置識別HTTP協議版本,默認是1.1,目前大部分瀏覽器已經支持GZIP解壓,使用默認便可。 gzip_http_version 1.0; #壓縮比率。用來指定GZIP壓縮比,1壓縮比最小,處理速度最快;9壓縮比最大,傳輸速度快,但處理最慢,也比較消耗cpu資源。 gzip_comp_level 9; #用來指定壓縮的類型,「text/html」類型老是會被壓縮 gzip_types text/plain application/x-javascript text/css application/xml; #vary header支持。該選項可讓前端的緩存服務器緩存通過GZIP壓縮的頁面,例如用 Squid緩存通過Nginx壓縮的數據。 gzip_vary off; #開啓ssi支持,默認是off ssi on; ssi_silent_errors on; #設置日誌模式 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; #反向代理負載均衡設定部分 #upstream表示負載服務器池,定義名字爲backend_server的服務器池 upstream backend_server { server 10.254.244.20:81 weight=1 max_fails=2 fail_timeout=30s; server 10.254.242.40:81 weight=1 max_fails=2 fail_timeout=30s; server 10.254.245.19:81 weight=1 max_fails=2 fail_timeout=30s; server 10.254.243.39:81 weight=1 max_fails=2 fail_timeout=30s; #設置由 fail_timeout 定義的時間段內鏈接該主機的失敗次數,以此來判定 fail_timeout 定義的時間段內該主機是否可用。默認狀況下這個數值設置爲 1。零值的話禁用這個數量的嘗試。 設置在指定時間內鏈接到主機的失敗次數,超過該次數該主機被認爲不可用。 #這裏是在30s內嘗試2次失敗即認爲主機不可用! } ################### #基於域名的虛擬主機 server { #監聽端口 listen 80; server_name www.abc.com abc.com; index index.html index.htm index.php; #首頁排序 root /data0/abc; #站點根目錄,即網站程序存放目錄 error_page 500 502 404 /templates/kumi/phpcms/404.html; #錯誤頁面 #僞靜態 將www.abc.com/list....html的文件轉發到index.php。。。 #rewrite ^/list-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /index.php?m=content&c=index&a=lists&catid=$1&types=$2&country=$3&language=$4&age=$5&startDate=$6&typeLetter=$7&type=$8&page=$9 last; #location 標籤,根目錄下的.svn目錄禁止訪問 location ~ /.svn/ { deny all; } location ~ \.php$ { #符合php擴展名的請求調度到fcgi server fastcgi_pass 127.0.0.1:9000; #拋給本機的9000端口 fastcgi_index index.php; #設定動態首頁 include fastcgi.conf; }
反向代理:在收到客戶端請求以後,會修目標IP地址和端口node
正向代理:在收到客戶端請求以後,會修源IP地址和端口linux
上游服務器:代理服務器後端的哪些真正給客戶端提供服務的節點,這樣的服務器稱之爲上游服務器nginx
下游服務器:客戶端就是下游節點web
只有proxy_pass 是必須的
模塊:nginx_http_proxy_module 指令 proxy_pass:指定上游服務器的ip和端口 proxy_set_header:指定在從新封裝請求報文的時候,添加一個新的首部 Syntax: proxy_pass URL; Default: — Context: location, if in location, limit_except 例子:proxy_pass http://10.220.5.200:80; Syntax: proxy_set_header field value; Default: proxy_set_header Host $proxy_host; Context: http, server, location
例如
location / { proxy_pass http://10.220.5.180; }
centos7.5
反向代理服務器IP:172.20.10.7/28
web1服務器IP:172.20.10.8/28
web2服務器IP:172.20.10.9/28
yum安裝nignx須要配置網絡源,複製下面的代碼到你的yum倉庫中
[ken] name=ken enabled=1 gpgcheck=0 baseurl=https://mirrors.aliyun.com/epel/7Server/x86_64/
安裝
[root@ken ~]# yum install nginx -y
配置nginx文件,咱們實現這樣一個效果,靜態文件都被代理到172.20.10.8,動態文件都被調度到172.20.10.9,實現動靜分離。
[root@ken ~]# vim /etc/nginx/nginx.conf # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { 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; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # include /etc/nginx/conf.d/*.conf; server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /var/www/html; index index.html index.php; # Load configuration files for the default server block. location /songqi { #在頁面輸入當前IP後在後面加上 /songqi 便可 proxy_pass http://172.20.10.8/; #上游節點,也便是訪問這個頁面時跳轉到的網頁,後面最好加 / ,免去建立同名目錄的麻煩 } location ~ /.*\.php$ { #動態網頁配置,使用了正則表達式 proxy_pass http://172.20.10.9; #使用了正則表達式因此不能在後面加 / proxy_set_header host $proxy_host; proxy_set_header realip $remote_addr; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }