标签归档:Nginx

在这里插入图片描述

nginx windows安装、使用和配置开机启动

一、nginx windows安装、使用

1.1、下载,解压 nginx

下载地址: http://nginx.org/en/download.html
我下载的是 nginx-1.15.4

D:\develop_tools\nginx 目录下将 nginx-1.15.4.zip解压到完整路径 D:\develop_tools\nginx\nginx-1.15.4\, 如图所示:

在这里插入图片描述

1.2、启动nginx

启动nginx有两种方式:

  • 双击启动
  • cmd 命令启动

1.2.1、双击启动 (不推荐)

直接双击 nginx.exe ,双击后一个黑色的弹窗一闪而过 。 这样就是启动成功了。

1.2.2、cmd命令启动(推荐)

用 管理员权限 打开cmd,切换到nginx解压目录下,输入命令 start nginx.exe 或者 nginx.exe ,回车后会出现一个黑色的弹窗一闪而过。

C:\Users\Administrator>cd D:\develop_tools\nginx\nginx-1.15.4
C:\Users\Administrator>d:
D:\develop_tools\nginx\nginx-1.15.4>start nginx.exe
123

1.3、验证

访问 http://localhost/
在这里插入图片描述

注:截图中的1.54 是我修改 index.html 添加的,默认是没有。

二 、配置开机启动

上面的配置nginx后,在电脑关机后再重启时,nginx 就会停止。
如果想要每次windows 开机后,nginx都处于运行状态,请看下面的操作配置。

2.1、下载 WinSW

下载地址: https://github.com/kohsuke/winsw/releases

我选择的是 winsw-v2.1.2 , 它有两个版本:

WinSW.NET2.exe (适用于32位系统)

WinSW.NET4.exe (适用于64位系统。我下载这个版本)

2.2、配置步骤

1)解压(略)。

2)将 WinSW.NET4.exe 复制到 D:\develop_tools\nginx\nginx-1.15.4\ 目录中,修改文件名称为 nginxservice.exe 。

3)在 nginxservice.exe 同目录中,新建一个空的 nginxservice.xml 文件(名字要与nginxservice.exe 名字前缀保持一致,但后缀是xml) ,nginxservice.xml 的内容:

<service>
	<id>nginx</id>
	<name>nginx</name>
	<description>nginx</description>
	<logpath>D:\develop_tools\nginx\nginx-1.15.4</logpath>
	<logmode>roll</logmode>
	<depend></depend>
	<executable>D:\develop_tools\nginx\nginx-1.15.4\nginx.exe</executable>
	<stopexecutable>D:\develop_tools\nginx\nginx-1.15.4\nginx.exe -s stop</stopexecutable>
</service>
12345678910

我的nginx 所在的目录是 D:\develop_tools\nginx\nginx-1.15.4 ,如果你的安装目录与我的不相同,要修改 <logpath> 、 <executable> 、 <stopexecutable> 这3处对应的值。

配置完成后的目录情况如下:
在这里插入图片描述
nginxservice.exenginxservice.xml 是上面步骤 复制和创建 的文件。

4)用 管理员权限 打开 cmd ,进入 D:\develop_tools\nginx\nginx-1.15.4 目录下,执行安装命令: nginxservice.exe install 。
在这里插入图片描述

5)桌面 –> 此电脑(我的电脑)—> 右键,选择 管理 –> 服务和应用程序 –> 服务,找到 nginx 服务,右键 选择 启动服务 。
在这里插入图片描述

2.3、验证

三、nginx常用的基本命令

start nginx.exe       ## 启动服务
nginx.exe -s stop	  ## 快速停止服务
nginx.exe -s quit	  ## 优雅的 停止服务

nginx.exe -s reload	  ## 重新加载 配置文件,这命令可以不用停止nginx
nginx.exe -s reopen	  ## 重新打开日志文件

nginx window下的静态文件服务器

#nginx window下的静态文件服务器 
  location /file/ {
            alias   D:/upload/test/; #换成你的本地磁盘位置
            index   autoindex on;
        }

关于Nginx反向代理DDNS的DNS缓存问题

