通过Nginx解决网络隔离实践记录详解_nginx

来源:脚本之家  责任编辑:小易  

首先排除是否为网络问题:检查了iptable等。同时思考,如果真的是网络问题,不应该运行一段时间后,才出现无法接受新连接的现象。为了验证,当出现问题时,我又重新启动Nginx,发现又可以接收新的请求了。也就是说出现问题时,只需要重启Nginx就可以解决,那么自然不是网络因素。判定是否是Nginx本身的问题(不一定是指代码包括我写的配置文件):因为这个代理服务器是为了测试fastsocket项目的稳定性,所以 Nginx是加载了fastsocket优化服务的。这时,就需要最纯粹的Nginx环境。我去掉了fastsocket服务,然后再用同样的配置启动 Nginx。这时,就排除了Nginx本身的问题。那么,究竟是否是fastsocket的bug呢?这里先做一个小广告:fastsocket是新浪主导的一个开源项目,其通过封装socket套接字调用,无需改动服务程序,即可大幅提升服务程序性能。作者也是其中的维护者之一。这里小小推广一下:https://github.com/fastos/fastsocket。当使用fastsocket默认加载参数时,nginx运行一段时间就无法接受新连接请求了。定位fastsocket问题:fastsocket的大部分优化功能都是有功能开关的,默认会使用一些功能,同时可以在加载动态模块时,使用参数指定e799bee5baa6e4b893e5b19e31333339653731是否打开开关。这时,先做实验,从所有功能关闭开始,逐渐打开功能开关,最后定位到enable_listen_spawn功能打开时,就会出现问题。并多次做实验,确定这是一个必现的问题。当确定可以重现后,想这难道是一个fastsocket的bug吗?于是,先跟林晓峰同学说了一声,告诉他我的发现,毕竟fastsocket是他在sina时的工作,他最为熟悉代码。他说这可能是Nginx的配置使用了accept_mutex。我的配置文件虽然没有配置accept_mutex,但是没想到Nginx的accept_mutex是默认打开的。但是他忘了为什么会这样了?依稀记得是Nginx hang在了mutex中,具体原因记不清了。所以fastsocket的说明也是要求disable accept_mutex。因为我一直以来有这还不错的求知欲,所以一定要搞清楚这个问题。同时我认为,如果真的是一启用accept_mutex,fastsocket和nginx就会有兼容问题,那也应该算是fastsocket的bug,应该将其解决掉。定位Nginx hang在什么位置:这个很简单,使用strace-p跟踪Nginx的每个worer进程。发现大部分worker进程是在不断的epoll_wait,而其中一个worker进程,始终停留在epoll_wait中。重试多次,每次都是停留在epoll_wait中。现在已经确定了本次问题,当使用fastsocket的enable_listen_spawn功能时,也就是fastsocket自动为当前CPU创建本地的listen socket套接字时,就会出现问题。解决问题当定位到问题时,就需要一步一步的找到原因,查看为什么一个worker进程始终停留在epoll_wait中。这时候,其实思考还是要优于动手。先思考,再动手,动手之后,看到结果,再做进一步思考。查看该worker进程停留在epoll_wait的什么位置:只能通过日志形式来判断hang在epoll_wait的哪个位置?这时,不能用内核普通的printk来打印日志,不然就会淹没于大量正常工作worker进程打印的日志中。我们需要根据pid来打印日志。再做一个小广告:我做了一个内核小工具git@github.com:gfreewind/unit_perf.git。是用来定位内核代码的性能瓶颈工具,和一些辅助工具。大家觉得还可以的话,就给赞个星星。它提供一个宏UP_PID_INFO_LOG用于打印指定PID的日志,pid可以通过proc来指定。这样我在epoll_wait中增加了大量的日志。在Nginx启动后,通过proc指定就打印某个worker进程的日志。最后发现epoll_wait是因为指定了无限等待时间,所以该worker进程一直在hang住。Nginx让一个worker进程无限等待,这稍微颠覆了我对Nginx的认识。我认为Nginx一直都是使用无阻塞的系统调用,至少核心模块是这样处理的。那么为什么会出现这个现象呢?这时候,就需要思考,而不是动手了。毫无疑问,accept_mutex是一个关键。它本身是用于均衡不同worker进程的负载。稍微阅读一点Nginx相关的 代码,就可以明白。在Nginx无法接收新连接请求时,一定是该轮到hang住的进程接收新连接请求。所以尽管其它进程没有hang住,但是它们是无法接 受新请求,而能够接收新请求的进程却hang住,这样就导致了问题的产生。为什么hang住的进程无法接收到新的请求呢?这时还是思考优先。首先要勾画标准的内核TCP连接的过程,然后对比启用fastsocket 后,TCP连接的过程。很可能是这两者之间的区别,造成了问题。尤其是启用了spawn socket时,与标准流程的不同。spawn socket时,实际上为每个cpu都创建了一个本地listen 套接字的hash表,与全局的listen表区分开。这样一方面访问全局hash表时需要的锁,另一方面也做到了将TCP会话做到本地,可以尽量命中 cache。对于同一个CPU,由于有两个listen表的存在,所以在收到新的TCP连接请求时,必须先检查本地的listen表,然后再检查全局表。根据这样的流程和现象,应该是所有的连接请求,都被发到其它的CPU,并且匹配中了其它CPU的本地listen表,所以全局表中的listen socket套接字一直没有被匹配到。那么hang住的进程,既没有连接请求匹配本地listen表中的套接字,而全局表也一样,因为被请求都被其它CPU命中了本地的套接字。所以问题更为明朗了,hang住的进程所在的CPU不能收到任何新连接请求。这时其实已经到了冲刺的时候了。开始的时候,我还想着,是否是fastsocket影响了数据包的分发,还想检查一下代码。但一想,还是先看看 RPS的设置吧—虽然我没有设置网卡的任何RPS。结果出乎我意料,原来阿里云ECS服务器默认就把网卡的RPS设置了,唯一的外网网卡的RPS设置为 了0000,所以只有CPU 0能收到新连接请求,而另外的CPU1收不到任何的连接请求,这就造成了运行在CPU1上的worker进程hang住。最后我修改了该网卡的RPS设置,使其可以将数据包分发到不同的CPU上。这样在加载了fastsocket后,即使打开了accept_mutex,Nginx也可以正常工作了。本次过程,虽然最后发现只是服务器配置的问题,但整个儿过程还是收获不少。唯一的遗憾,是还没有定位Nginx对与epoll_wait的超时计算。开始的时候,都是500ms,后面因为什么因素变成了无限。这留到有时间的时候,再阅读Nginx源码吧www.zgxue.com防采集请勿采集本网。

需求

最近需要迁移Node线上服务,于是新申请了两台线上服务器;

1、理论百方面的,查阅有关资料、通过网络媒体等手段弥补不足;2、实际操作方面的,通过虚心向老员工请度教,自己努力实践,得到解决;3、专业性的问题,积极与指导教师联系,促进问题的有效解回决

部署服务器后,需要验证服务是否正常,办公环境与线上环境网络是隔离的,无法直接访问;但是,线上服务器可通过部署服务器访问,而办公网络是可以访问部署机的;

这个设备主要用来解决网络安全问题的,尤其是在那些需要绝对保证安全的保密网,专网和特种网络与互联网进行连接时,用来防止来自互联网的道攻击和保证这些高安全性网络的保密性、安全性、完整性。

所以,可通过在部署机上配置代理的方式,办公环境请求部署机,然后把请求代理到线上服务的方式验证服务是否正常。

之前遇到过类似的,修改了几个参数解决了: net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_syn_retries = 3 net.ipv4.tcp_synack_retries = 3 net.ipv4.tcp_tw_reuse = 1

整个网络结构如下图所示:

nginx是异步非阻塞的。每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。

Nginx安装

开启后,使各个连接的电脑间不能相互访问,起到隔离作用,来保护不同用户间的数据安全。这个功能一般用着公共wifi或者使用人数多的wifi信号

下载

下载页面: http://nginx.org/en/download.html选择版本鼠标右键拷贝链接地址

# 下载[work@40-10-14 opt]$ wget http://nginx.org/download/nginx-1.18.0.tar.gz# 解压文件[work@40-10-14 opt]$ tar -xvf nginx-1.18.0.tar.gz

安装

# 1. 默认安装:root权限进入解压后的目录,执行如下命令安装[root@40-10-14 nginx-1.18.0]# ./configure && make && make install# 2.指定目录:安装到指定的/opt/nginx目录[work@40-10-14 opt]$ mkdir /opt/nginx[work@40-10-14 nginx-1.18.0]$ ./configure --prefix=/opt/nginx && make && mae install

默认安装,非root权限会报如下错误

mkdir: cannot create directory `/usr/local/nginx': Permission deniedmake[1]: *** [install] Error 1make[1]: Leaving directory `/opt/nginx-1.18.0'make: *** [install] Error 2

默认安装后,查看nginx的安装目录,可以看到安装在/usr/local/nginx目录下

[root@40-10-14 opt]# whereis nginxnginx: /usr/local/nginx

1.建议使用指定目录方式安装。如果切换为root权限去安装,后续修改config文件也需要root权限

2.或者root安装后,修改权限为普通用户可操作也行

添加软链

添加软链,使得nginx命令全局能访问,每次运行就不用切换到安装目录中了

# 添加软链[root@40-10-14 sbin]# ln -s /opt/nginx/sbin/nginx /usr/local/bin/# 查看版本[root@40-10-14 sbin]# nginx -vnginx version: nginx/1.18.0

常用命令

启动:nginx 停止:nginx -s stop 重启:nginx -s reload 帮助命令: nginx -h

强制停止:

# 查看linux进程id[root@40-10-14 ~]# ps -ef | grep nginxnobody 45198 1 0 16:12 ? 00:00:00 nginx: worker processroot 51261 50692 0 17:00 pts/0 00:00:00 grep nginx# 关闭进程[root@40-10-14 ~]# kill 45198# 之前的进程已被关闭[root@40-10-14 ~]# ps -ef | grep nginxroot 51277 50692 0 17:00 pts/0 00:00:00 grep nginx

配置代理

配置两台机器的请求转发,编辑nginx安装目录下的nginx/conf/nginx.conf文件即可

#user nobody;worker_processes 1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; #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; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # 请求需要转发到如下两台机器上,流量平分;指定IP和端口 upstream zpserver { server xx.xx.xx.22:10001; server xx.xx.xx.23:10001; } server { # nginx服务端口为80 listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; # /user根路径的请求才转发 location /user { root html; index index.html index.htm; proxy_pass http://zpserver; } #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; # } #}}

注意:修改完nginx的配置文件后,需要运行nginx -s reload才能生效

验证

由于线上服务很多都是需要登录的,所以访问时需要使用域名访问,而不能使用IP访问,因为cookie都是跟域名绑定的

解决这个问题很简单,配置本机host即可

# IP为Nginx服务器IPxx.xx.xx.14 xxx.daojia.com

通过上述配置,在本机浏览器上请求xxx.daojia.com即可间接通过部署机上的Nginx访问到线上服务,以此在内网测试服务是否正确;待服务无异常后,把线上流量切过来即可。

到此这篇关于通过Nginx解决网络隔离实践记录详解的文章就介绍到这了,更多相关Nginx 网络隔离内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

通过设置nginx的client_max_body_size解决nginx+php上传大文件的问题:用nginx来做webserver的时,上传大文件时需要特别注意client_max_body_size这个参数,否则会中断在nginx的请求中,在php中是无法记录到访问的.一般上传大文件流程:首先修改php.ini文件:file_uploads on 是否允许通过HTTP上传文件的开关。默认为ON即是开upload_tmp_dir – 文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹upload_max_filesize 8m 望文生意,即允许上传文件大小的最大值。默认为2Mpost_max_size 8m 指通过表单e799bee5baa6e78988e69d8331333335343963POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M一般来说,设置好上述四个参数后,在网络正常的情况下,上传的文件是不成问题的但如果要上传>8M的大文件的话,只设置上述四项还不一定能行的通。除非你的网络真有100M/S的上传高速,否则你还得继续设置下面的参数。max_execution_time 600 每个PHP页面运行的最大时间值(秒),默认30秒max_input_time 600 每个PHP页面接收数据所需的最大时间,默认60秒memory_limit 8m 每个PHP页面所吃掉的最大内存,默认8Mwebserver用的是nginx,在nginx的conf中添加了一个参数:默认是1M,需要增大的话。在nginx.conf中增加一句client_max_body_size 30m;重启即可30m表示最大上传30M,需要多大设置多大内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • nginx 内置变量详解及隔离进行简单的拦截
  • nginx代理axios请求以及注意事项详解
  • 详解nginx中基本的内存池初始化配置
  • 一文搞懂nginx限流(简单实现)
  • nginx + tomcat实现请求动态数据和请求静态资源的分离详解
  • 详解阿里云nginx服务器多站点的配置
  • apache和nginx的优缺点详解_动力节点java学院整理
  • nginx安装第三方模块的方法
  • nginx 代理与负载均衡详解
  • 使用 nginx 部署静态页面的方法
  • 对nginx支持ssl的性能进行优化的方法
  • 如何解决nginx上传大文件的限制
  • 如何解决Nginx服务自动关闭问题
  • Welcome to nginx 怎么解决
  • nginx怎么解决session
  • 实习中遇到的问题及解决方法!
  • 怎么实现内外网的完全隔离
  • nginx waiting 比较高的解决方法谁有
  • nginx怎么解决高并发
  • WIFI好管理里面,主人网络 打开AP隔离 是啥意思 如图:
  • 如何解决网络适配器问题
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全星外虚拟主机华众虚拟主机linuxwin服务器ftp服务器dns服务器tomcat nginxzabbix云和虚拟化服务器其它首页服务器nginxnginx 内置变量详解及隔离进行简单的拦截nginx代理axios请求以及注意事项详解详解nginx中基本的内存池初始化配置一文搞懂nginx限流(简单实现)nginx + tomcat实现请求动态数据和请求静态资源的分离详解详解阿里云nginx服务器多站点的配置apache和nginx的优缺点详解_动力节点java学院整理nginx安装第三方模块的方法nginx 代理与负载均衡详解使用 nginx 部署静态页面的方法对nginx支持ssl的性能进行优化的方法nginx提示:500 internal servernginx 多站点配置方法集合权限问题导致nginx 403 forbiddenginx fastcgi错误primary scripnginx服务器的反向代理proxy_pasnginx 403 forbidden的解决办法nginx伪静态配置和常用rewrite伪nginx下301重定向域名的方法小结详解nginx服务器中配置超时时间的windows下nginx+php5的安装与配置nginx服务器基本的模块配置和使用全攻略nginx利用referer指令实现防盗链配置nginx提示502 页面的解决方法nginx加php-fpm出现502 bad gateway错误的使用nginx代理上网的方法使用 nginx 部署静态页面的方法nginx开启一个参数就能让你的web性能提升为何要小心nginx的add_header指令详解nginx中使用gzip_http_version解决cdn只支详解nginx前端根据$remote_addr分发方法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved