nginx以及openresty
一 Nginx的简介
1.1 简介
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。其他特点:运行稳定,开源,免费。
1.2 Nginx的应用场景
-1. 作为http服务器
-2. 充当虚拟主机
-3. 反向代理
-4. 负载均衡
二 Nginx的安装
2.1 上传、解压、更名
[root@qianfeng01 ~]# tar -zxvf nginx-1.8.0.tar.gz -C /usr/local
2.2 环境准备
1) 安装c语言环境
因为nginx的编译需要c语言环境
[root@qianfeng01 ~]# yum -y install gcc-c++
2)安装插件pcre和pcre-devel
[root@qianfeng01 ~]# yum install -y pcre pcre-devel
3)安装压缩工具zlib和zlib-devel
[root@qianfeng01 ~]# yum install -y zlib zlib-devel
4)安装支持https协议的相关工具
这两款工具,要安装上openssl和openssl-devel
[root@qianfeng01 ~]# yum install -y openssl openssl-devel
2.3 指定nginx的配置路径,并执行配置
[root@qianfeng01 ~]# mkdir /usr/local/nginx/tmp
[root@qianfeng01 ~]# cd /usr/local/nginx
[root@qianfeng01 nginx]# ./configure \--prefix=/usr/local/nginx \--pid-path=/usr/local/nginx/tmp/nginx.pid \--lock-path=/usr/local/nginx/tmp/nginx.lock \--error-log-path=/usr/local/nginx/tmp/error.log \--http-log-path=/usr/local/nginx/tmp/access.log \--with-http_gzip_static_module \--http-client-body-temp-path=/usr/local/nginx/tmp/client \--http-proxy-temp-path=/usr/local/nginx/tmp/proxy \--http-fastcgi-temp-path=/usr/local/nginx/tmp//fastcgi \--http-uwsgi-temp-path=/usr/local/nginx/tmp/uwsgi \--http-scgi-temp-path=/usr/local/nginx/tmp/scgi
2.4 执行安装
[root@qianfeng01 nginx]# make & make install
然后查看nginx目录下是否有sbin目录,如果有,证明安装成功。
2.5 常用参数的查看
[root@qianfeng01 nginx]# ./sbin/nginx -h
nginx version: nginx/1.8.0
Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]Options:-?,-h : this help-v : show version and exit-V : show version and configure options then exit-t : test configuration and exit-q : suppress non-error messages during configuration testing-s signal : send signal to a master process: stop, quit, reopen, reload-p prefix : set prefix path (default: /usr/local/nginx/)-c filename : set configuration file (default: conf/nginx.conf)-g directives : set global directives out of configuration file
# 启动nginx的进程命令
[root@qianfeng01 nginx]# ./sbin/nginx
#可以查看启动后的进程
[root@qianfeng01 nginx]# ps -ef | grep nginx# 启动nginx的进程命令
[root@qianfeng01 nginx]# ./sbin/nginx -s stop
# 重新启动nginx的进程命令
[root@qianfeng01 nginx]# ./sbin/nginx -s reload#查看nginx的其他选项
[root@qianfeng01 nginx]# ./sbin/nginx -h
**注意:**你可以配置环境变量了。
[root@qianfeng01 nginx]# vi /etc/profile
......省略....
# nginx environment
export NGINX_HOME=/usr/local/nginx
export PATH=$NGINX_HOME/sbin:$PATH
三 Nginx的应用
3.1 默认配置文件的解析
文件:${NGINX_HOME}/conf/nginx.conf
#user nobody; /* 用户和用户组的配置 */
worker_processes 1; /* worker进程的数量 */#error_log logs/error.log; /* 错误日志的位置信息和级别 */
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid; /* 进程id的文件的位置 */events {worker_connections 1024; /* 同时连接到nginx的最大连接数 */
}http {include mime.types; default_type application/octet-stream;/* 访问日志的格式,通常程序员会进行修改的。 main是日志格式的名称,后面是具体格式 */#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 logs/access.log main; /* 使用日志格式的main规定的格式 */sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 80; /* 监听端口 */server_name localhost; /* 监听的地址 */#charset koi8-r;#access_log logs/host.access.log main;location / { /* 指定匹配规则 */root html; /* 指定根目录 */index index.html index.htm; /* 指定默认访问的文件 */}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}
}
3.2 http服务
本身就是一个http服务器。使用默认的配置文件nginx.conf,默认端口是80,访问的根目录是html,默认首页是index.html
3.3 虚拟主机
就是nginx可以通过配置充当多个服务器
##步骤1:
[root@qianfeng01 html]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=none
NAME=ens33
DEVICE=ens33
ONBOOT=yesIPADDR=192.168.10.101
IPADDR1=192.168.10.201 <===============追加一个ip地址PREFIX=24
GATEWAY=192.168.10.2
DNS1=114.114.114.114
DNS2=8.8.8.8[root@qianfeng01 html]# systemctl restart network
[root@qianfeng01 html]# ping 192.168.10.201##步骤2: 修改nginx.conf配置文件,添加两个server,如下server {listen 8089; <===============配置端口号,也可使用默认的80server_name 192.168.10.101;#access_log tmp/access.log my_log;location / {root html;index my1.html index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
server {listen 8089;server_name 192.168.10.201;location / {root html;index my2.html;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
##步骤3:在html下,创建一个my1.html 和 my2.html文件,修改其内容##步骤4:重新加载nginx.conf配置文件
[root@qianfeng01 html]# nginx -c conf/nginx.conf -s reload##步骤5:测试
在远程机器windows上使用浏览器访问192.168.10.101:8089
和192.168.10.201:8089
3.4 反向代理
正向代理和反向代理的区别,如下图
第一步:在三台机器上安装tomcat
修改每个tomcat的首页信息:
首页位置:/usr/local/apache-tomcat-7.0.47/webapps/ROOT/index.jsp
第二步:启动tomcat
[root@qianfeng01 ~]# /usr/local/apache-tomcat-7.0.47/bin/startup.sh
[root@qianfeng02 ~]# /usr/local/apache-tomcat-7.0.47/bin/startup.sh
[root@qianfeng03 ~]# /usr/local/apache-tomcat-7.0.47/bin/startup.sh
第三步:配置nginx.conf文件
server {listen 80;server_name www.baidu.com; #access_log tmp/access.log my_log;location / {proxy_pass http://tomcat1;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
server {listen 80;server_name www.umeng.com; #access_log tmp/access.log my_log;location / {proxy_pass http://tomcat2;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}
}
server {listen 80;server_name www.taobao.com; #access_log tmp/access.log my_log;location / {proxy_pass http://tomcat3;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}
}
upstream tomcat1 {server 192.168.10.101:8080;
}
upstream tomcat2 {server 192.168.10.102:8080;
}
upstream tomcat3 {server 192.168.10.103:8080;
}
第四步:重新加载nginx的配置文件
第五步:修改windows的hosts文件:C:\Windows\System32\drivers\etc
192.168.10.101 qianfeng01 www.baidu.com www.umeng.com www.taobao.com
第六步:清空浏览器的cookie记录
第七步:测试
在浏览器的地址栏上输入上面三个域名
3.5 负载均衡
负载均衡的配置信息
down : 表示当前的server暂时不参与负载
weight : 默认为1,weight越大表示负载的权重越大。
max_fails : 允许的请求失败的次数,默认为1,当超过最大次数的时候,返回proxy_next_upstream模块中定义的错误
fail_timeout_max_fails : 当出现max_fails次错误之后,暂定的时间
backup : 其他所有的非backup的机器down或者忙的时候,请求backup机器,所以这台机器一般压力都很轻
server {listen 80;server_name www.baidu.com; #access_log tmp/access.log my_log;location / {proxy_pass http://tomcat1;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
upstream tomcat1 {server 192.168.10.101:8080 weight=5;server 192.168.10.102:8080;server 192.168.10.103:8080;
}
四 Nginx的其他内容
4.1 Nginx的变量
4.1.1)说明
Nginx中是支持变量的写法,可以自定义变量,也有内置的变量。
自定义变量时,需要使用set指令,变量需要使用$开头测试变量的方式有两种,第一种是采集到日志文件中
第二种是使用echo指令,但是需要安装echo模块
4.1.2) Nginx内置的变量
$http_user_agent #浏览器类型
$arg_name #请求中的的参数名,即“?”后面的arg_name=arg_value形式的arg_name
$args #请求中的参数值
$binary_remote_addr #客户端地址的二进制形式, 固定长度为4个字节
$body_bytes_sent #传输给客户端的字节数,响应头不计算在内
$bytes_sent #传输给客户端的字节数
$connection #TCP连接的序列号
$connection_requests #TCP连接当前的请求数量
$content_length #“Content-Length” 请求头字段
$content_type #“Content-Type” 请求头字段
$cookie_name #cookie名称
$document_root #当前请求的文档根目录或别名
$document_uri #同 $uri
$host #优先级如下:HTTP请求行的主机名>”HOST”请求头字段>符合请求的服务器名
$hostname #主机名
$http_name #匹配任意请求头字段; 变量名中的后半部分“name”可以替换成任意请求头字段,如在配置文件中需要获取http请求头:“Accept-Language”,那么将“-”替换为下划线,大写字母替换为小写,形如:$http_accept_language即可。
$https #如果开启了SSL安全模式,值为“on”,否则为空字符串。
$is_args #如果请求中有参数,值为“?”,否则为空字符串。
$limit_rate #用于设置响应的速度限制,详见 limit_rate。
$msec #当前的Unix时间戳
$nginx_version #nginx版本
$pid #工作进程的PID
$pipe #如果请求来自管道通信,值为“p”,否则为“.”
$proxy_protocol_addr #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串。
$query_string #同 $args
$realpath_root #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径。
$remote_addr #客户端地址
$remote_port #客户端端口
$remote_user #用于HTTP基础认证服务的用户名
$request #代表客户端的请求地址
$request_body #客户端的请求主体
$request_body_file #将客户端请求主体保存在临时文件中
$request_completion #如果请求成功,值为”OK”,如果请求未完成或者请求不是一个范围请求的最后一部分,则为空。
$request_filename #当前连接请求的文件路径。
$request_length #请求的长度 (包括请求的地址, http请求头和请求主体)
$request_method #HTTP请求方法,通常为“GET”或“POST”
$request_time #处理客户端请求使用的时间; 从读取客户端的第一个字节开始计时。
$request_uri #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:”/cnphp/test.php?arg=freemouse”。
$scheme #请求使用的Web协议, “http” 或 “https”
$sent_http_name #可以设置任意http响应头字段; 变量名中的后半部分“name”可以替换成任意响应头字段,如需要设置响应头Content-length,那么将“-”替换为下划线,大写字母替换为小写,形如:$sent_http_content_length 4096即可。
$server_addr #服务器端地址
$server_name #服务器名
$server_port #服务器端口
$server_protocol #服务器的HTTP版本, 通常为 “HTTP/1.0” 或 “HTTP/1.1”
$status #HTTP响应代码
$tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space #客户端TCP连接的具体信息
$time_iso8601 #服务器时间的ISO 8610格式
$time_local #服务器时间(LOG Format 格式)
$uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如”/foo/bar.html”。
4.1.3)安装echo模块
##下载echo模块包
wget https://github.com/openresty/echo-nginx-module/archive/v0.60.tar.gz
##解压
tar -zxvf v0.60.tar.gz -C /usr/local/nginx
##重新配置路径,包括echo模块
[root@qianfeng01 nginx]# ./configure \--prefix=/usr/local/nginx \--pid-path=/usr/local/nginx/tmp/nginx.pid \--lock-path=/usr/local/nginx/tmp/nginx.lock \--error-log-path=/usr/local/nginx/tmp/error.log \--http-log-path=/usr/local/nginx/tmp/access.log \--with-http_gzip_static_module \--http-client-body-temp-path=/usr/local/nginx/tmp/client \--http-proxy-temp-path=/usr/local/nginx/tmp/proxy \--http-fastcgi-temp-path=/usr/local/nginx/tmp//fastcgi \--http-uwsgi-temp-path=/usr/local/nginx/tmp/uwsgi \--http-scgi-temp-path=/usr/local/nginx/tmp/scgi \--add-module=/usr/local/nginx/echo-nginx-module-0.60
## 重新安装[root@qianfeng01 nginx]# make && make install
4.1.4)测试变量,打印到浏览器上
##1. 编写conf/my.conf
[root@qianfeng01 nginx]# vim conf/my.conf
events {worker_connections 1024;
}http{server{listen 10086;server_name localhost;location / {context "text/html"set $hobby "book";echo "$http_user_agent $hobby 3:$remote_addr 4:$arg_passwd";}}
}
##2. 测试配置文件
[root@qianfeng01 nginx]# nginx -c conf/my.conf -t
nginx: the configuration file /usr/local/nginx/conf/my.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/my.conf test is successful
##3. 重新加载
[root@qianfeng01 nginx]# nginx -c conf/my.conf -s reload##4. 在浏览器上输入以下地址:
192.168.10.101:10086/f1?passwd=123456
4.2 location的匹配规则
server里的location配置是用于匹配http协议的路径的,可以有以下匹配规则
#语法规则
location [=|~|~*|^~] /uri/ {… }
#示例
location = /uri # =开头表示精确匹配,只有完全匹配上才能生效。
location ~ pattern # ~ 开头表示区分大小写的正则匹配。
location ~* pattern # ~*开头表示不区分大小写的正则匹配。
location ^~ /uri # ^~ 开头对URL路径进行前缀匹配,并且在正则之前。
location /uri # 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。
location / # 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。
测试:
events {worker_connections 1024;
}http{server{listen 10086;server_name localhost;location ~ /abc {default_type text/html;root html;index abc.html abcd.html;}}
}浏览器访问:
http://qianfeng01:10086/abc.html
http://qianfeng01:10086/abcd.html
4.3 日志指令
Nginx的日志包含了两类:访问日志(access log)和错误日志(error log)。
访问日志相关指令主要有两条:
1)log_format,用来设置日志格式。
log_format name format
#name:指的是日志格式的名称(后面由access_log指令调用)
#format:设置日志具体格式#示例
log_format onelog '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"''"$request_time"';
#可以配置在http块中。
2)access_log,用来指定日志文件的存放路径、类型、缓存大小等。
access_log /var/log/nginx/access.log onelog;
#可以配置在http、server、location块中。
3)错误日志指令:error_log ,用来指定错误日志文件的存储路径以及日志级别
error_log logs/nginx_error.log error; # 错误日志路径,和日志级别。
#常见的错误日志级别有debug | info | notice | warn | error | crit | alert | emerg
#可以配置在main、http、server、location块中。
#配置文件中定义了两个error_log,在同一个配置段里的话会产生冲突,所以同一个段里只允许配置一个error_log。但是,在不同的配置段中出现是没问题的。error_log /dev/null; #关闭error_log
4.4 进程processes说明
"master"进程负责管理"worker"进程,除了管理” worker"进程,"master"进程还负责读取配置文件、判断配置文件语法的工作,“master进程"也叫"主进程”
"worker"进程真正负责处理请求的进程。
在Nginx中,"master"进程只能有一个,而"worker"进程可以有多个,"worker"进程的数量可以自行定义。
worker_processes 1;
4.5 ngx_lua_modul模块的安装
##扩展阅读》》lua脚本语言介绍
--1. Lua是一个小巧的脚本语言。作者是巴西人。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
--2. Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。
--3. Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。
--4. 一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。
ngx_lua_module是一个nginx http模块,它把lua解析器内嵌到nginx,用来解析并执行lua语言编写的网页后台脚本
这里主要是示范一下,如何在Nginx下安装lua-nginx-module模块
当然,如果你之前没有安装过Nginx,而且嫌安装麻烦,可直接下载openresty安装简单快捷,http://openresty.org/cn/installation.html(阿里的大牛章亦春的作品)
**步骤1)**下载安装LuaJIT 2.1
(2.0或者2.1都是支持的,官方推荐2.1):http://luajit.org/download.html
[root@qianfeng01 ~]# cd /usr/local/src
[root@qianfeng01 src]# wget http://luajit.org/download/LuaJIT-2.1.0-beta2.tar.gz
[root@qianfeng01 src]# tar -zxvf LuaJIT-2.1.0-beta2.tar.gz
[root@qianfeng01 src]# cd LuaJIT-2.1.0-beta2
[root@qianfeng01 src]# make PREFIX=/usr/local/luajit
[root@qianfeng01 src]# make install PREFIX=/usr/local/luajit别忘记配置环境变量
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.1
**步骤2)**下载并解压ngx_devel_kit(NDK)
和 lua-nginx-module
模块
[root@qianfeng01 ~]# cd /usr/local/nginx
wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.14rc3.tar.gz
[root@qianfeng01 nginx]# tar -zxvf v0.2.19.tar.gz
[root@qianfeng01 nginx]# tar -zxvf v0.10.14rc3.tar.gz
[root@qianfeng01 nginx]# rm -rf v0.2.19.tar.gz 0.10.14rc3.tar.gz--官网:https://github.com/simpl/ngx_devel_kit/tagshttps://github.com/openresty/lua-nginx-module/tags
步骤3) 带上两个模块重新编译nginx
如果不知道nginx的配置路径,可以使用nginx -V进行查询
[root@qianfeng01 ~]# cd /usr/local/nginx
[root@qianfeng01 nginx]# ./configure \--prefix=/usr/local/nginx \--pid-path=/usr/local/nginx/tmp/nginx.pid \--lock-path=/usr/local/nginx/tmp/nginx.lock \--error-log-path=/usr/local/nginx/tmp/error.log \--http-log-path=/usr/local/nginx/tmp/access.log \--with-http_gzip_static_module \--http-client-body-temp-path=/usr/local/nginx/tmp/client \--http-proxy-temp-path=/usr/local/nginx/tmp/proxy \--http-fastcgi-temp-path=/usr/local/nginx/tmp//fastcgi \--http-uwsgi-temp-path=/usr/local/nginx/tmp/uwsgi \--http-scgi-temp-path=/usr/local/nginx/tmp/scgi \--add-module=/usr/local/nginx/echo-nginx-module-0.60 \--add-module=/usr/local/nginx/ngx_devel_kit-0.3.1rc1 \--add-module=/usr/local/nginx/lua-nginx-module-0.10.14rc3
[root@qianfeng01 nginx]# make -j2
[root@qianfeng01 nginx]# make install
**步骤4)**测试配置文件
[root@qianfeng01 nginx]# nginx -c conf/my.conf -t
/usr/local/luaNginx/sbin/nginx: error while loading shared libraries: libluajit-4.1.so.2: cannot open shared object file: No such file or directory如果出现以上错误提示,原因是因为lua模块没有引用到动态链接库。 需要我们手动设置一下
[root@qianfeng01 nginx]# vim /etc/ld.so.conf.d/libc.conf
/usr/local/luajit/lib#重新加载
[root@qianfeng01 nginx]# ldconfig #再次测试就可以了
五 OpenResty的应用
官方地址:https://openresty.org/cn/rpm-packages.htmlOpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,更主要的是在性能方面,OpenResty可以快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web 应用系统。
5.1 OpenResty 安装
我们选择yum 安装方式, yum默认会安装openresty源的最新版本
yum -y install yum-utils
# 添加openresty yum 源
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
# 安装openresty
yum -y install openresty
注意:
1. yum方式安装后,安装目录在 /usr/local/openresty
2. 同时可执行文件在 /usr/bin/openrestry,它只是一个软链接,因此没有必要再配置环境变量
# 查看可用版本
sudo yum list openresty --showduplicates
5.2 OpenResty的用法
注意: 需要使用openresty指令,而不是nginx指令
常用方式:
openresty -p tempPath -c confPath -t 用于测试:
openresty -p tempPath -c confPath 启动
openresty -p tempPath -c confPath -s stop 关闭
openresty -p tempPath -c confPath -s quit 关闭
openresty -p tempPath -c confPath -s reload 启动后重新加载配置文件-p tempPath: 产生的临时文件的目录,里面包含日志目录logs、pid文件等一些临时的内容
-c confPath: 配置文件的路径,相对于-p指定的路径而已。如果使用-p指定了临时目录,那么要在-p所在的目录下创建个logs目录。
如果自己创建了配置文件的目录,那么应该将mime.types拷贝到此目录下。比如:openresty -p /usr/local/openresty -c myconf/main.conf
应该提前在openresty下面创建logs和myconf。并将mime.types拷贝到myconf下。
5.3 OpenResty内置的Lua脚本语言
注意:openresty不需要单独安装lua安装包,因为是内置的。如果只安装了nginx,想使用lua需要单独安装。
5.3.1 注释语法
--单行注释--[[多行注释多行注释
--]]
5.3.2 支持的数据类型
字符串类型,number类型,boolean类型,table类型(数组类型),nil类型(无类型)print(type("Hello world")) --> string
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil ,nil类型表示没有任何有效值
print(type(type(X))) --> string
5.3.3 支持变量
[root@qianfeg01 ~]# vi test.lua#!/usr/bin/luaa = 5 -- 全局变量
local b = 5 -- 局部变量function joke()c = 5 -- 全局变量,Lua中的变量全是全局变量,那怕是语句块或是函数里,除非用local显式声明为局部变量。local d = 6 -- 局部变量
endjoke()
print(c,d) --> 5 nildo -->do-end blocks解决变量作用域问题local a = 6 -- 局部变量b = 6 -- 对局部变量重新赋值print(a,b); --> 6 6
endprint(a,b) --> 5 6
[root@qianfeg01 ~]# lua test.lua
或者
[root@qianfeg01 ~]# chmod 500 test.lua
[root@qianfeg01 ~]# ./test.lua
5.3.4 各种类型的测试
[root@qianfeg01 ~]# lua
> username=wangcongming <----字符串赋值语法错误
> print(username)
nil
> username='wangcongming' <----字符串赋值可以使用单引号
> print(username)
wangcongming
> username="aaaaaaawangcongming" <----字符串赋值可以使用双引号
> print(username)
aaaaaaawangcongming
> username=[[aaaaaaawangcongmingaaaaaaaaaa]] <----字符串赋值可以使用双中括号
> print(username)
aaaaaaawangcongmingaaaaaaaaaa
> username=[["aaaaaaawangcongmingaaaaaaaaaa"]]
> print(username)
"aaaaaaawangcongmingaaaaaaaaaa" <----双中括号里的字符都是普通字符
> passwod=[["aaaa <----多行赋值方式
>> bbbb
>> cccc"]]
> print(passwod)
"aaaa
bbbb
cccc"
> str="aaaa"
> str1="bbb"
> print(str..str1) <----字符串进行拼接操作,使用..
aaaabbb
> print(str.."-"..str1) <----字符串进行拼接操作,使用..
aaaa-bbb
> username="aaaaaaaaaaaa"
> user=username <----变量之间赋值
> print(user)
aaaaaaaaaaaa-- 数字的测试
> a = 5
> print(a)
5
> return a
5
> c = 7
> print (a+c)
12> b = "20"
> return type(b)
string
> return type(tonumber(b))
number--table的用法
> hobby={"book","movie","ball"}
> print(hobby)
table: 0x1cffa40
> print(hobby[0])
nil
> print(hobby[1])
book
> print(hobby[2])
movie
> print(hobby[3])
ball
> print(hobby[4])
nil
> hobby[4]="shop"
> print(hobby[4])
shop
> hobby["username"]="wangcongming"
> print(hobby["username"])
wangcongming
> index=10
> hobby[index]="gaoyuanyuan"
> print(hobby[index])
gaoyuanyuan
> print(hobby[10])
gaoyuanyuan
> print(hobby[9])
nil
> hobby={"movie","book","music"}
> print(#hobby) <----变量之间赋值
3注意:table类型的访问需要使用索引,默认情况下索引从1开始。索引也可以是其他类型的值,就可以理解为键值对。
数字索引不需要连续,比如 a[1] = "aa" a[2] = "bb" a[4]= "cc"
5.3.5 if分支
--Lua认为false和nil为假,true和非nil为真
--[ 0 为 true ]
if(1)
thenprint("0 为 true")
end
两个分枝
if(布尔表达式)
then--[ 布尔表达式为 true 时执行该语句块 --]
else--[ 布尔表达式为 false 时执行该语句块 --]
end
多分枝
a=11
b=11
if(a>b)
thenprint("a>b")
elseif(a==b)
thenprint("a=b")
elseprint("a<b")
end
5.3.6 循环结构的用法
--var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增,并执行一次 "执行体"。
--exp3 是可选的,如果不指定,默认为1。
for var=exp1,exp2,exp3 do <执行体>
end
> for var=1,10,4 do print(var) end
1
4
7
10
> for var=1,10 do print(var) end
1
2
3
4
5
6
7
8
9
10
> hobby={"book","movie","ball"}
> hobby["hello"]="world"
> for k,v in pairs(hobby) do print(k..':'..v) end
1:book
2:movie
3:ball
hello:world
5.4 Lua-Nginx-Module常用的指令
参考:https://github.com/openresty/lua-nginx-module/
1)lua_code_cache
语法:lua_code_cache on | off
默认: on
适用上下文:http、server、location、location if
这个指令是指定是否开启lua的代码编译缓存,开发时可以设置为off,以便lua文件实时生效,如果是生产线上,为了性能,建议开启。
2)lua_package_path
语法:lua_package_path <lua-style-path-str>
默认:由lua的环境变量决定
适用上下文:http
设置lua代码的寻找目录。例如:lua_package_path "/opt/nginx/conf/www/?.lua;;"; 具体的路径设置要参考lua的模块机制
3)init_by_lua(_file)
语法:init_by_lua <lua-script-str>
适用上下文:http初始化一些lua的全局变量,以便后续的代码使用
http{init_by_lua 'cjson = require "cjson"';server {location = /api {content_by_lua 'ngx.say(cjson.encode({dog = 5, cat = 6}))';}}
}
4)init_worker_by_lua(_file)
类似于上面的,不过是作用在work进程的,先于work进程启动而调用。
5)set_by_lua(_file)
语法: set_by_lua $res <lua-script-str> [$arg1 $arg2 ...]适用上下文:server、server if 、location、location if警告 自从v0.9.17发行版以来,不鼓励使用此指令;请改用新的set_by_lua_block指令。
location /foo {set $diff ''; # we have to predefine the $diff variable hereset_by_lua $sum 'local a = 32local b = 56ngx.var.diff = a - b; -- write to $diff directlyreturn a + b; -- return the $sum value normally';echo "sum = $sum, diff = $diff";
}
6)content_by_lua(_file)
语法:content_by_lua <lua-script-str>适用上下文:location、location if
location =/mytest {default_type text/html; # 消息头set $num2 "56";content_by_lua "ngx.print(ngx.var['arg_pwd']) ngx.print(ngx.var['arg_uname'])ngx.print(ngx.null)ngx.say(ngx.var['arg_pwd'])";}尝试访问地址:/mytest?pwd=123123&uname=michael
通过这个指令,可以由lua直接确定nginx响应页面的正文。
5.5 Lua-Nginx-Module中Nginx API常量与参数
Nginx Lua API只能在*_by_lua,*_by_lua_block和*_by_lua_file配置指令的上下文中运行的用户Lua代码中调用 。
1)ngx.arg
语法:value = ngx.arg[index]上下文: set_by_lua*, body_filter_by_lua*描述:当在set_by_lua *指令的上下文中使用时,此表是只读的,并保存config指令的输入参数:
value = ngx.arg[n]
location /foo_sum {set $a 32;set $b 56;set_by_lua $sum ' return ngx.arg[1] + ngx.arg[2] ' $a $b;echo "sum = ${sum}";}
2)ngx.null
ngx.null常量是一个NULL light用户数据,通常用于在Lua表等中表示nil值,类似于lua-cjson库的cjson.null常量。
3)ngx.var.VARIABLE
语法:ngx.var.VARIABLE_NAME上下文:set_by_lua, rewrite_by_lua, access_by_lua*,content_by_lua, header_filter_by_lua*, body_filter_by_lua, log_by_lua*读取和写入Nginx的变量值。
取值:value = ngx.var.password
赋值:ngx.var.password = value
注意,只有已经定义的nginx变量可以写入,也就是说,nginx变量不能在运行中创建。
location /foo {set $pwd ''; # this line is required to create $my_var at config timecontent_by_lua_block {ngx.var.pwd = 123;ngx.say(ngx.var.pwd);}}
面的正文。
5.5 Lua-Nginx-Module中Nginx API常量与参数
Nginx Lua API只能在*_by_lua,*_by_lua_block和*_by_lua_file配置指令的上下文中运行的用户Lua代码中调用 。
1)ngx.arg
语法:value = ngx.arg[index]上下文: set_by_lua*, body_filter_by_lua*描述:当在set_by_lua *指令的上下文中使用时,此表是只读的,并保存config指令的输入参数:
value = ngx.arg[n]
location /foo_sum {set $a 32;set $b 56;set_by_lua $sum ' return ngx.arg[1] + ngx.arg[2] ' $a $b;echo "sum = ${sum}";}
2)ngx.null
ngx.null常量是一个NULL light用户数据,通常用于在Lua表等中表示nil值,类似于lua-cjson库的cjson.null常量。
3)ngx.var.VARIABLE
语法:ngx.var.VARIABLE_NAME上下文:set_by_lua, rewrite_by_lua, access_by_lua*,content_by_lua, header_filter_by_lua*, body_filter_by_lua, log_by_lua*读取和写入Nginx的变量值。
取值:value = ngx.var.password
赋值:ngx.var.password = value
注意,只有已经定义的nginx变量可以写入,也就是说,nginx变量不能在运行中创建。
location /foo {set $pwd ''; # this line is required to create $my_var at config timecontent_by_lua_block {ngx.var.pwd = 123;ngx.say(ngx.var.pwd);}}
nginx以及openresty相关推荐
- 用Nginx+Lua(OpenResty)开发高性能Web应用
在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开 ...
- Nginx+Lua(OpenResty) HelloWorld
<使用Nginx+Lua(OpenResty)开发高性能Web应用>中已经介绍了使用Nginx+Lua(OpenResty)开发Web应用,但是没有具体代码示例. 本文将按照<使用N ...
- 使用Nginx+Lua(OpenResty)开发高性能Web应用
在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开 ...
- 给lnmp一键包中的nginx安装openresty的lua扩展
lnmp一键包(https://lnmp.org)本人在使用之后发现确实好用,能帮助我们快速搭建起lnmp.lamp和lnmpa的web生产环境,因此推荐大家可以多试试.但有的朋友可能需要使用open ...
- nginx和openresty配置静态资源时,样式错乱
问题 nginx和openresty配置静态资源时,样式错乱,页面没有报错,查看css,作为静态文件已经加载了,但是不起作用. 原因 CSS加载过程,发现CSS加载时Content Type为&quo ...
- 高并发 Nginx+Lua OpenResty系列教程汇总篇
高并发 Nginx+Lua OpenResty系列教程汇总篇 <高并发 Nginx+Lua OpenResty系列(1)--环境搭建> <高并发 Nginx+Lua OpenRest ...
- xxx.nginx转发+OpenResty(nginx升级版)_web服务器+lua
看上图,鼠标右键-在新标签中打开图片食用 内容分为三部分: nginx转发 OpenResty(nginx升级版)_web服务器+lua 测试 1.nginx转发 1.1.搭建nginx 略: 翻阅其 ...
- Nginx和OpenResty专栏帖
本帖 是用于统计整理Nginx和Openresty相关的学习博客和资料,方便自己学习和后期快速查找对应的知识! Nginx 学习 Nginx官網 : http://nginx.org/en/ Ngin ...
- Nginx(OpenResty)+Lua+Redis IP限流 10s内
使用 OpenResty 可以不用再次编译nginx 就能集成对应lua环境 可以扩展的模块比较丰富 1.使用redis 控制限流 ip 访问频度 创建对应lua脚本 access_by_limit_ ...
- nginx网关--openresty
OpenResty 安装环境:CentOS 1. 依赖库安装 yum -y install readline-devel pcre-devel openssl-devel gcc 2. 下载源码包,并 ...
最新文章
- 36 ES5中新增的方法
- 全球首家!B站上线“杜比视界”给UP主用,“观众眼睛要被养刁了”
- 零基础在学习Java时如何才能打好基础呢
- vue 数字变星号 过滤器_Vue自定义过滤器格式化数字三位加一逗号
- php oci 11g.dll下载,Oracle oci.dll
- python面试题之简要描述Python的垃圾回收机制(garbage collection)
- eggjs增删改查MySQL_egg-sequelize 实现 增删改查
- 关于HTML的FORM上传文件问题
- java零基础对象和类_【JAVA零基础入门系列】Day11 Java中的类和对象
- 微信开发者工具之WXS和简单组件
- 手把手教你写一篇国家级大创
- 概率论基础 —— 8.数学期望、方差、协方差
- python下载谷歌地图瓦片_Python地图可视化之Folium更换地图瓦片(Map Tiles)
- 名键风流 十六款斐尔可顶级机械键盘赏
- 使用Unity调用派样机技术小结
- 函数式编程:一等函数(First-class Function)
- SAP系统中信用控制功能详解
- 机器学习中VC界和VC维草稿笔记
- win 7 蓝屏、清理注册表、杀毒软件
- windows 7 出现MTP usb设备驱动安装问题解决方法
热门文章
- 惠州市外经贸企业资源信息平台开通——副市委书记开幕式发表讲话
- 简单方便的可调十步时序控制电路_数字电路图讲解
- hp计算机电源图标不见了,EliteBook 8xx G5 笔记本电脑 - 电池可能无法充电,系统托盘中没有显示电源图标...
- 由N*N的正方形中有几个正方形,有几个长方形 而想到的
- 怎么将照片转到Word文档?快来试一试这个方法
- 安卓图片加载框架Gilde的用法
- php学习第一天之HTML篇
- arduino 笔记【2】 应用按钮和下拉电阻
- 45 个非常有用的 Oracle语句
- 4、特征选择(filter):卡方检验特征筛选