在使用nginx做反向代理的,将请求发送到一个动态DDNS域名的时候,该动态DDNS域名对应的IP是A ,刚开始运行一切正常,但是当运行了一段时间以后,该动态DDNS域名对应的IP变了之后(例如对应的IP由A变为B),nginx的转发仍然还在向原先的IP A发送请求,导致反向代理中断,此时reload nginx后才会重新恢复正常,且日志显示数据转发到新的IP B了,请问如何让nginx自动去重新解析域名,而不用每次出现问题了人工去reload?

造成这个问题的主要原因是,在Nginx启动的时候会做域名解析,然后把IP缓存起来以后会一直使用解析到的IP并且不会再更改,除非重新启动Nginx,Nginx才会重新解析域名。

第一种解决方案,利用nginx的resolver

1、默认nginx会通过操作系统设置的DNS服务器(/etc/resolv.conf)去解析域名

2、其实nginx还可以通过自身设置DNS服务器,而不用去找操作系统的DNS

3、下面来讲一个这个resolver示例配置如下:

server {
listen 8080;
server_name localhost;
resolver 114.114.114.114 223.5.5.5 valid=3600s;
resolver_timeout 3s;
location / {
proxy_pass http://mydomain.com;
}
}

参数说明:

# resolver 可以在http全局设定,也可在server里面设定
# resolver 后面指定DNS服务器,可以指定多个,空格隔开
# valid设置DNS缓存失效时间,自己根据情况判断,建议600以上
# resolver_timeout 指定解析域名时,DNS服务器的超时时间,建议3秒左右

#注意:当resolver 后面跟多个DNS服务器时,一定要保证这些DNS服务器都是有效的,因为这种是负载均衡模式的,当DNS记录失效了(超过valid时间),首先由第一个DNS服务器(114.114.114.114)去解析,下一次继续失效时由第二个DNS服务器(223.5.5.5)去解析,亲自测试的,如有任何一个DNS服务器是坏的,那么这一次的解析会一直持续到resolver_timeout ,然后解析失败,且日志报错解析不了域名,通过页面抛出502错误。

第二种解决方法——最佳解决方案是升级到tengine 2.1.2,淘宝出品的东西,已经自带了解决方案。

Tengine的模块ngx_http_upstream_dynamic_module,此模块提供了在运行时动态解析upstream中server域名的功能。

upstream backend {
dynamic_resolve fallback=stale fail_timeout=30s;
server a.com;
server b.com;
}

server {

location / {
proxy_pass http://backend;
}
}

(一)upstream的用法
1、upstream

作用:是用来定义服务器组的模块

使用范围:proxy_pass、fastcgi_pass、memcached_pass

结构:

upstream groupName {    server serverName1 [param1=value1] [param2=value2] [param3];    server serverName2;}

groupName即为组名,是自定义的,如:upstream webserver;

2、server

upstream中的server用来指定一个服务器。

server的类型可以是:

  • (1)域名:如:webserver.website.com;
  • (2)IP:如:192.168.0.239:80;
  • (3)Unix套接字文件:如unix:/tmp/webserver;

例如:

upstream webserver {     server httpweb.withec.com;     server 192.168.18.201 weight=5 max_fails=3 fail_timeout=20s;     server 192.168.18.202 backup;     server 192.168.18.293 down;     server unix:/tmp/httpdweb;}

server中可用的参数:

  • (1)weight:表示权重,权重越大,表示被访问的概率越大

用法:weight=数字;

server 192.168.18.201 weight=4;
  • (2)max_fails:表示连接失败重新连接的最多次数

用法:max_fails=3;

如:

server 192.168.18.202 max_fails=3;
  • (3)fail_timeout:连接超时的时间(即多久算连接失败)

用法:fail_timeout=时间;

如:20秒就算连接失败

server 192.168.18.202 max_fails=3 fail_timeout=20s;
  • (4)backup:标记一台服务器作为备用服务器(它只在其他服务器繁忙的时候工作)

用法:server serverName backup;

如:

server 192.168.18.203 backup;
  • (5)down:标记一台服务器下线或者暂时不可用

用法:server serverName down;

如:

server 192.168.18.203 down;
  • (6)max_conns:表示指定的服务器最大连接数限制(nginx1.5.9以上版本才有的参数)

