
nginx 403 Forbidden错误的原因和解决方法


下载地址: 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\, 如图所示:

启动nginx有两种方式:
直接双击 nginx.exe ,双击后一个黑色的弹窗一闪而过 。 这样就是启动成功了。
用 管理员权限 打开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
访问 http://localhost/
注:截图中的1.54 是我修改 index.html 添加的,默认是没有。
上面的配置nginx后,在电脑关机后再重启时,nginx 就会停止。
如果想要每次windows 开机后,nginx都处于运行状态,请看下面的操作配置。
下载地址: https://github.com/kohsuke/winsw/releases
我选择的是 winsw-v2.1.2 , 它有两个版本:
WinSW.NET2.exe (适用于32位系统)
WinSW.NET4.exe (适用于64位系统。我下载这个版本)
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.exe、nginxservice.xml 是上面步骤 复制和创建 的文件。
4)用 管理员权限 打开 cmd ,进入 D:\develop_tools\nginx\nginx-1.15.4 目录下,执行安装命令: nginxservice.exe install 。
5)桌面 –> 此电脑(我的电脑)—> 右键,选择 管理 –> 服务和应用程序 –> 服务,找到 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域名的时候,该动态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;
}
}
作用:是用来定义服务器组的模块
使用范围:proxy_pass、fastcgi_pass、memcached_pass等
结构:
upstream groupName {server serverName1 [param1=value1] [param2=value2] [param3];server serverName2;}
groupName即为组名,是自定义的,如:upstream webserver;
upstream中的server用来指定一个服务器。
server的类型可以是:
例如:
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中可用的参数:
用法:weight=数字;
server 192.168.18.201 weight=4;
用法:max_fails=3;
如:
server 192.168.18.202 max_fails=3;
用法:fail_timeout=时间;
如:20秒就算连接失败
server 192.168.18.202 max_fails=3 fail_timeout=20s;
用法:server serverName backup;
如:
server 192.168.18.203 backup;
用法:server serverName down;
如:
server 192.168.18.203 down;
用法:max_conns=数字;
如:
server 192.168.18.202 max_conns=1024;
4台机器:
步骤:
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,查看显示内容
依次刷新会在这三台机器之间循环(这种专业的叫法叫轮询)
用法:hash key;
这个key可以包含文本,变量或者文本与变量的组合。
针对上面的实验:我们在upstream中加入ip_hash,再查看:
发现我们无论怎么刷新,访问的都是201上面的文件(因为客户端的IP没变)
下载
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
所谓代理(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,如下图:

那么使用上面这个配置,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 服务器。
本文主要涉及了如下模块:
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;
}
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!";
}
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;
}
利用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;
}
该架构是给论坛做帖子缓存的,注意只能缓存帖子,目录不能缓存是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;
}
}
该项目是动态上下负载,架构为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协议为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;
}
location ~* /hd/api/prizehandler.ashx {
if ($request_method = GET ) {
return 403;
}
proxy_method POST;
proxy_pass http://apiwww_test_com;
}
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;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{
expires 30d;
proxy_pass http://image_test_com;
}
location / {
auth_basic "Please input Username and Password";
auth_basic_user_file /usr/local/nginx/conf/.pass_file;
}
rewrite (?i)^/newsimg_(\d+)x(\d+)/(.*)$ /videoimgnew.php?w=$1&h=$2&dir=$3 break;
方法一
通过$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;
}
http区域配置如下
perl_set $url '
sub {
my $r = shift;
my $re = lc($r->uri);
return $re;
} ';
域名server区域配置如下
if ($uri ~ [A-Z])
{
rewrite ^(.*)$ $url last;
}
字体支持所有域名跨域调用,某些客户端可能支持的不太友好
location ~* /topics/iconfont/
{
add_header Access-Control-Allow-Origin *;
}
该域名配置同时支持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;
}
}
需要开启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的方法,还是先安装:
#安装 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