我們這里玩兒nginx,全都會在nginx里去寫lua腳本,因為我們需要自定義一些特殊的業務邏輯
比如說,流量分發,自己用lua去寫分發的邏輯,在分發層nginx里去寫的
再比如說,要用lua去寫多級緩存架構存取的控制邏輯,在應用層nginx里去寫的
后面還要做熱點數據的自動降級機制,也是用lua腳本去寫降級機制的,在分發層nginx里去寫的
因為我們要用nginx+lua去開發,所以會選擇用最流行的開源方案,就是用OpenResty
nginx+lua打包在一起,而且提供了包括redis客戶端,mysql客戶端,http客戶端在內的大量的組件
我們這一講是去部署應用層nginx,會采用OpenResty的方式去部署nginx,而且會帶著大家寫一個nginx+lua開發的一個hello world
1、部署第一個nginx,作為應用層nginx(192.168.31.187那個機器上)
(1)部署openresty
mkdir -p /usr/servers
cd /usr/servers/
yum install -y readline-devel pcre-devel openssl-devel gcc
wget http://openresty.org/download/ngx_openresty-1.7.7.2.tar.gz
tar -xzvf ngx_openresty-1.7.7.2.tar.gz
cd /usr/servers/ngx_openresty-1.7.7.2/
cd bundle/LuaJIT-2.1-20150120/
make clean && make && make install
ln -sf luajit-2.1.0-alpha /usr/local/bin/luajit
cd bundle
wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
tar -xvf 2.3.tar.gz
cd bundle
wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz
tar -xvf v0.3.0.tar.gz
cd /usr/servers/ngx_openresty-1.7.7.2
./configure --prefix=/usr/servers --with-http_realip_module --with-pcre --with-luajit --add-module=./bundle/ngx_cache_purge-2.3/ --add-module=./bundle/nginx_upstream_check_module-0.3.0/ -j2
make && make install
cd /usr/servers/
ll
/usr/servers/luajit
/usr/servers/lualib
/usr/servers/nginx
/usr/servers/nginx/sbin/nginx -V
啟動nginx: /usr/servers/nginx/sbin/nginx
(2)nginx+lua開發的hello world
vi /usr/servers/nginx/conf/nginx.conf
在http部分添加:
lua_package_path "/usr/servers/lualib/?.lua;;";
lua_package_cpath "/usr/servers/lualib/?.so;;";
/usr/servers/nginx/conf下,創建一個lua.conf
server {
listen 80;
server_name _;
}
在nginx.conf的http部分添加:
include lua.conf;
驗證配置是否正確:
/usr/servers/nginx/sbin/nginx -t
在lua.conf的server部分添加:
location /lua {
default_type 'text/html';
content_by_lua 'ngx.say("hello world")';
}
/usr/servers/nginx/sbin/nginx -t
重新nginx加載配置
/usr/servers/nginx/sbin/nginx -s reload
訪問http: http://192.168.31.187/lua
vi /usr/servers/nginx/conf/lua/test.lua
ngx.say("hello world");
修改lua.conf
location /lua {
default_type 'text/html';
content_by_lua_file conf/lua/test.lua;
}
查看異常日志
tail -f /usr/servers/nginx/logs/error.log
(3)工程化的nginx+lua項目結構
項目工程結構
hello
hello.conf
lua
hello.lua
lualib
*.lua
*.so
放在/usr/hello目錄下
/usr/servers/nginx/conf/nginx.conf
worker_processes 2;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type text/html;
lua_package_path "/usr/hello/lualib/?.lua;;";
lua_package_cpath "/usr/hello/lualib/?.so;;";
include /usr/hello/hello.conf;
}
/usr/hello/hello.conf
server {
listen 80;
server_name _;
location /lua {
default_type 'text/html';
lua_code_cache off;
content_by_lua_file /usr/example/lua/test.lua;
}
}
2、如法炮制,在另外一個機器上,也用OpenResty部署一個nginx
大家可能會發現說,有的人可能對nginx也不是太懂,對lua也沒什么了解
對于我的課程來說,主要還是關注,關注的是我們核心的topic,緩存,緩存,緩存,緩存的各種解決方案,大型緩存的架構
那么對于課程里涉及到的各種技術來說,比如nginx,lua腳本
你說讓我給你講成nginx從入門到精通,也不太現實; 講一個lua腳本開發從入門到精通,也不太現實
我只能說,跟著整個項目的思路去走,把項目里涉及的相關技術的知識給你講解一下,然后保證說,帶著你手把手的去做,讓你至少可以學會項目里講解的這些知識,可以做出來
如果你后面真的是要自己去用nginx+lua去做項目,其實個人建議你還是得去查詢和學習一些更多的資料,nginx的一些知識,lua的一些語法
龍果,最受歡迎的一套課程,就是dubbo實戰課程,里面也是dubbo整合了各種技術,active mq,zookeeper,redis 3.0分布式集群,mysql讀寫分離
但是有個問題,每個課程,我相信一個好的課程,它總是可以讓你學到很多知識的
但是任何一個好的課程,它都不是萬能的,dubbo,zookeeper,注冊中心,zookeeper分布式鎖,分布式協調,分布式選舉,等等技術,你學到嗎?
dubbo它也不可能說是給你把zookeeper,redis,mysql全部講解到從入門到精通這樣子
topic,主題,基于dubbo復雜的分布式系統的通用架構,分布式系統,dubbo rpc的調用,服務的開發; zookeeper注冊中心; redis分布式集群; mysql讀寫分離; tomcat集群; hudson持續集成
它告訴你的是一個通用的分布式系統的架構
我這里的也會帶著你做nginx的部署,openresty,nginx+lua的開發,redis集群/高可用/高并發/讀寫分離/持久化/數據備份恢復,zookeeper分布式鎖,kafka去做消息通信,hystrix去做限流
但是任何一個技術都不可能給你從入門到精通講解完
大家可以去關注一下我的es的課程,你如果錄一套課程,基本選擇方向就兩個,要不就是講解技術本身,大量案例實戰貫穿,把技術本身講解的很細致
我之前有兩個es頂尖高手系列的課程,技術課程,把es這個技術講解的非常非常的細致
像我們現在這個課程,大規模緩存,支撐高并發,高性能,海量數據,類似之前dubbo實戰課程,它講解的還是一種架構課程,那么就關注點在整個架構的整體,整合,架構方案,架構設計,架構思想
里面涉及的技術是不可能給你去深入講解的