用法:max_conns=数字;

如:

server 192.168.18.202 max_conns=1024;
(二)、upstream实验:

4台机器:

  • IP:192.168.18.200(作前端服务器)
  • 192.168.18.201
  • 192.168.18.202
  • 192.168.18.203

步骤:

  • 1、三台机器上的nginx都需要启动,并在各自web根目录下的index.html的文件中加入机器识别信息,具体如下:
    • 200的机器上的index.html添加:from 200
    • 201的机器上的index.html,添加:from 201
    • 202的机器上的index.html,添加:from 202
    • 203的机器上的index.html,添加:form 203
  • 2、在237的机器上配置nginx(1)在http块中加入:
upstream webserver {      
server 192.168.18.201:80;      
server 192.168.18.202:80;      
server 192.168.18.203:80;}

       (2)在server区段的location段加入:

location / {    proxy_pass http://webserver;}

注:webserver这个组名前一定要记住加http://

打开浏览器访问:http://192.168.18.200,查看显示内容

  • 发现显示”from 201”
  • 刷新显示”from 202”
  • 再刷新显示”from 203”
  • 再刷新显示””from 201

依次刷新会在这三台机器之间循环(这种专业的叫法叫轮询)

(三)upstream模块主要指令
  • 1、hash:指定轮询的规则按照指定的key值来计算

用法:hash key;

这个key可以包含文本,变量或者文本与变量的组合。

  • 2、ip_hash;指定轮询的规则按照ip的hash值来计算

针对上面的实验:我们在upstream中加入ip_hash,再查看:

发现我们无论怎么刷新,访问的都是201上面的文件(因为客户端的IP没变)

升级到tengine

下载

https://tengine.taobao.org/download_cn.html

yum install lua-devel
wget -c https://tengine.taobao.org/download/tengine-2.3.2.tar.gz
tar zxvf tengine*
cd tengine*
./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-openssl=/usr/local/src/openssl --with-openssl-opt=enable-tls1_3 --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-stream=dynamic --with-stream_ssl_module --with-stream_realip_module --with-stream_geoip_module=dynamic --with-stream_ssl_preread_module --with-stream_sni --with-jemalloc --with-pcre --with-pcre-jit --with-cc-opt='-O2 -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=native' --with-ld-opt='-Wl,-z,relro -Wl,-E' --add-dynamic-module=./modules/ngx_http_concat_module --add-dynamic-module=./modules/ngx_http_footer_filter_module --add-dynamic-module=./modules/ngx_http_proxy_connect_module --add-dynamic-module=./modules/ngx_http_reqstat_module --add-dynamic-module=./modules/ngx_http_sysguard_module --add-dynamic-module=./modules/ngx_http_trim_filter_module --add-dynamic-module=./modules/ngx_http_upstream_check_module --add-dynamic-module=./modules/ngx_http_upstream_consistent_hash_module --add-dynamic-module=./modules/ngx_http_upstream_dynamic_module --add-dynamic-module=./modules/ngx_http_upstream_dyups_module --add-dynamic-module=./modules/ngx_http_upstream_session_sticky_module --add-dynamic-module=./modules/ngx_http_user_agent_module --add-dynamic-module=./modules/ngx_slab_stat --add-dynamic-module=./modules/ngx_http_lua_module --add-dynamic-module=/usr/local/src/ngx_devel_kit --add-dynamic-module=./modules/ngx_http_slice_module
sudo make install

设置为系统服务
1:系统用户登录系统后启动的服务 的目录

/usr/lib/systemd/system

2:如需要开机没有登陆情况下就能运行的程序在系统目录内

/lib/systemd/system

3:我希望系统开机就启动目录,所以我把文件放在系统目录内。

vim /lib/systemd/system/nginx.service 创建文件

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target
chmod 745 /lib/systemd/system/nginx.service 
systemctl enable nginx.service
systemctl start nginx.service

在 nginx 反向代理中使用域名

引言

所谓代理(proxy),即中间人,它代替客户端发送请求给服务器,收到响应后再转给客户端。通常意义上的代理是从用户的角度讲的,用户通过某个代理可以访问多个网站,这个代理是靠近用户的,比如某些公司可能需要限制员工所访问的网站,就会在网络出口处放置一个代理来做过滤。

所谓反向代理(reverse proxy),本质上跟代理是一回事,只不过是从服务器的角度讲的,是靠近服务器的。比如某个网站有多个服务器,提供同样的功能,一般会在网络入口处放一个代理,接收客户端的请求,再基于某种策略(比如轮转)转发给后端服务器,这样可以提高整个系统的服务能力。nginx 就是一种常见的 HTTP 协议反向代理。

反向代理指令

nginx 中常见的反向代理指令有两个:proxy_pass 和 fastcgi_pass,前者使用标准的 HTTP 协议转发,后者使用 FastCGI 协议转发,用于 PHP 等架构的环境。在我要说的这个域名问题上,它们行为是一样的,所以下面仅以 proxy_pass 为例。

一个最简单的反向代理配置如下:

server {
    location / {
        proxy_pass https://github.com;
    }
}

域名解析

其作用是将所有请求转发到 github.com。注意此处写的是域名,而非 IP。我们知道在真正发起请求前,是需要将域名解析成 IP 的,对于 github.com 来说,在我的环境上它会被解析成两个 IP:192.30.253.112 和 192.30.253.113,TTL 都是 50s,如下图:

screen shot 2017-03-25 at 17 34 29

那么使用上面这个配置,nginx 是什么时候做这件事情的呢?答案是启动的时候,只做一次,解析结果会被缓存下来,也就是完全无视 TTL,后续所有的请求转发,都是直接使用缓存下来的 IP,不会再做任何域名解析。对于 github.com 这种返回多个 IP 的情况,nginx 在转发时会自动对 IP 列表进行轮转。

可以使用 sudo tcpdump -n -i any port 53 抓包来验证这个行为。注:53 是 DNS 服务的默认端口。

那么问题来了,IP 变了怎么办?有什么办法让 nginx 自动重新解析域名吗?

配置动态域名解析

resolver 8.8.8.8;

server {
    location / {
        set $servers github.com;
        proxy_pass http://$servers;
    }
}

如上,通过使用变量($servers)的方式可以强制 nginx 遵守域名解析结果的 TTL,过期后自动重新解析。不过这种写法有个副作用,如此配置后 nginx 不会自动使用系统 /etc/resolve.conf 的配置,此时必须使用 resolver 指令手动给它指定一个 DNS 服务器。

参考资料

Nginx反向代理负载均衡配置梳理大全

本文梳理了Nginx在做反向代理时常用的核心配置,所有细节可以参考官网http://nginx.org/,我这里主要起到穿针引线的作用。

本文主要涉及了如下模块:
ngx_http_core_module
ngx_htpp_access_module
ngx_http_geo_module
ngx_http_map_module
ngx_http_index_module
ngx_http_log_module
ngx_http_perl_module
ngx_http_rewrite_module
ngx_http_ssi_module
ngx_http_ssl_module
ngx_http_upstream_module
ngx_http_proxy_module
ngx_http_limit_conn_module
ngx_http_limit_req_module
ngx_stream_core_module
ngx_stream_proxy_module
ngx_upstream_module
第三方模块如下:
redis2-nginx-module
redis-nginx-module
srcache-nginx-module
nginx-upsync-module

一、跳转

利用ngx_http_core_module、ngx_http_rewrite_module模块
主要是301跳转
Return写法:域名http请求跳转到对应的https请求

 server
  {
     listen   80;
    server_name www.test.com;
    index index.html index.htm index.shtml;
    location / {
          return      301 https://$host$request_uri;
   }
    access_log  /data/wwwlogs/access_www.test.com.log  access;
}

Rewrite写法:rewrite写法比较灵活可以调整路径,但没有return高效

server
{
    listen   80;
    server_name www.test.com;
    index index.html index.htm index.shtml;
    location ~* ^/(meinv|huodong|zhuanti)/(.*)$  {
        rewrite  ^/(meinv|huodong|zhuanti)/(.*)$   http://oldwww.test.com/$1/$2 permanent;
    }
    location / {
        proxy_pass http://www_test_com;
    }
    access_log  /data/wwwlogs/access_www.test.com.log  access;
}
upstream www_test_com {
        server 192.168.88.188:80;
        server 192.168.88.189:80;
}
二、重写代理

利用ngx_http_proxy_module、ngx_http_upstream_module模块

server
{
    listen 80;
    server_name www.test.com;
    index index.html index.htm index.shtml;
    location ~* /api/ {
         rewrite /api/(.*)$ /api/$1 break;
         proxy_set_header Host  apiwww.test.com;
         proxy_set_header X-Real-IP  $remote_addr;
         proxy_set_header        X_FORWARDED_FOR $proxy_add_x_forwarded_for;
         proxy_set_header        VIA     111.111.111.111;
         proxy_pass http://www_test_com_api;
     }
    access_log  /data/wwwlogs/access_www.test.com.log  access;
}
upstream www_test_com_api {
        server 192.168.88.188:80;
        server 192.168.88.189:80;
}
三、限速限连接

利用ngx_http_limit_conn_module、ngx_http_limit_req_module模块
首先http区域里面定义好限速限制连接数策略,再在线上具体域名上使用
Http区域配置如下:

map $http_x_forwarded_for  $clientRealIpnormal {
    ""  $remote_addr;
    ~^(?P<firstAddr>[0-9\.]+),?.*$  $firstAddr;
}
map $http_http_cdn_src_ip $clientRealIp{
    ""   $clientRealIpnormal;
    default $http_http_cdn_src_ip;
}
geo  $clientRealIp  $white_ip  {
default 1;
include geo.conf;
}
map $white_ip $limited {
        1  $clientRealIp;
        0  "";
 }

limit_req_status 418;
limit_conn_status 418;

limit_conn_zone $limited zone=addr:200m;
limit_req_zone  $limited zone=zero1:20m rate=1r/s;
limit_req_zone  $limited zone=zero2:20m rate=2r/s;
limit_req_zone  $limited zone=zero:20m rate=3r/s;
limit_req_zone  $limited zone=one:20m rate=10r/s;
limit_req_zone  $limited zone=two:20m rate=20r/s;
limit_req_log_level info;
limit_conn_log_level info;

线上域名开启配置如下:

server
{
    listen   80;
    server_name www.test.com;
    index index.html index.htm index.shtml;
    location / {
          limit_req zone=two burst=5 nodelay;
          limit_conn  addr 20;
          proxy_pass http://www_test_com;
    }
    access_log  /data/wwwlogs/access_www.test.com.log  access;
}
upstream www_test_com {                      
        server 192.168.88.188:80;
        server 192.168.88.189:80;
}
四、屏蔽IP

1、方法一
使用ngx_http_access_module模块allow、deny控制,缺点是通过remote_addr来屏蔽IP的,优点是支持CIDR等格式地址

allow 111.111.111.111;
allow 192.168.88.0/24;
deny all;

2、方法二
用于自定义客户端IP变量$clientRealIp来屏蔽,缺点IP需要写成正则形式的,优点是支持IP穿透,过CDN的域名这种方法才能生效

if ($clientRealIp ~ "(183.60.189.195|182.10.18.135)")
{
        return 403;
}

3、方法三
自定义屏蔽IP,结合Elasticsearch查询异常IP可自动化屏蔽IP

  set $clientipfileurl  "/usr/local/nginx/html/blockip/$host/$clientRealIp";
  if ( -f  $clientipfileurl) {
    return 403 "Your IP address $clientRealIp is too frequent, please try again later or contact the webmaster, thank you!";
  }
五、屏蔽URL

1、方法一
自动屏蔽,结合Elasticsearch查询异常URL,可自动化屏蔽URL

set $fileurl  "/usr/local/nginx/html/blockurl/$host/$uri";
if ( -f  $fileurl) {
    return 403 "This url $host$uri is too frequent, please try again later or contact the webmaster, thank you!";
 }

2、方法二
手动屏蔽,当某个目录或者URL影响到全站访问时可以手动屏蔽

location ~* ^/mbw/xoxo/123456789/ {
    return 403;
}
六、SSI包含

利用ngx_http_ssi_module模块
开启ssi后,include与ushtml代理到ssi服务器

server
{
    listen   80;
    server_name www.test.com;
    index index.html index.htm index.shtml;
        ssi on;
        ssi_silent_errors off;
        ssi_types text/shtml;
    location ~* ^/(include|ushtml)  {
        proxy_pass http://www_test_com_include;
    }
    location / {
        proxy_pass http://www_test_com;
    }
    access_log  /data/wwwlogs/access_www.test.com.log  access;
}
upstream www_test_com {                      
        server 192.168.88.188:80;
        server 192.168.88.189:80;
}
upstream www_test_com_include {
        server 192.168.88.11:80;
        server 192.168.88.12:80;
}
七、Srcache配置

该架构是给论坛做帖子缓存的,注意只能缓存帖子,目录不能缓存是openresty +srcache+reids2-nginx-module组成:入口是openresty,缓存是codis集群,上游服务器是iis源站
其中http区域配置为删除过期key,更新key的作用,由新第维护lua脚本,配置如下:

http {
    server {
        listen       80;
        server_name  www.test.com;
        allow  192.168.88.0/24;
        allow  192.168.188.0/24;
        deny all;
        location ~ /delkey/(.*) {
                internal;
                set $redis_key $1;
                redis2_query del $redis_key;
                redis2_pass redis_server;
        }
    }
    include proxy.conf;
    include vhosts_all/*.conf;
}

具体源站配置,放在vhost下,目前只有www.test.com域名,配置如下:

upstream www_test_com {                      
        server 192.168.88.188:80;
        server 192.168.88.189:80;
}

server {
      listen       80;
      server_name  www.test.com;
      more_clear_headers  "X-AspNet-Version";
      more_clear_headers  "X-Powered-By";
      location / {
        default_type text/html;
        srcache_methods GET;
        srcache_response_cache_control on;
        srcache_store_statuses 200;
        srcache_store_max_size 1024000;
        set $key $host$uri;
        set_escape_uri $escaped_key $key;
        srcache_fetch GET /redis_get $key;
        srcache_default_expire 0;
        srcache_max_expire 1h;
        srcache_store PUT /redis_set 
        key=$escaped_key&exptime=$srcache_expire;
        add_header X-Cached-From $srcache_fetch_status;
        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;
        access_log /data/wwwlogs/access_www.test.com-redis.log srcache_log;
        proxy_pass http://www_test_com;

     }
     location = /redis_get {
             internal;
             set $redis_key $args;
             redis_pass redis_server;
     }
     location = /redis_set {
             internal;
             set_unescape_uri $exptime $arg_exptime;
             set_unescape_uri $key $arg_key;
              redis2_query set $key $echo_request_body;
             redis2_query expire $key $exptime;
             redis2_pass redis_server;
     }
 }
八、Upsync配置

该项目是动态上下负载,架构为nginx+nginx-upsync-module+consul,配置文件只需要对具体域名进行修改,如下:

server
{
    listen 80;
    server_name www.test.com;
    index index.html index.htm index.shtml;
    location / {
        proxy_pass http://www_test_com;
    }
    location = /upstream_show {
        upstream_show;
    }
    access_log  /data/wwwlogs/access_www.test.com.log  access;
}
upstream www_test_com {
    upsync 192.168.88.58:8500/v1/kv/upstreams/www.test.com/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
    upsync_dump_path /usr/local/nginx/conf/servers/dump_www.test.com.conf;
    include /usr/local/nginx/conf/servers/include_www.test.com.conf;
}
九、Websock配置

Websock协议为ws,如果还需要添加ssl支持,协议为https正常添加证书就行,websock支持长连接。

server
{
    listen 80;
    server_name www.test.com;
    index index.html index.htm index.shtml;
    location / {
            proxy_pass http://olc_yiche_com;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_read_timeout 28800;
            proxy_redirect    off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP        $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
}
map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
}

upstream www_test_com {                      
        server 192.168.88.188:80;
        server 192.168.88.189:80;
}
十、其他
1、只允许POST请求
location ~* /hd/api/prizehandler.ashx {
    if ($request_method = GET ) {
        return 403;
        }
        proxy_method POST; 
    proxy_pass http://apiwww_test_com;
}
2、禁止Agent
if ($http_user_agent ~* "(python-requests|Java/1.8.0_40|Java/1.0.0_07|Java/1.7.0_67|Mac OS X 10_7_5|Iceweasel|curl|spider|ChinaCache)") 
{ 
       return 403; 
}
3、设置过期时间
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{ 
       expires      30d;
       proxy_pass http://image_test_com;
}
4、设置权限
location / {
       auth_basic "Please input Username and Password";
       auth_basic_user_file /usr/local/nginx/conf/.pass_file;
}
5、rewrite忽略大小写
rewrite (?i)^/newsimg_(\d+)x(\d+)/(.*)$ /videoimgnew.php?w=$1&h=$2&dir=$3 break;
6、404冗余

方法一
通过$request_filename判断

if ( !-f $request_filename ){
     proxy_pass http://image_test_com;
     break;
}

方法二
if判断效率比较低,可以使用try_files

location / {
    try_files $uri @backend;
}
location @backend {
     proxy_pass http://image_test_com;
}

方法三
通过error_page功能

location / {
        error_page 404 500 = @fallback;
        proxy_pass http://image_test_com;
    }
location @fallback {
     proxy_pass http://imagebak_test_com;
}
7、url大小写转换

http区域配置如下

   perl_set $url ' 
   sub {
   my $r = shift;
   my $re = lc($r->uri);
   return $re;
   } ';

域名server区域配置如下

    if ($uri ~ [A-Z])
    {
      rewrite ^(.*)$  $url last;
    } 
8、支持跨域

字体支持所有域名跨域调用,某些客户端可能支持的不太友好

location ~* /topics/iconfont/
    {
           add_header Access-Control-Allow-Origin *;
}
9、SSL支持

该域名配置同时支持http与https,配置如下:

server
{
    listen 80;
    listen 443;
    server_name zhongce.m.yiche.com;
    index index.html index.htm index.shtml;
        ssl                         on;
        ssl_certificate             globalsignssl/server.cer;
        ssl_certificate_key      globalsignssl/server.key;
        ssl_prefer_server_ciphers   on;
        ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
        ssl_protocols               TLSv1.2 TLSv1.1 TLSv1;
        ssl_session_cache           shared:SSL:10m;
        ssl_session_timeout         60m;
    location / {
         proxy_pass http://www_test_com;
     }
}
10、tcp负载

需要开启stream模块,如果要支持ssl,需要开启stream_ssl模块
http区域配置如下:

cat /usr/local/nginx/conf/nginx.conf
user  www www;
worker_processes  auto;
worker_cpu_affinity auto;
error_log  logs/error.log  error;
pid        logs/nginx.pid;
worker_rlimit_nofile 409600;
events
{
  use epoll;
  worker_connections 409600;
}
stream {

log_format basic '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time';

log_format proxy '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

include tcpupstream/*.conf;
}

tcp负载配置如下:
cat /usr/local/nginx/conf/tcpupstream/test12306.conf

upstream test_12306 {
        server 192.168.88.21:12306;
        server 192.168.88.22:12306;
 }
server {
        listen 12306;
        proxy_connect_timeout 10s;
        proxy_timeout 30s;
        proxy_pass test_12306;
        access_log /data/wwwlogs/access_test12306.log proxy;
}

Nginx中转Shadowsocks与负载均衡

现在介绍Nginx的方法,还是先安装:

#安装
yum install epel-release
yum -y install nginx nginx-mod-stream
#debian
sudo apt update
sudo apt install nginx libnginx-mod-stream

然后在Nginx的主配置文件内写一个include,因为我们需要用到stream段,这个段和http段是平级的,不能内嵌到http段使用:

#添加
echo "include /etc/nginx/tcp.d/*.conf;" >> /etc/nginx/nginx.conf

创建一个存放配置文件的目录:

#创建文件夹
mkdir -p /etc/nginx/tcp.d

新建一个配置文件:

#配置文件
nano /etc/nginx/tcp.d/ssproxy.conf

写入如下配置:

stream {
     upstream local {
     server 1.2.3.4:55555;
 }
 server {
     listen 50003;
     listen 50003 udp;
     proxy_pass local;
 }
 }

这边我使用的是weight(权重)模式,可以去掉这两个设置让Nginx默认用于轮询模式。

#
#firewall rules
sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload