4-5-面試必備-nginx高級模塊應用及優化思路

非http協議的反代及負載均衡,使用nginx的很少
ngx_stream_core_module,這個模塊只有1.9.0版本纔有,默認不編譯,編譯時須要添加-with-stream選項纔會啓用。
rpm -ql nginx-mod-stream---查看這個模塊修改了哪些文件,只有下面這兩個
/usr/lib64/nginx/modules/ngx_stream_module.so
/usr/share/nginx/modules/mod-stream.confphp

視頻中以ssh服務爲例演示:
前端反代:172.16.0.6
vim /etc/nginx/nginx.conf
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;mysql

events {
worker_connections 1024;
}nginx

stream {
upstream sshsrvs {---默認是輪詢
server 192.168.10.11:22;
server 192.168.10.12:22;
}web

upstream websrvs {---默認是輪詢
    server 192.168.10.11:80;
    server 192.168.10.12:80;
}

upstream mysrvs {---默認是輪詢
    server 192.168.10.11:3306;
    server 192.168.10.12:3306;
}

server {
    listen 22922;---標準的ssh端口是22,這裏是自定義的端口
    proxy_connect_timeout 1s;---指定鏈接超時時間,不是必備選項
    proxy_timeout 3s;---指定鏈接超時時間,不是必備選項
    proxy_pass 192.168.10.11:22;---nginx用來作四層反代的功能就完成了,這裏指的是後端主機IP port,也能夠寫成proxy_pass sshsrvs;
}

server {
    listen 80;
    proxy_pass 192.168.10.12:80;---nginx四層代理web服務也是能夠的,也能夠寫成proxy_pass websrvs;
}

server {
    listen 3306;
    proxy_pass mysrvs;
}

}sql

nginx -t
killall nginx
systemctl start nginx.service
ss -tnlp---查看22922端口
而後客戶端訪問22922端口
ssh -p 22922 root@172.16.0.6---會要求輸入密碼
ifconfig---查看鏈接的究竟是誰,能夠看到鏈接的是192.168.10.11vim

curl http://172.16.0.6/---能夠看到訪問的是192.168.10.12後端

先在反代上測試能不能鏈接mysql
mysql -utest -h192.168.10.11 -ptestpass
而後在客戶端上鍊接mysql服務
mysql -utest -h172.16.0.6 -ptestpass服務器

後端主機:192.168.10.11
systemctl start mariadb.service
mysql -uroot -pmageedu
GRANT ALL ON mydb.* TO test@'%' IDENTIFIED BY 'testpass';---受權一個遠程鏈接的帳號%表明任意主機
FLUSH PRIVILEGES;app

後端主機:192.168.10.12
systemctl start mariadb.service
mysql -uroot -pmageedu
GRANT ALL ON mydb.* TO test@'%' IDENTIFIED BY 'testpass';---受權一個遠程鏈接的帳號%表明任意主機
FLUSH PRIVILEGES;

視頻中的課件:
ngx_stream_core_module
(1)listen address:port[ssl][udp][backlog=number][bind][ipv6only=on|off][reuseport][sp_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
監聽的端口:
默認爲tcp協議;
udp:監聽udp協議的端口

ngx_stream_proxy_module
(1)proxy_pass address;
(2)proxy_timeout timeout;
默認爲10m;代理連續兩次讀寫之間的超時時長
(3)proxy_connect_timeout time;
設置nginx與被代理的服務器嘗試創建鏈接的超時時長;默認爲60s;
編譯安裝:
前提:開發環境,包括nginx編譯要啓用的功能依賴到的開發庫;
#yum groupinstall "Development Tools" "Server Platform Development"
#yum -y pcre-devel openssl-devel
編譯過程:
#./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_pm4_module --with-threads --with-file-aio
#make&&make install

nginx官方倉庫中的nginx的unit file:/usr/lib/systemd/system/nginx.service
    [Unit]
    Description=nginx - high performance web server---描述用來作什麼的
    Documentation=http://nginx.org/en/docs/---指明文檔在什麼地方
    After=network.target remote-fs.target nss-lookup.target---這三個服務啓動以後才能啓動

    [Service]
    Type=forking---基於forking方式來啓動
    PIDFile=/run/nginx.pid
    ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf---啓動以前作一些預先的操做,(作測試,若是測試不經過,下邊的命令是不會作的)
    ExesStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
    ExecReload=/bin/kill -s HUP $MAINPID---向它發hup信號,mainpid就是master主控進程的pid
    ExecStop=/bin/kill -s QUIT $MAINPID---發quit信號
    PrivateTmp=true

    [Install]---這個服務要作的話是在運行級別3中安裝的
    WantedBy=multi-user.target

epel倉庫中的nginx的unit file:/usr/lib/systemd/system/nginx.service
    [Unit]
    Description=The nginx HTTP and reverse proxy server---描述用來作什麼的
    After=network.target remote-fs.target nss-lookup.target---這三個服務啓動以後才能啓動

    [Service]
    Type=forking---基於forking方式來啓動
    PIDFile=/run/nginx.pid
    #Nginx will fail to start if /run/nginx.pid already exists but has the wrong
    #SELinux context.This might happen when running 'nginx -t'from the cmdline.
    #https://bugzilla.redhat.com/show_bug.cgi?id=1268621
    ExecStartPre=/usr/bin/rm -f /run/nginx.pid
    ExecStartPre=/usr/sbin/nginx -t---啓動以前作一些預先的操做,(作測試,若是測試不經過,下邊的命令是不會作的)
    ExecStart=/usr/sbin/nginx
    ExecReload=/bin/kill -s HUP $MAINPID---向它發hup信號,mainpid就是master主控進程的pid
    KillSignal=SIGQUIT
    TimeoutStopSec=5
    KillMode=process
    PrivateTmp=true

    [Install]---這個服務要作的話是在運行級別3中安裝的
    WantedBy=multi-user.target

編譯過程當中要是編譯第三方模塊,使用下列參數
--add-module=PATH---不支持動態裝卸載
--add-dynamic-module=PATH---支持動態裝卸載
yum remove nginx---卸載nginx
編譯安裝完成以後,須要編輯unitfile,而且作一次daemon-reload
vim /usr/lib/systemd/system/nginx.service
systemctl daemon-reload
systemctl start nginx.service
視頻中提示沒有目錄/var/cache/nginx/client_temp
systemctl status nginx.service---能夠檢查服務的狀態信息
mkdir /var/cache/nginx/client_temp -pv
chown nginx.nginx /var/cache/nginx
systemctl restart nginx.service---而後就沒有問題了

視頻中還講了經過nginx官方倉庫中的src.rpm包格式怎麼安裝
    下載下來是src.rpm格式,rpm -ivh 是安裝不上的
    此時會建立一個rpmbulid目錄
    tree rpmbuild---查看這個目錄,會看到有一個specs文件,這個文件是定義rpm包的,能夠編輯這個文件(爲的是能夠修改默認的nginx編譯選項,添加什麼模塊,刪除什麼模塊)
    而後製做rpm包
    rpmbuild -bb nginx.spec---bb ba均可以,bb只編譯成二進制格式,ba表示既有二進制格式又有src格式
    yum install -y 本身編譯的rpm包,就能夠安裝了

nginx有不少二次發行版tengine(淘寶的nginx,有過載保護功能,能夠拒絕請求) openresty

課程實踐:
nginx-->AMPs(wordpress)
nginx-->FPMs(wordpress)

nginx-->images servers(imgs.magedu.com)
    location ~* \.(jpg|png|gif|jpeg)$ {
        ...
    }
dynamic content servers (shop.magedu.com)
        location ~* \.php$ {
            ...
        }
        location / {
            ...
        }

自定義錯誤404和5xx錯誤頁,文本靜態內容傳輸壓縮;

相關文章
相關標籤/搜索