nginx rewrite

  • Nginx提供了全局变量或者自己设置的变量,结合正则表达式和标志位实现url的重写以及重定向,rewrite只能放在server{},location{},if{}中,并且只能对域名后面的除去传递的参数外的字符串起作用。
  • rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用PCRE,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前需要编译安装PCRE库
  • 通过Rewrite规则,可以实现规范的URL,根据变量来做URL转向以及选择配置

Rewrite全局变量

  • nginx的rewrite规则就是使用正则表达式匹配请求的url,然后根据定义的规则进行重写和改变,需要nginx_http_rewrite_module模块来支持url的重写功能,该模块是标准模块,默认已经安装好了

变量

含义

$args

这个变量等于请求行中的参数,同$query_string

$content length

请求头中的Content-length字段。

$content_type

请求头中的Content-Type字段。

$document_root

当前请求在root指令中指定的值。

$host

请求主机头字段,否则为服务器名称。

$http_user_agent

客户端agent信息

$http_cookie

客户端cookie信息

$limit_rate

这个变量可以限制连接速率。

$request_method

客户端请求的动作,通常为GET或POST。

$remote_addr

客户端的IP地址。

$remote_port

客户端的端口。

$remote_user

已经经过Auth Basic Module验证的用户名。

$request_filename

当前请求的文件路径,由root或alias指令与URI请求生成。

$scheme

HTTP方法(如http,https)。

$server_protocol

请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr

服务器地址,在完成一次系统调用后可以确定这个值。

$server_name

服务器名称。

$server_port

请求到达服务器的端口号。

$request_uri

包含请求参数的原始URI,不包含主机名,如”/foo/bar.php?arg=baz”。

$uri

不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

$document_uri

与$uri相同。

  • 举例说明:判断IP地址的来源
## 如果访问的ip地址(用的就是请求头中的remote_addr进行判断的)为192.168.5.165,则返回403
     if  ($remote_addr = 192.168.5.166) {  
         return 403;  
     }
  • 限制浏览器的访问(利用正则表达式判断请求头是否满足)
## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500
 if ($http_user_agent ~ Chrome) {   
         return 500;  
 }

注意:这些语句一般放在server{]中

如:

Alpine Linux nginx启动指令_nginx

Linux安装nginx

1.安装gcc gcc-c++(如新环境,未安装请先安装)
 $ yum install -y gcc gcc-c++
 2.安装wget
 $ yum -y install wget

3.安装PCRE库

$ cd /usr/local/
 $ wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz
 $ tar -zxvf pcre-8.33.tar.gz
 $ cd pcre-8.33
 $ ./configure
 $ make && make install


如果报错:

在 linux 中执行 wget 命令提示 -bash: wget: command not found 解决方法
解决办法 yum -y install wget

5.安装SSL库

$ cd /usr/local/
 $ wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz
 $ tar -zxvf openssl-1.0.1j.tar.gz
 $ cd openssl-1.0.1j
 $ ./config
 $ make && make install

6.安装zlib库存

$ cd /usr/local/
 $ wget http://zlib.net/zlib-1.2.11.tar.gz
 $ tar -zxvf zlib-1.2.11.tar.gz
 $ cd zlib-1.2.11
 $ ./configure
 $ make && make install

5.安装nginx

$ cd /usr/local/
 $ wget http://nginx.org/download/nginx-1.8.0.tar.gz
 $ tar -zxvf nginx-1.8.0.tar.gz
 $ cd nginx-1.8.0
 $ ./configure --prefix=/opt/nginx
 $ make && make install
  • 此时安装完毕后,安装好的nginx在/opt/nginx目录中

6.启动nginx

/usr/local/nginx/sbin/nginx
 ps -aux | grep ‘nginx’

Linux环境中修改hosts文件

(1)host文件的位置:/etc/hosts
(2)vim /etc/hosts即可编译

Linux环境下常用Nginx的操作

  • 查询nginx 进程
    ps aux | grep ‘nginx’
  • 杀死进程方式关闭nginx
    kill -9 2363
  • 停止nginx服务器
    /opt/nginx-anzhaung/sbin/nginx -s stop
  • 重启nginx
    /opt/nginx-anzhaung/sbin/nginx -s reload
  • 启动nginx
    /opt/nginx-anzhaung/sbin/nginx

Linux环境下配置负载均衡

  • 此时我们要做的是在linux环境上搭建nginx服务器,在windows上写程序,让用户在浏览器上的访问先到达linux上的nginx服务器,再由nginx服务器反向代理到windows的本地物理ip上执行程序
  • windows上的物理机IP地址是:192.168.0.140
  • linux上的地址是:192.168.0.108
  • 我们的linux和windows的ip只要是一个网段就可以进行访问,在linux上pingwindows可以ping通就行
  • 开始配置:
    (1)因为我们访问是从windos上进行访问的,所以host文件是在windos上配置的,但是对应的IP地址是指向linux的
  • Alpine Linux nginx启动指令_nginx_02

  • (2)修改linux上的nginx的配置
###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制
    upstream  backServer{
            server 192.168.0.140:8080;
            server 192.168.0.140:8081;
        }
     server {
        listen       80;
        ## 在windos上面配置,并不是在虚拟机中配置,因为客户端是在windows上的,访问是从windows来的,但是指向的linux上得到ip地址
        server_name  www.xiyou.com;
        location / {
                    ### 指定上游服务器负载均衡服务器
                    proxy_pass http://backServer;
                    index  index.html index.htm;
        }
    }

外网环境配置Nginx服务器–二级域名

  • 如www.baidu.com是一级域名
  • 如beikewww.baidu.com是二级域名,只要是自己定义出来的域名就可以称为二级域名(不是www开头的)
  • 一般在微服务环境中,我们访问不同微服务其域名也应该是不同的。但是在API开发接口,即接口网关下,我们的域名就必须是相同的,一般是www.apiXXXX.com
  • 总结:在互联网公司中,一般以项目拆分域名,比如会员项目,订单项目
    会员:http://member.xiyou.com
    订单:http://order.xiyou.com
    根据域名去区分项目
  • 区分域名并不是根据前缀区分的,即www啊什么的,(前缀+域名名称+结尾),一般是根据域名名称+结尾进行区分的。