|
Nginx can be embedded lua, let nginx execute lua scripts can handle high concurrent, non-blocking handling various requests, openresty nignx project can be used directly to build srcache_nginx + redis cache, rather than through the dynamic language processing (QPS can easily improved)
Look openresty in srcache-nginx-module workflow
Well ado
First, install
pcre
cd / usr / local / src
wget -c ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
tar zxf pcre-8.38.tar.gz
drizzle7
cd / usr / local / src /
wget http://openresty.org/download/drizzle7-2011.07.21.tar.gz
tar xzvf drizzle-2011.07.21.tar.gz
cd drizzle-2011.07.21 /
./configure
make
make install
export LD_LIBRARY_PATH = / usr / local / lib: $ LD_LIBRARY_PATH
JIT (Just-In-Time Compiler)
wget -c http://luajit.org/download/LuaJIT-2.0.2.tar.gz
tar xzvf LuaJIT-2.0.2.tar.gz
cd LuaJIT-2.0.2
make install PREFIX = / usr / local / luajit
echo "/ usr / local / luajit / lib"> /etc/ld.so.conf.d/usr_local_luajit_lib.conf
ldconfig
export LUAJIT_LIB = / usr / local / luajit / lib
export LUAJIT_INC = / usr / local / luajit / include / luajit-2.0
nginx
cd / usr / local / src
wget -c http://nginx.org/download/nginx-1.9.9.tar.gz
git clone https://github.com/simpl/ngx_devel_kit.git
git clone https://github.com/openresty/set-misc-nginx-module.git
git clone https://github.com/openresty/memc-nginx-module.git
git clone https://github.com/openresty/echo-nginx-module.git
git clone https://github.com/openresty/lua-nginx-module.git
git clone https://github.com/openresty/srcache-nginx-module.git
git clone https://github.com/openresty/drizzle-nginx-module.git
git clone https://github.com/openresty/rds-json-nginx-module.git
wget http://people.freebsd.org/~osa/ngx_http_redis-0.3.7.tar.gz
tar zxf nginx-1.9.9.tar.gz
cd nginx-1.9.9
./configure
--prefix = / usr / local / nginx-1.9.9
--add-module = .. / memc-nginx-module
--add-module = .. / srcache-nginx-module
--add-module = .. / ngx_devel_kit
--add-module = .. / ngx_image_thumb
--add-module = .. / redis2-nginx-module
--add-module = .. / echo-nginx-module
--add-module = .. / lua-nginx-module
--add-module = .. / set-misc-nginx-module
--add-module = .. / ngx_http_redis-0.3.7
--with-pcre = .. / pcre-8.38
--with-pcre-jit
make && make install
redis
cd / usr / local
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar zxf redis-3.0.6.tar.gz
cd redis-3.0.6
make
./src/redis-server &
Profiles
daemonize yes
pidfile /var/run/redis-6379.pid
port 6379
bind 127.0.0.1
timeout 0
tcp-keepalive 0
loglevel notice
logfile stdout
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
maxmemory 8096mb
maxmemory-policy volatile-ttl
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
nginx simple configuration
user www www;
worker_processes auto;
error_log logs / error.log info;
pid logs / nginx.pid;
events {
use epoll;
worker_connections 65536;
}
http {
include mime.types;
default_type application / octet-stream;
charset utf-8;
log_format main '$ remote_addr - $ remote_user [$ time_local] "$ request"'
'$ Status $ body_bytes_sent "$ http_referer"'
' "$ Http_user_agent" "$ http_x_forwarded_for"';
log_format srcache_log '$ remote_addr - $ remote_user [$ time_local] "$ request"'
' "$ Status" $ body_bytes_sent $ request_time $ bytes_sent $ request_length'
'[$ Upstream_response_time] [$ srcache_fetch_status] [$ srcache_store_status] [$ srcache_expire]';
server_tokens off;
keepalive_timeout 60 20;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
client_header_buffer_size 16k;
large_client_header_buffers 4 32k;
server_names_hash_max_size 512;
server_names_hash_bucket_size 64;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
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;
upstream memcache {
server 192.168.1.30:12000;
keepalive 10;
}
upstream redis {
server 127.0.0.1:6379;
keepalive 20;
}
server
{
listen 90 default;
server_name _;
return 444;
}
. Include vhosts / * conf;
}
Two, srcache + memcache
server {
listen 8099;
server_name 192.168.1.30;
root / data / www;
index index.php index.html index.htm;
default_type text / plain;
access_log logs / host.access.log main;
location / hello {
echo "This is a test";
}
location = / lua-version {
content_by_lua '
if jit then
ngx.say (jit.version)
else
ngx.say (_VERSION)
end
';
}
location / memc {
internal;
memc_connect_timeout 100ms;
memc_send_timeout 100ms;
memc_read_timeout 100ms;
set $ memc_key $ query_string;
set $ memc_exptime 300;
memc_pass memcache;
}
location ~ .php $ {
charset utf-8;
default_type text / html;
set $ key $ uri $ args;
srcache_fetch GET / memc $ key;
srcache_store PUT / memc $ key;
add_header X-Cached-From $ srcache_fetch_status;
add_header X-Cached-Store $ srcache_store_status;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
When the first visit
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text / html; charset = UTF-8
Date: Wed, 20 Jan 2016 16:32:32 GMT
Keep-Alive: timeout = 20
Server: nginx
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Cached-From: MISS strong>
X-Cached-Store: STORE
Second visit
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text / html; charset = UTF-8
Date: Wed, 20 Jan 2016 16:33:17 GMT
Keep-Alive: timeout = 20
Server: nginx
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Cached-From: HIT strong>
X-Cached-Store: BYPASS
Which requires access to customize the
Three, srcache + redis
redis configuration test
server {
listen 9001;
server_name 192.168.1.30;
root / data / www;
index index.php index.html index.htm;
default_type text / plain;
access_log logs / host.access.log main;
location / testx {
echo '1';
}
location ~. * . php {
srcache_store_private on;
srcache_methods GET;
srcache_response_cache_control off;
set $ key $ uri;
set_escape_uri $ escaped_key $ key;
srcache_default_expire 172800;
srcache_fetch GET / redis_get $ key;
srcache_store PUT / redis_set key = $ escaped_key & exptime = $ srcache_expire;
add_header X-Cached-From $ srcache_fetch_status;
set_md5 $ md5key $ key;
add_header X-md5-key $ md5key;
add_header X-Cached-Store $ srcache_store_status;
add_header X-Key $ key;
add_header X-Query_String $ query_string;
add_header X-expire $ srcache_expire;
add_header X-uri $ uri;
access_log logs / 9001-access.log srcache_log;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name;
fastcgi_split_path_info ^ $ (+ php..) (*.);
fastcgi_param PATH_INFO $ fastcgi_path_info;
}
location = / redis_get {
internal;
set_md5 $ redis_key $ args;
redis_pass redis;
}
location = / show {
echo $ request_uri;
echo $ args;
}
location = / redis_set {
internal;
set_unescape_uri $ exptime $ arg_exptime;
set_unescape_uri $ key $ arg_key;
set_md5 $ key;
redis2_query set $ key $ echo_request_body;
redis2_query expire $ key $ exptime;
redis2_pass redis;
}
location = / one {
set $ value 'first';
redis2_query set one $ value;
redis2_pass redis;
}
location = / get {
set_unescape_uri $ key $ arg_key; # this requires ngx_set_misc
redis2_query get $ key;
redis2_pass redis;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
You can view the log cache is hit
Four, lua
Nginx next stage of processing and use of Lua
init_by_lua http
set_by_lua server, server if, location, location if
rewrite_by_lua http, server, location, location if
access_by_lua http, server, location, location if
content_by_lua location, location if
header_filter_by_lua http, server, location, location if
body_filter_by_lua http, server, location, location if
log_by_lua http, server, location, location if
timer
lua Code
ngx.req.read_body () - explicitly read the req body
local data = ngx.req.get_body_data ()
if data then
ngx.say ( "body data:")
ngx.print (data)
return
end
- Body may get buffered in a temp file:
local file = ngx.req.get_body_file ()
if file then
ngx.say ( "body is in file", file)
else
ngx.say ( "no body found")
end
local res = ngx.location.capture ( "/ foo / index.php")
if res then
ngx.say ( "status:", res.status)
ngx.say ( "body:")
ngx.print (res.body)
end
Configure nginx
location / lua_test {
content_by_lua_file conf / lua_test.lua;
} |
|
|
|