LK最近在部署項目的時候了解到項目架構中使用到了ngnix負載均衡,雖然使用的是阿裡雲的負載均衡服務,但是LK還是想深入了解一下nginx,主要有一下知識總結:
1.nginx是什麼
2.nginx優點
3.nginx安裝和部署
4.nginx負載均衡和反向代理
5.nginx+tomcat+keepalived
1.nginx是什麼
- NGINX有什麼不同? NGINX使用可擴充的事件驅動架構,而不是更傳統的過程驅動架構。 這需要更低的記憶體占用,并且當并發連接配接擴大時,使記憶體使用更可預測。
- 在傳統的Web伺服器體系結構中,每個用戶端連接配接作為一個單獨的程序或線程處理,随着網站的流行度增加,并發連接配接數量的增加,Web伺服器減慢,延遲了對使用者的響應。
- 從技術的角度來看,産生一個單獨的程序/線程需要将CPU切換到新的任務并建立一個新的運作時上下文,消耗額外的記憶體和CPU時間,進而對性能産生負面影響。
- NGINX開發的目标是實作10倍以上的性能,優化伺服器資源的使用,同時也能夠擴充和支援網站的動态增長。 是以,NGINX成為最知名的子產品化,事件驅動,異步,單線程Web伺服器和Web代理之一。
2.nginx優點
- 作為 Web 伺服器:相比 Apache,Nginx 使用更少的資源,支援更多的并發連接配接,展現更高的效率,這點使 Nginx 尤其受到虛拟主機提供商的歡迎。能夠支援高達 50,000 個并發連接配接數的響應,感謝 Nginx 為我們選擇了 epoll and kqueue 作為開發模型.
- 作為負載均衡伺服器:Nginx 既可以在内部直接支援 Rails 和 PHP,也可以支援作為 HTTP代理伺服器 對外進行服務。Nginx 用 C 編寫, 不論是系統資源開銷還是 CPU 使用效率都比 Perlbal 要好的多。
- 作為郵件代理伺服器: Nginx 同時也是一個非常優秀的郵件代理伺服器(最早開發這個産品的目的之一也是作為郵件代理伺服器),Last.fm 描述了成功并且美妙的使用經驗
3.nginx安裝和部署
一、安裝Nginx:
- wget下載下傳: http://nginx.org/download/nginx-1.4.2.tar.gz
- 進行安裝: tar -zxvf nginx-1.4.2.tar.gz
-
下載下傳鎖需要的依賴庫檔案:
yum install pcre
yum install pcre-devel
yum install zlib
yum install zlib-devel
- 進行configure配置:cd nginx-1.4.2 && ./configure --prefix=/usr/local/nginx 檢視是否報錯
-
編譯安裝 make && make install
二,Nginx配置
- 建立 Nginx 運作使用的使用者 www:
-
配置nginx.conf ,将/usr/local/nginx/conf/nginx.conf替換為以下内容
user www www;
worker_processes 2; #設定值和CPU核心數一緻
error_log /usr/local/nginx/logs/nginx_error.log crit; #日志位置和日志級别
pid /usr/local/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
http
{
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “KaTeX parse error: Double superscript at position 23: …" ' '̲status b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer” ’
‘"$http_user_agent" $http_x_forwarded_for’;
#charset gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#limit_zone crawler KaTeX parse error: Expected 'EOF', got '#' at position 28: …e_addr 10m; #̲下面是server虛拟主機的配…
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ ..(gif|jpg|jpeg|png|bmp|swf|ico)$
{
expires 30d;
#access_log off;
}
location ~ ..(js|css)?$
{
expires 15d;
#access_log off;
}
access_log off;
}
}
- 檢查配置檔案nginx.conf的正确性指令:
-
啟動Nginx:
cd /usr/local/nginx目錄下: 看到如下4個目錄
…conf 配置檔案
… html 網頁檔案
…logs 日志檔案
…sbin 主要二進制程式
啟動指令:/usr/local/nginx/sbin/nginx -s start 關閉(stop)重新開機(reload)
成功:檢視是否啟動(netstat -ano | grep 80)
失敗:可能為80端口被占用等。
最終
nginx已經啟動 無法通路頁面
問題不是出在nginx上,而是出在iptable上,在iptable上添加80端口
#vi /etc/sysconfig/iptables
//在倒數第二行加入80端口
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
//重新開機iptables
#/etc/init.d/iptables restart
重新開機會報如下錯誤:
解決方法:
重新啟動nginx會報如下錯:
執行如下指令會生成nginx.pid檔案,但會報如下錯:
[[email protected] ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
執行 killall -9 nginx 殺死80程序
重新執行
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
檢視nginx是否啟動
ps -ef | grep nginx
4.nginx負載均衡和反向代理
#設定負載均衡的伺服器清單
#upstream myproject {
#weigth參數表示權值,權值越高被配置設定到的幾率越大
#max_fails 當有#max_fails個請求失敗,就表示後端的伺服器不可用,預設為1,将其設定為0可以關閉檢查
#fail_timeout 在以後的#fail_timeout時間内nginx不會再把請求發往已檢查出标記為不可用的伺服器
#}
#webap
#upstream myapp {
#server 192.168.43.132:8080 weight=1 max_fails=2 fail_timeout=30s;
#server 192.168.43.90:8080 weight=1 max_fails=2 fail_timeout=30s;
#}
#傳回的相應檔案位址
location / {
#設定用戶端真實ip位址
#proxy_set_header X-real-ip $remote_addr;
#負載均衡反向代理
#proxy_pass http://myapp;
#傳回根路徑位址(相對路徑:相對于/usr/local/nginx/)
root html;
#預設通路檔案
index index.html index.htm;
}
運作結果:
5.nginx+tomcat+keepalived
-
第一步:下載下傳keepalived位址:http://www.keepalived.org/download.html
解壓安裝:tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
yum install -y openssl openssl-devel(需要安裝一個軟體包)
cd keepalived-1.2.18/ && ./configure -prefix=/usr/local/keepalived
make && make install
-
第二步:将keepalived安裝成Linux系統服務,因為沒有使用keepalived的預設安裝路徑(預設路徑:/usr/local),安裝完成之後,需要做一些修改工作:
首先建立檔案夾,将keepalived配置檔案進行複制:mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
然後複制keepalived腳本檔案:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/可以設定開機啟動: ,到此我們安裝完畢!
- 第三步:對配置檔案進行修改:vim /etc/keepalived/keepalived.confkeepalived.conf配置檔案說明:
-
(一)Master
iglobal_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server smtp.hysec.com
smtp_connection_timeout 30
router_id nginx_master # 設定nginx master的id,在一個網絡應該是唯一}.
vrrp_script chk_http_port {
script “/etc/keepalived/nginx_check.sh” #最後手動執行下此腳本,以確定此本能夠正常執行
interval 2 #(檢測腳本執行的間隔,機關是秒)
weight 2
}
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER為主,BACKUP為備
interface eth1 # 目前進行vrrp通訊的網絡接口卡(目前centos的網卡)
virtual_router_id 66 # 虛拟路由編号,主從要一直
priority 100 # 優先級,數值越大,擷取處理請求的優先級越高
advert_int 1 # 檢查間隔,預設為1s(vrrp多點傳播周期秒數)
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port #(調用檢測腳本)
}
virtual_ipaddress {
192.168.0.200 # 定義虛拟ip(VIP),可多設,每行一個
}
}
-
(二)Backup!
bal_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server smtp.hysec.com
smtp_connection_timeout 30
router_id nginx_backup # 設定nginx backup的id,在一個 絡應該是唯一的
}
vrrp_script chk_http_port {
script “/etc/keepalived/nginx_check.sh”
interval 2 #(檢測腳本執行的間隔)
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER 主,BACKUP為備
interface eth0 # 目前進行vrrp通訊的網絡接口卡(> 目前centos的網卡)
virtual_router_id 66 # 虛拟路由編号,主從要一直
priority 99 # 優先級,數值越大,擷取處理請 的優先級越高
advert_int 1 # 檢查間隔,預設為1s(vrrp多點傳播周> 期秒數)
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port #(調用檢測腳本)
}
virtual_ipaddress {
192.168.0.200 # 定義虛拟ip(VIP),可多設,每行> 一個
}
}
-
(三)
!/bin/bash
A=
ps -C nginx --no-header |wc -l
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx #重新開機nginx
if [
ps -C nginx --no-header |wc -l
-eq 0 ];then #nginx重新開機失敗
exit 1
else
exit 0
fi
else
exit 0
fi
~
~
- (四)我們需要把master的keepalived配置檔案 copy到master機器(172)的 /etc/keepalived/ 檔案夾下,在把backup的keepalived配置檔案copy到backup機器(173)的 /etc/keepalived/ 檔案夾下,最後把nginx_check.sh腳本分别copy到兩台機器的 /etc/keepalived/檔案夾下。
- (五)nginx_check.sh腳本授權。賦予可執行權限:chmod +x /etc/keepalived/nginx_check.sh
- (六)啟動2台機器的nginx之後。我們啟動兩台機器的
keepalived /usr/local/nginx/sbin/nginx
service keepalived start
ps -ef | grep nginx
ps -ef | grep keepalived
運作結果: