一 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相关推荐

  1. 用Nginx+Lua(OpenResty)开发高性能Web应用

    在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开 ...

  2. Nginx+Lua(OpenResty) HelloWorld

    <使用Nginx+Lua(OpenResty)开发高性能Web应用>中已经介绍了使用Nginx+Lua(OpenResty)开发Web应用,但是没有具体代码示例. 本文将按照<使用N ...

  3. 使用Nginx+Lua(OpenResty)开发高性能Web应用

    在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开 ...

  4. 给lnmp一键包中的nginx安装openresty的lua扩展

    lnmp一键包(https://lnmp.org)本人在使用之后发现确实好用,能帮助我们快速搭建起lnmp.lamp和lnmpa的web生产环境,因此推荐大家可以多试试.但有的朋友可能需要使用open ...

  5. nginx和openresty配置静态资源时,样式错乱

    问题 nginx和openresty配置静态资源时,样式错乱,页面没有报错,查看css,作为静态文件已经加载了,但是不起作用. 原因 CSS加载过程,发现CSS加载时Content Type为&quo ...

  6. 高并发 Nginx+Lua OpenResty系列教程汇总篇

    高并发 Nginx+Lua OpenResty系列教程汇总篇 <高并发 Nginx+Lua OpenResty系列(1)--环境搭建> <高并发 Nginx+Lua OpenRest ...

  7. xxx.nginx转发+OpenResty(nginx升级版)_web服务器+lua

    看上图,鼠标右键-在新标签中打开图片食用 内容分为三部分: nginx转发 OpenResty(nginx升级版)_web服务器+lua 测试 1.nginx转发 1.1.搭建nginx 略: 翻阅其 ...

  8. Nginx和OpenResty专栏帖

    本帖 是用于统计整理Nginx和Openresty相关的学习博客和资料,方便自己学习和后期快速查找对应的知识! Nginx 学习 Nginx官網 : http://nginx.org/en/ Ngin ...

  9. Nginx(OpenResty)+Lua+Redis IP限流 10s内

    使用 OpenResty 可以不用再次编译nginx 就能集成对应lua环境 可以扩展的模块比较丰富 1.使用redis 控制限流 ip 访问频度 创建对应lua脚本 access_by_limit_ ...

  10. nginx网关--openresty

    OpenResty 安装环境:CentOS 1. 依赖库安装 yum -y install readline-devel pcre-devel openssl-devel gcc 2. 下载源码包,并 ...

最新文章

  1. 36 ES5中新增的方法
  2. 全球首家!B站上线“杜比视界”给UP主用,“观众眼睛要被养刁了”
  3. 零基础在学习Java时如何才能打好基础呢
  4. vue 数字变星号 过滤器_Vue自定义过滤器格式化数字三位加一逗号
  5. php oci 11g.dll下载,Oracle oci.dll
  6. python面试题之简要描述Python的垃圾回收机制(garbage collection)
  7. eggjs增删改查MySQL_egg-sequelize 实现 增删改查
  8. 关于HTML的FORM上传文件问题
  9. java零基础对象和类_【JAVA零基础入门系列】Day11 Java中的类和对象
  10. 微信开发者工具之WXS和简单组件
  11. 手把手教你写一篇国家级大创
  12. 概率论基础 —— 8.数学期望、方差、协方差
  13. python下载谷歌地图瓦片_Python地图可视化之Folium更换地图瓦片(Map Tiles)
  14. 名键风流 十六款斐尔可顶级机械键盘赏
  15. 使用Unity调用派样机技术小结
  16. 函数式编程:一等函数(First-class Function)
  17. SAP系统中信用控制功能详解
  18. 机器学习中VC界和VC维草稿笔记
  19. win 7 蓝屏、清理注册表、杀毒软件
  20. windows 7 出现MTP usb设备驱动安装问题解决方法

热门文章

  1. 惠州市外经贸企业资源信息平台开通——副市委书记开幕式发表讲话
  2. 简单方便的可调十步时序控制电路_数字电路图讲解
  3. hp计算机电源图标不见了,EliteBook 8xx G5 笔记本电脑 - 电池可能无法充电,系统托盘中没有显示电源图标...
  4. 由N*N的正方形中有几个正方形,有几个长方形 而想到的
  5. 怎么将照片转到Word文档?快来试一试这个方法
  6. 安卓图片加载框架Gilde的用法
  7. php学习第一天之HTML篇
  8. arduino 笔记【2】 应用按钮和下拉电阻
  9. 45 个非常有用的 Oracle语句
  10. 4、特征选择(filter):卡方检验特征筛选