Nginx-配置进行AB测试

原文链接: 何晓东 博客 应用场景:电商活动,准备了A B两套风格的促销页面,想让一半人看到 A 页面,另一半人看到 B 页面,这样来测试两种的转化成交效果。其他在大版本升级测试的时候,防止有bug,可以将小规模流量分发到最新代码的服务器。前置条件:nginx 需要安装 ngx_http_split_clients_module 模块,借助这个模块的 split_clients 指令完成分流,示例配置如: http { split_clients "${remote_addr}AAA" $variant { 0.5% .one; 2.0% .two; * ""; } server { location / { index index${variant}.html; } }以上的配置会将原始 ip 地址加上 AAA 使用 MurmurHash2 算法进行 hash,在此示例中,如果哈希值从 0 到 21474835(0.5%)对应于变量 $variant 的 ".one" 值, 哈希值从 21474836 到 107374180(2%)对应于值 ".two",哈希值从 107374181 到 4294967295 对应于值""(一个空字符串)。就这么简单就实现了分流到不同的页面,之后可以统计这个不同页面的转化成交率。 © 原创文章,内容翻译自 ngx_http_split_clients_module 文档 一如既往推荐一些 付费课程,通过我的二维码购买可以享受八折优惠。

June 26, 2019 · 1 min · jiezi

如何挑选注册到合适的域名

为了选择一个好域名,有很多需要注意的地方。 我已经准备了一份详细的参考准则列表,尽管无法满足所有这些标准(这是不可能的),但仍然为你提供了一些需要考虑的提示信息。在文章最后,我会告诉你在哪里注册域名最好。 好了,我们继续吧! 1、选择.com后缀大多数时候,互联网用户在浏览时会假设网址以 .com 结束,如果采用 .net、.info、.tv,或其他后缀,那很可能会给潜在的访客留下障碍。话虽如此,仍然有很多成功的网站使用 .net(或其他)后缀,但对于绝大部分人来说,.com 是最理想的。 2、短小精致越短越好,足够表明意思。 3、容易朗读和拼写目的是让你和别人可以轻松分享,如果大家不必停下来思考如何朗读或拼写,那么分享起来就更加容易。 4、不含连字符包含连字符的域名不够流畅,看起来也很奇怪。 5、使用关键字你的域名是使用一两个关键字的最佳位置之一,而且越紧凑、越接近域名的开头越好。 6、考虑使用你的名字我强烈建议你将名字注册为域名,即使你没有计划对其进行任何操作。为什么?因为你永远不知道自己将来是否会成为家喻户晓的人物。 如果你打算使用博客来销售服务,或者你希望演讲或成为出版作家,那么你的名字可能就是最完美的域名。 如果你的名字非常难以阅读或拼写,那你可以考虑使用昵称,或者定义一个全新的名字。 7、使其可扩展你永远不知道自己的业务可能会如何扩展,所以请避免使用限制性名称。例如,LovelyCat.com很不错,但是如果你想谈论狗狗呢?此外,我还建议避免使用特定于生命阶段的名称,例如AllAboutMyCrazyBabies.com,现在好了,但他们蹒跚学步的岁月过得这么快! 8、避免使用单词如果你拥有广泛的兴趣爱好,并且还希望在域名中使用所有这些关键字,那你很可能想要将它们全部串在一起。但我建议不要这样做,因为这可能会令人困惑。 9、避免使用晦涩的术语如果你试图吸引广泛的受众群体,那就请避免在域名中使用特定范围的字词,因为这会导致你的 Niche 之外的访客不熟悉。 10、但是所有好名字都被拿走了!你很可能已经想出了一个完美的域名,但是在注册时才发现它已被采用。不要害怕失败,尝试在词库中查找类似的单词,询问别人的想法,向上或向左混合单词,使用你一直说的标语、昵称或短语。 有时候实在对域名想不出来,我们可以借助一些工具来给我们 idea,比如: namemesh.comBustname.comdomainr.com 这三个网站使用大数据,有时取出来的名字挺酷的, 有时会加一些像 ”ly” 或者 “ista” 的后缀,让整个域名看起来更酷,像一个品牌官方网站。Faucetista.com 或 Brushtoothly.com 相比 BestBrushTooth.com 或 FaucetReviews.com 更加吸引人,对吧? 11、确保该名称在其他社交媒体网站上可用选择你的域名时,请检查其他社交媒体,以确保它可以在这些网站上使用。如果你在博客、Twitter、Facebook 等媒体上使用相同的名称,那么你的品牌会更加巩固,并且更令人难以忘怀。 12、不要过度思考我听到很多人在这个问题上陷入困境,因为他们害怕做出错误的选择。最常见的理由是他们找不到可用的 .com。如果你也这样,那就做出最好的猜测并继续前进,一个不太完美的域名比没有更好,尽力而为,开始注册吧! 希望我已经说服了你,那么该怎样注册域名呢? 如果你没有网站并且不打算尽快创建一个,只需在输入框中键入你想要的域名,然后点击搜索按钮即可开始使用。

June 25, 2019 · 1 min · jiezi

Nginx-支持单域名多-Vue-服务配置备忘

最近开发时,遇到需要使用同一域名承载多个前端项目的场景,具体需求如下: /v2 访问新版本前端项目/api 访问后端 Spring Boot 接口服务/ 访问默认前端项目1. Nginx 配置内容server { listen 80; listen [::]:80; server_name _; server_name_in_redirect off; proxy_set_header Host $host; location /api { proxy_pass http://0.0.0.0:0000; } location / { index index.html; root /path/to/main/web/app; } location /v2 { index index.html; root /path/to/v2/web/app; }}2. 修改 publicPath 配置仅仅通过上述配置,在访问新版前端时,会遇到资源文件无法找到的问题。 此时,可以通过对新版前端 vue.config.js 文件中的 publicPath 进行配置,以规避这一问题( 注:该方法仅适用于 Vue-Cli 3.x 构建的项目 ): module.exports = { ... publicPath: '/v2/', ...};参考链接Understanding the difference between the root and alias directives in Nginx;Can't get two single page applications to run together on one server using nginx;

June 24, 2019 · 1 min · jiezi

基于EC2配置一个全栈服务实例nginx-tomcat-mysql

最近世道动荡,在前往高级的路上走出了车到山前必有路,睁眼一看是绝路的感觉。所以就索性瞎折腾一下。领了一个服务器,开启了一个伪全栈的运维之路,各种服务线上部署。 服务器申请与实例连接接腾讯免费七天,阿里要钱,山里娃就在亚马逊AWS申请了一个可免费使用一年的EC2云服务器,申请链接,步骤很简单,跟着提示一步一步整就是,唯一要提醒的就是,需要准备一张信用卡,一张能支持外汇($)结算的最好。申请到资格后,选择你的云服务,选择对应的区域,你需要给服务实例选择一个操作系统,linux,windows常用的都可选(注意观察,我们只选免费的,很重要,很重要, 很重要)。然后配置安全组,bla,bla,....,然后启动实例。保存好你的密钥,然后打开ssh终端连接实例。操作步骤可以打开管理面板,选择实例-》选择实例-》连接-》根据面板提示连接。 安装与配置基础组件安装与配置登录进服务后,就可以开启一段服务器配置之旅了。如果你和我一样,对Linux常用的命令行还不熟悉,你可能需要这样一份手册:Linux常用命令大全。我选择的镜像是Ubuntu,如果你和我选择的一样,那么下面的命令你可以直接用,如果是redhat或者centos,有些命令,你需要自己去探索。先把一些常用的工具安装上: sudo apt-get install unzip // 解压工具 sudo apt-get install git // git工具 sudo apt-get install wget // 下载工具 sudo apt-get install nginx // 下载nginx node服务安装与配置node安装是一个相对简单的过程,你可以直接查看官网,然后按照提示一步一步进行。非常重要的一步就,你需要建立你命令的软链接。在这里我列出自己的操作步骤: -下载:sudo wget https://nodejs.org/download/r... 建一个文件夹:sudo mkdir -p /usr/local/lib/nodejs解压到上面新建文件夹:sudo tar -xJvf node-v8.16.0-linux-x64.tar.xz -C /usr/local/lib/nodejs建立node可执行命令链接:sudo ln -snf /usr/local/lib/nodejs/node-v8.16.0-linux-x64/bin/node /usr/bin/node重复上述步骤,建立npm可执行链接测试有效性:node -v // node-v8.16.0jdk的安装与配置centos可参考链接,同时也适用于ubuntu,现在使用wget下载jdk有点麻烦(需要鉴权),所以我是本地下载,然后scp上传上去的,以下是我的操作: 上传:scp -i "big.pem" jdk-8u211-linux-x64.tar.gz ubuntu@ec2-13-114-140-94.ap-northeast-1.compute.amazonaws.com:/home解压并重命名为tomcat:tar xzf jdk-8u211-linux-x64.tar.gz建立链接java,javac,jar:sudo ln -snf /home/tomcat/bin/java(你解压后的目录) /usr/bin/java, 其他两个照做测试: java -versiontomcat服务的安装与配置下载 wget http://mirrors.tuna.tsinghua....解压进入到bin目录,然后执行 ./startup.sh实例ip查看服务运行情况(前提是在安全策略允许了8080端口的连接)数据库的安装与配置mysql的安装复杂一点,折腾了自己大量时间,在redhat8上没有安装成功mysql5,也迫使我把镜像换成了ubuntu,曲折的路就不多说了,直接说顺利的。如果直接使用apt-get install mysql安装,默认是安装mysql8,所以在开启安装前,需要借助mysql-apt-config增加一段配置,具体安装步骤,请查考前人栽下的树:Ubuntu 16.04安装MySQL:通过APT方式安装。安装好之后,开启mysql,并登录 ...

June 24, 2019 · 2 min · jiezi

使用NGINX作为HTTPS正向代理服务器

NGINX主要设计作为反向代理服务器,但随着NGINX的发展,它同样能作为正向代理的选项之一。正向代理本身并不复杂,而如何代理加密的HTTPS流量是正向代理需要解决的主要问题。本文将介绍利用NGINX来正向代理HTTPS流量两种方案,及其使用场景和主要问题。 HTTP/HTTPS正向代理的分类简单介绍下正向代理的分类作为理解下文的背景知识: 按客户端有无感知的分类普通代理:在客户端需要在浏览器中或者系统环境变量手动设置代理的地址和端口。如squid,在客户端指定squid服务器IP和端口3128。透明代理:客户端不需要做任何代理设置,“代理”这个角色对于客户端是透明的。如企业网络链路中的Web Gateway设备。按代理是否解密HTTPS的分类隧道代理 :也就是透传代理。代理服务器只是在TCP协议上透传HTTPS流量,对于其代理的流量的具体内容不解密不感知。客户端和其访问的目的服务器做直接TLS/SSL交互。本文中讨论的NGINX代理方式属于这种模式。中间人(MITM, Man-in-the-Middle)代理:代理服务器解密HTTPS流量,对客户端利用自签名证书完成TLS/SSL握手,对目的服务器端完成正常TLS交互。在客户端-代理-服务器的链路中建立两段TLS/SSL会话。如Charles,简单原理描述可以参考文章。注:这种情况客户端在TLS握手阶段实际上是拿到的代理服务器自己的自签名证书,证书链的验证默认不成功,需要在客户端信任代理自签证书的Root CA证书。所以过程中是客户端有感的。如果要做成无感的透明代理,需要向客户端推送自建的Root CA证书,在企业内部环境下是可实现的。为什么正向代理处理HTTPS流量需要特殊处理?作为反向代理时,代理服务器通常终结 (terminate) HTTPS加密流量,再转发给后端实例。HTTPS流量的加解密和认证过程发生在客户端和反向代理服务器之间。 而作为正向代理在处理客户端发过来的流量时,HTTP加密封装在了TLS/SSL中,代理服务器无法看到客户端请求URL中想要访问的域名,如下图。所以代理HTTPS流量,相比于HTTP,需要做一些特殊处理。 NGINX的解决方案根据前文中的分类方式,NGINX解决HTTPS代理的方式都属于透传(隧道)模式,即不解密不感知上层流量。具体的方式有如下7层和4层的两类解决方案。 HTTP CONNECT隧道 (7层解决方案)历史背景早在1998年,也就是TLS还没有正式诞生的SSL时代,主导SSL协议的Netscape公司就提出了关于利用web代理来tunneling SSL流量的INTERNET-DRAFT。其核心思想就是利用HTTP CONNECT请求在客户端和代理之间建立一个HTTP CONNECT Tunnel,在CONNECT请求中需要指定客户端需要访问的目的主机和端口。Draft中的原图如下: 整个过程可以参考HTTP权威指南中的图: 客户端给代理服务器发送HTTP CONNECT请求。代理服务器利用HTTP CONNECT请求中的主机和端口与目的服务器建立TCP连接。代理服务器给客户端返回HTTP 200响应。客户端和代理服务器建立起HTTP CONNECT隧道,HTTPS流量到达代理服务器后,直接通过TCP透传给远端目的服务器。代理服务器的角色是透传HTTPS流量,并不需要解密HTTPS。 NGINX ngx_http_proxy_connect_module模块NGINX作为反向代理服务器,官方一直没有支持HTTP CONNECT方法。但是基于NGINX的模块化、可扩展性好的特性,阿里的@chobits提供了ngx_http_proxy_connect_module模块,来支持HTTP CONNECT方法,从而让NGINX可以扩展为正向代理。 环境搭建以CentOS 7的环境为例。 1) 安装对于新安装的环境,参考正常的安装步骤和安装这个模块的步骤(https://github.com/chobits/ngx_http_proxy_connect_module)),把对应版本的patch打上之后,在configure的时候加上参数--add-module=/path/to/ngx_http_proxy_connect_module,示例如下: ./configure \--user=www \--group=www \--prefix=/usr/local/nginx \--with-http_ssl_module \--with-http_stub_status_module \--with-http_realip_module \--with-threads \--add-module=/root/src/ngx_http_proxy_connect_module对于已经安装编译安装完的环境,需要加入以上模块,步骤如下: # 停止NGINX服务# systemctl stop nginx# 备份原执行文件# cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak# 在源代码路径重新编译# cd /usr/local/src/nginx-1.16.0./configure \--user=www \--group=www \--prefix=/usr/local/nginx \--with-http_ssl_module \--with-http_stub_status_module \--with-http_realip_module \--with-threads \--add-module=/root/src/ngx_http_proxy_connect_module# make# 不要make install# 将新生成的可执行文件拷贝覆盖原来的nginx执行文件# cp objs/nginx /usr/local/nginx/sbin/nginx# /usr/bin/nginx -Vnginx version: nginx/1.16.0built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)built with OpenSSL 1.0.2k-fips 26 Jan 2017TLS SNI support enabledconfigure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-threads --add-module=/root/src/ngx_http_proxy_connect_module2) nginx.conf文件配置 ...

June 24, 2019 · 5 min · jiezi

nginx网站性能优化篇4理解nginx的高并发原理及其配置调优

Nginx 是如何实现高并发的?Nginx 采用的是多进程(单线程) & 多路IO复用模型。使用了 I/O 多路复用技术的 Nginx,就成了”并发事件驱动“的服务器。其实现了异步,非阻塞,使用了epoll 和大量的底层代码优化。 如果一个server采用一个进程负责一个request的方式,那么进程数就是并发数。正常情况下,会有很多进程一直在等待中。 而nginx采用一个master进程,多个woker进程的模式。 master进程主要负责收集、分发请求。每当一个请求过来时,master就拉起一个worker进程负责处理这个请求。同时master进程也负责监控woker的状态,保证高可靠性woker进程一般设置为跟cpu核心数一致。nginx的woker进程在同一时间可以处理的请求数只受内存限制,可以处理多个请求。Nginx 的异步非阻塞工作方式正把当中的等待时间利用起来了。在需要等待的时候,这些进程就空闲出来待命了,因此表现为少数几个进程就解决了大量的并发问题。 [info] 题外话: 这和PHP扩展swoole的原理一样 每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker很聪明,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。 为什么 Nginx 不使用多线程?Apache: 创建多个进程或线程,而每个进程或线程都会为其分配 cpu 和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会耗光服务器资源。 Nginx: 采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量)(epoll),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。 配置调优1. 调整worker_processes 指Nginx要生成的worker数量,最佳实践是每个CPU运行1个工作进程。了解系统中的CPU核心数,输入 grep processor /proc/cpuinfo | wc -l# 或者htophtop2. 最大化worker_connections Nginx Web服务器可以同时提供服务的客户端数。与worker_processes结合使用时,获得每秒可以服务的最大客户端数 最大客户端数/秒=工作进程*工作者连接数 为了最大化Nginx的全部潜力,应将worker_processes设置为核心一次可以运行的允许的最大进程数1024。 3. 启用Gzip压缩 压缩文件大小,减少了客户端http的传输带宽,因此提高了页面加载速度。 4.为静态文件启用缓存 为静态文件启用缓存,以减少带宽并提高性能,可以添加下面的命令,限定计算机缓存网页的静态文件 第三点和第四点 具体看前 《【nginx网站性能优化篇(1)】gzip压缩与expire浏览器缓存》5. Timeouts keepalive连接减少了打开和关闭连接所需的CPU和网络开销,获得最佳性能需要调整的变量: 6. 禁用access_logs 访问日志记录,它记录每个nginx请求,因此消耗了大量CPU资源,从而降低了nginx性能。 完全禁用访问日志记录 access_log off; 如果必须具有访问日志记录,则启用访问日志缓冲 access_log /var/log/nginx/access.log主缓冲区= 16k 7. fastcgi 调优 fastcgi_connect_timeout 600;fastcgi_send_timeout 600;fastcgi_read_timeout 600;fastcgi_buffer_size 64k;fastcgi_buffers 4 64k;fastcgi_busy_buffers_size 128k;fastcgi_temp_file_write_size 128k;fastcgi_temp_path/usr/local/nginx1.10/nginx_tmp;fastcgi_intercept_errors on;fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;[info] 其实可以参考网上的lnmp一键压缩包,配置得就很好参考链接: ...

June 23, 2019 · 1 min · jiezi

nginx网站性能优化篇3反向代理实现负载均衡

注意,本篇文章为负载均衡的理论篇,后续找个机会推出实战篇。理论篇主要讲述如何配置负载均衡,配置负载均衡不难。但实战中要要注意几个点,比如如何做到多服务器之间的数据共享(session,file等),多cache服务器如何做到命中率高等等问题上一篇文章中我们通过反向代理了后端一台服务器,但随着网站访问的人越来越多一台服务器实在是顶不住,于是我们加了多台服务器,那么多台服务器又怎么配置代理呢? upstream test.com{# ip_hash;server 192.168.10.13:80;server 192.168.10.14:80 down;server 192.168.10.15:8009 max_fails=3 fail_timeout=20s;server 192.168.10.16:8080;}server { location / { proxy_pass http://test.com; }}实际上负载均衡也是通过反向代理的方式,但是proxy_pass只能写一个地址,所以我们把某些地址通过upstream作为一个集合来做反向代理就实现了负载均衡; upstream 负载均衡模块说明upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称test.com。这个名称可以任意指定,在后面需要用到的地方直接调用即可。 支持的负载均衡算法Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方调度算法。 轮询(默认)。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。ip_hash。每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。fair。这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。url_hash。此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx的hash软件包支持的状态参数在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有: down,表示当前的server暂时不参与负载均衡。backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。注,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。 配置负载均衡 upstream webservers { server 192.168.18.201 weight=1; server 192.168.18.202 weight=1; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://webservers; proxy_set_header X-Real-IP $remote_addr; }}注,upstream是定义在server{ }之外的,不能定义在server{ }内部。定义好upstream之后,用proxy_pass引用一下即可。如果定义在server内部就会报错: "upstream" directive is not allowed here in xxxxxx重启以后不断刷新208就会发现,是201和202的内容交替出现,然后分别查看其日志,达到了负载均衡轮询的效果; ...

June 22, 2019 · 1 min · jiezi

我用到的nginx

查看nginx配置文件位置方式11) netstat -anop | grep 0.0.0.0:80 查看nginx的pid2) ll /proc/4562/exe nginx运行的路径(比如查询到: /usr/sbin/nginx)3) /usr/sbin/nginx -t 查询nginx中nginx.conf文件位置方式2 nginx -t 直接查看位置 nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successfulnginx常用命令验证配置是否正确: nginx -t (也能查询nginx.conf配置文件位置)查看Nginx的版本号:nginx -V启动Nginx:start nginx快速停止或关闭Nginx:nginx -s stop正常停止或关闭Nginx:nginx -s quit配置文件修改重装载命令:nginx -s reload(常用)查看最后30行错误日志: tail -n30 /var/log/nginx/error.lognginx配置(请求转发,gzip)# 每行代码必须;结束# 全局块# nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等events { # events块 # 配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。}http { # http全局块 # 可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等 # 查看某个url有没有开启gzip # curl -H "Accept-Encoding: gzip" -I url地址 使用这个命令可以查看是否开启gzip # 举例 # curl -H "Accept-Encoding: gzip" -I http://47.100.11.151 这个是没有开启gzip # HTTP/1.1 200 OK # Server: nginx/1.10.2 # Date: Fri, 21 Jun 2019 22:49:09 GMT # Content-Type: text/html # Content-Length: 838 # Last-Modified: Sat, 16 Feb 2019 09:31:24 GMT # Connection: keep-alive # ETag: "5c67d86c-346" # Accept-Ranges: bytes # curl -H "Accept-Encoding: gzip" -I https://www.jd.com 这个是开启gzip(Content-Encoding: gzip) # HTTP/1.1 200 OK # Server: JDWS/2.0 # Date: Fri, 21 Jun 2019 22:49:50 GMT # Content-Type: text/html; charset=utf-8 # Content-Length: 30026 # Connection: keep-alive # Vary: Accept-Encoding # Expires: Fri, 21 Jun 2019 22:50:11 GMT # Cache-Control: max-age=30 # Content-Encoding: gzip # ser: 4.129 # Via: BJ-Y-NX-112(HIT), http/1.1 HZ-CT-1-JCS-25 ( [cRs f ]) # Age: 0 # Strict-Transport-Security: max-age=7776000 # 开启gzip功能, 该功能可放在 http{},server{},location{}中, 优先级别 location > server > http gzip on; # 开启该功能 gzip_min_length 1k; # 小于1k的文件将不会被gzip gzip_comp_level 2; # 压缩级别,1-9,数字越大,文件压缩比越高,压缩的越好 # 以下文件类型将会被压缩, text/html不用设置,只要开启,默认都会被压缩 gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png font/ttf font/otf image/svg+xml; gzip_vary on; # 是否在http header中添加Vary: Accept-Encoding,建议开启 gzip_disable "MSIE [1-6]\."; # 在IE6中禁用gzip server { # server全局块,做端口的监听 # server块:配置虚拟主机的相关参数,一个http中可以有多个server location [path] { # location块 } location [path] { } # nginx配置请求转发 # 云服务器IP: http://47.100.11.151 # 第三方API: http://t.weather.sojson.com/api/weather/city/101030100 # 跨域解决: # 配置1) proxy_pass http://t.weather.sojson.com/api/ # 当访问http://47.100.11.151/api/weather/city/101030100,其实就是访问http://t.weather.sojson.com/api/weather/city/101030100 # 配置2) proxy_pass参数 http://t.weather.sojson.com 最后没有/ # 访问 http://47.100.11.151/api/weather/city/101030100,其实就是访问http://t.weather.sojson.com/api/weather/city/101030100 # 推荐使用配置2 location /api/ { proxy_pass http://t.weather.sojson.com/api/; } }}

June 22, 2019 · 2 min · jiezi

Docker实战之简单部署VueJs项目7

关于docker的优势就不多介绍了,之前的文章已经说得比较明白了,那么在学习了docker的一些知识后,现在该用它来做点事儿了,^_^,有点小兴奋。接下来就来看看docker怎样去部署一个VueJs的项目,我们从以下三点来进行:VueJs项目初始化以及打包Nginx的配置Docker镜像文件VueJs项目初始化这里通过vue-cli对一个vuejs项目进行初始化,命令如下: vue init webpack projectName这里项目名称列如是docker-web,对项目初始化组件HelloWord.vue组件进行简单的修改 然后通过npm run build命令进行项目的打包 Nginx的配置这里首先需要从docker hub上面进行nginx进行的拉取,可通过docker pull nginx进行获取,获取完后,可通过命令docker image ls 命令来查看本地已存在的镜像列表然后在项目(docker-web)的根目录新增一个nginx.conf文件,配置如下: Docker镜像文件首先在项目(docker-web)的根目录新增一个Dockerfile文件,内容如下:然后需要通过Dockerfile这个文件来进行镜像的制作、运行,可通过docker build -t 镜像名称来构建制作一个镜像,如:再次查看该镜像是否已经构建完成。最后以这个镜像为基础运行一个容器。对于这部分的内容,如有不懂的地方,可查看我之前有关于docker镜像构建的文章哦。至此,所有准备工作已完成,然后在浏览器地址栏输入localhost:3000访问网页,即可看到刚才在docker-web这个项目的HelloWord.vue组件中修改的内容。 Over,接下来会通过docker对前端项目部署进行进一步的实战。

June 22, 2019 · 1 min · jiezi

困扰已久的问题cgifastcgiPHPfpm汇总

一个模糊的概念无论是php,python编程语言,还是apache,nginx服务器对于cgi协议是个绕不开的话题。安装,部署都会经常的看到,那么它们到底是干什么的,网上的答案非常的多!今天通过它们进行一波汇总,彻底告别这个难关。参考:https://www.dayuzy.com/?p=476 HTTP到cgi协议当浏览器的客户端输入网站走http协议到了web服务器,比如apache,这个大家都很清楚。web服务器没有处理php文件的功能,就会请求php解释器(php-cgi.exe)。或者,不是PHP文件,比如是python文件,web服务器也会去请求python的解释器。既然这么多解释器,不能没有一个协议规定它们的标准,否则乱套了,这时候cgi协议就出来了,说白了就是apache/nginx和后端的脚本语言(php,python等)交互之间制定的协议。 php-cgi是什么在windows系统上面,安装了php后,在安装目录下面有下面三个文件: php.exe:命令行执行php脚本文件。php-cgi.exe:通过CGI或FastCGI在web服务器(apache)上运行PHP时可以使用的CGI可执行文件,可以理解为php解释器(也有说是官方的FastCGI进程管理器,至于是什么文章后面再分析,这里就当作php解释器)。php-win.exe:用于在不使用命令行窗口的情况下执行PHP脚本的PHP可执行文件(例如,使用Windows GUI的PHP应用程序)。以上的三个文件互不影响,我本地测试删除两个另外一个也能用。在命令行运行一个php文件 F:\softwares\phpStudy\PHPTutorial\php\php-7.2.1-nts>F:\softwares\phpStudy\PHPTutorial\php\php-7.2.1-nts> php F:\softwares\phpStudy\PHPTutorial\index.phpHello World #php.exe运行结果F:\softwares\phpStudy\PHPTutorial\php\php-7.2.1-nts>php-cgi F:\softwares\phpStudy\PHPTutorial\index.phpX-Powered-By: PHP/7.2.1 #php-cgi.exe运行结果Content-type: text/html; charset=UTF-8 #php-cgi.exe运行结果Hello World #php-cgi.exe运行结果F:\softwares\phpStudy\PHPTutorial\php\php-7.2.1-nts>php-win F:\softwares\phpStudy\PHPTutorial\index.php #php-win.exe运行,结果是空行F:\softwares\phpStudy\PHPTutorial\php\php-7.2.1-nts>apache如何支持phpapache调用php有三种方式,模块、cgi、FastCgi,这些方法网上都能找到,下面说明一下原理。 模块:这是apache独有的对php支持,nginx是没有这种方式的,通过这种方式apache就可以直接处理php脚本了,至于是多进程、多线程要取决于apache的工作方式。参加:Apache三种工作模式介绍与配置cgi(通用网关接口):当apache有php脚本需要处理时,通过走cgi协议调用php解释器php-cgi.exe,并且php-cgi.exe会读取php.ini配置文件,作为apache的子进程。这里有个缺点:客户端浏览器的请求多了,apache创建的子进程会特别多,并且每次都重新读取php.ini配置文件。FastCgi就是为了解决cgi的问题,制定的协议。该协议规定,php-cgi.exe我不再做你apache的子进程了,我独立了,这样你轻松了吧!我单独构成一个服务,这个服务规定一个master主进程,再启用几个worker进程。master负责对php.ini等配置文件,以及接收apache发过来的请求,分配给worker进程进行处理。这样就构成了apache作为客户端,FastCgi协议程序作为服务端。这个FastCgi协议程序就是PHP-fpm,它就是FastCgi协议的具体实现。cgi和FastCgi是什么它们都是协议,FastCgi解决了cgi的一些缺点。 php-cgi.exe和PHP-fpm是什么?php-cgi.exe是解释器,也可以当作一个简易的cgi/FastCgi管理器。比如在windows系统中nginx是如何与php结合的呢?linux通过php-fpm,但是windows没有php-fpm,这个时候打开任务管理器会发现CGI/FastCGI(32位)这个进程,nginx就是反向代理给它的。 location ~ \.php(.*)$ { fastcgi_pass 127.0.0.1:9000; #这里的9000端口就是``php-cgi.exe``监听的 fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; }我们在命令行查看一下php-cgi.exe的帮助,它也是可以进行一些简单的配置的。F:\softwares\phpStudy\PHPTutorial\php\php-7.2.1-nts>php-cgi -hUsage: php [-q] [-h] [-s] [-v] [-i] [-f <file>] php <file> [args...] -a Run interactively -b <address:port>|<port> Bind Path for external FASTCGI Server mode -C Do not chdir to the script's directory -c <path>|<file> Look for php.ini file in this directory -n No php.ini file will be used -d foo[=bar] Define INI entry foo with value 'bar' -e Generate extended information for debugger/profiler -f <file> Parse <file>. Implies `-q' -h This help -i PHP information -l Syntax check only (lint) -m Show compiled in modules -q Quiet-mode. Suppress HTTP Header output. -s Display colour syntax highlighted source. -v Version number -w Display source with stripped comments and whitespace. -z <file> Load Zend extension <file>. -T <count> Measure execution time of script repeated <count> times.php-fpm又是什么?PHP-fpm这个就是FastCgi进程管理器,它的概念并不模糊!它启动服务监听端口,通过nginx反向代理给它,并且它自己内置php解释器。但是,但是windows上面不能使用PHP-fpm。 ...

June 22, 2019 · 1 min · jiezi

CentOSNginxhttpsflask域名备案

这篇文章内容比较杂,但是这次我准备多写些干货,自己备查,也方便别人参考。记录日期为2019年06月21日 阿里云域名购买及备案在阿里云购买域名和服务器以后,先进行服务器备案,生成备案号,然后进行实名采集认证等操作,全部结束以后,才可以进行域名备案申请。这些都有完整的操作流程和文档,很简单。需要注意的是:备案对网站名称有很详细的要求,比如不允许带有任何空间、博客等字样,提供的证件照必须穿着适宜的衣服,我穿背心的照片被打回了…… 这一步其实是阿里云代通信局进行初审,只有通过阿里云初审,才有可能备案成功。提交资料需要用阿里云手机APP提交,一个工作日左右会有人员和你联系,确认信息。通过初审以后,会替你将资料提交到所属省份的通信局进行正式备份,3-20个工作日有结果。我是5.25号转到通信局审核,6.10号通知我域名备案成功。 对了,备案成功以后,只要在阿里云控制台设置域名解析地址到你的公网IP即可。路径是:云解析DNS/域名解析/解析设置。别忘了在网站底部添加ICP备案号和备案链接,这个是必须写的,备查。友情提示,别忘了标注版权所属。 <el-link style="font-size: 22px;" href="http://www.beian.miit.gov.cn/" target="_blank">辽ICP备xxxxxxxx号</el-link>ps:用的element-ui的链接组件 https证书既然有了域名,为何不来一发https呢?产品列表里,进入SSL证书管理功能。申请一个新的免费证书,很简单,填写一些简单的资料即可。大概几天就可以申请下来,然后下载证书包,文档很全。压缩包里有俩证书文件,这俩后面在nginx里配置的时候需要用到。 这一步就没什么好说的了,参考阿里云文档https://help.aliyun.com/knowl... 如果需要强制http跳转到https,需要修改80端口的配置文件为: server { listen 80 default_server; listen [::]:80 default_server; server_name www.xxx.com; return 301 https://$host$request_uri; }这样就可以强制跳转 二级域名配置写到这发现似乎内容太少了,再来点吧。 Vue项目打包到dist以后,上传到服务器上。配置好nginx.conf文件,就能顺利解析。如果你是用vscode开发的小机灵鬼,推荐插件Sync-Rsync。当然别用在生产环境里,不然会被老板打死。 依然是进入云解析DNS的功能中,点击解析设置,点击添加记录。我这里添加一个隐性URL,也就是能够隐藏真实地址的功能,我想在服务器新开一个8000端口,做一些flask的api开发。嗯,归根结底还是因为穷,买不起第二台服务器…… 久等了.jpg,终于配图了。这样就可以用demo.xxx.com代替www.xxx.com:8000,在服务器上再开一个窟窿…… Flask服务器配置推荐用uwsgi+nginx+flask,配置文档http://docs.jinkan.org/docs/f...未完待续,苦逼开发中,9102年了,貌似很多教程都不用自己写啦,我只是个搬运工,果然站在巨人的肩膀上尿的远。

June 21, 2019 · 1 min · jiezi

nginx网站性能优化篇2反向代理实现Apache与Nginx的动静分离LNMPA

为什么要使用反向代理具体请参考这篇博文: 【Linux常识篇(1)】所谓的正向代理与反向代理 LNMPA通过Nginx强大的反向代理功能,把动态文件给Apache处理,这就形成了LNMPA架构 LNMP或LAMP的劣势Nginx是一个小巧而高效的Linux下的Web服务器软件,与Apache相比,消耗资源更少,支持的并发连接,更高的效率,反向代理功能效率高、静态文件处理快等,但动态页面处理能力不如Apache等老牌软件成熟。单独使用Nginx处理大量动态页面时容易产生频繁的502错误。 Apache是一款老牌的Web服务器软件,在高并发时对队列的处理比FastCGI更成熟,Apache的mod_php效率比php-cgi更高且更稳定、对伪静态支持好,不需要转换、多用户多站点权限等方面有着更好的效果,而单独使用Apache处理静态页面时,对内存的占用远远超过Nginx。 LNMPA的优势LNMPA使用Nginx作为前端服务器,能够更快、更及时地使用更少的系统资源处理静态页面、js、图片等文件,当客户端请求访问动态页面时,由Nginx反向代理给作为后端服务器的Apache处理,Apache处理完再交予Nginx返回给客户端。采用LNMPA能够更好的解决LNMP架构中由于PHP-FPM方面产生的502错误,同时能够以很简单的方式提供更安全的多用户多站点环境。 在虚拟机上配置反向代理的步骤首先假设你已经假设好了LNMP架构了,这时我们还要安装Apache和php,为什么还要再装一次PHP?因为Apache默认是把PHP作为本身的一个模块(mod_php)来运行的,与Nginx的运行方式不同. step1: 安装与配置Apache与php我们的目的是在localhost:88上配置web1和web2的站点 安装yum -y install httpd httpd-devel # Ubuntu里面叫做Apache2yum -y install php php-mysql php-common php-gd php-mbstring php-mcrypt php-devel php-xml配置Apache配置文件/etc/httpd/conf/httpd.conf修改如下信息(不同的就修改,没有的就添加) Listen 88ServerName localhost:88NameVirtualHost *:88<VirtualHost *:88>DocumentRoot /home/wwwroot/web2/ ServerName web2.com ErrorLog logs/web2-error_log CustomLog logs/web2-access_log common </VirtualHost><VirtualHost *:88>DocumentRoot /home/wwwroot/web1/ ServerName web1.com ErrorLog logs/web1-error_log CustomLog logs/web1-access_log common </VirtualHost>然后配置hosts后通过以下能正常访问到默认的index.php就代表完成第一步 web1.com:88web2.com:88step2: 在Nginx.conf中配置反向代理通过proxy_pass指向代理服务器Apache语法:proxy_pass URL默认值:no 作用域:location, location中的if字段 这个指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式,例如:proxy_pass http://localhost:8000/uri/;# 在Nginx的web1的server段加上location / { proxy_pass http://127.0.0.1:88;}重启Nginx服务,然后再访问web1.com(客户端192.168.42.196 -> 服务端192.168.42.188),这个时候访问的是Nginx监听的80端口,进的是Nginx服务,然后Nginx的location命中,再然后由Nginx访问88的httpd(Apache)服务,然后通过Apache来解析执行该文件,这时产生两条日志分别是Nginx服务和Apache服务的两条访问日志 # Nginx192.168.42.196 - - [27/Sep/2015:16:06:10 +0800] "GET / HTTP/1.1" 200 20 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0" -#Apache192.168.42.188 - - [27/Sep/2015:16:06:10 +0800] "GET / HTTP/1.0" 200 20我们注意到访问Apache的ip就是服务器的ip,这跟我们想要的客户端ip不符,这时我们就要用到另外一个指令proxy_set_header ...

June 21, 2019 · 1 min · jiezi

Vue项目总结项目nginx部署

项目开发完成,接下来是上线,关于vue项目的部署,我司前端是部署在nginx服务器上,关于nginx的相关文档,请自行查阅;本文只记录部署时碰到的一些问题。打包vue项目打包后,是生成一系列的静态文件,包括项目的请求IP都打入包内,如果后台服务改动,这时你的前端文件,又要重新编译打包,这里采用的是后台管理项目总结提到的前端自行请求一个配置文件,动态修改你的相关配置。 静态文件// config.json{ "api": "test.com"} 请求文件在项目store中请求你的配置文件,写入state中,在调用的时候可以全局访问到你的配置// api.jsGetConfigApi() { return new Promise((resolve, reject) => { axios .get(`/config.json?v=${new Date().getTime()}`) .then(result => { const configApi = { API: result.data['api'], // 统一接口 }; resolve(configApi); }) .catch(error => { reject(error); }); });}nginx部署因为vue-router有hash和history不同的两种模式,使用不同的模式,nginx的配置不同,hash模式下,不需要改动,只需要部署你的前端文件就可以了,所以这里只讨论history模式下.conf文件的修改访问修改nginx配置文件nginx.confserver { listen 80; server_name test.com; location / { root /front; // 前端文件路径 index index.html; // hash模式只配置访问html就可以了 try_files $uri $uri/ /index.html; // history模式下 }}修改完成,重启服务访问test.com部署到子级目录当我们需要把项目部署到子级目录下时,则需要修改项目的BASE_URL,生成一个子级目录下的绝对访问路径。修改对应的.conf配置文件server { listen 80; server_name test.com; location /demo { // 子级目录 alias /front/demo; index index.html; try_files $uri $uri/ /demo/index.html; }}修改完成,重启服务访问test.com/demo缓存处理前端项目的静态文件常常会被浏览器缓存,而项目编译后,js,css,图片等实际上是已经有hash值来去除了缓存,但是项目更新后,仍然会出现缓存问题,这是由于我们的项目整个入口都是在index.html文件上,浏览器实际是缓存了我们的html页面,所以我们要在nginx中告诉浏览器,html文件不被缓存。 location /demo { add_header Cache-Control 'private, no-store, max-age=0'; ... }总结这里只讨论了nginx相关的部署,实际上vue-router文档上是有相关的配置例子的。其他总结文章: webpack常规打包优化方案 组件通信处理方案 后台管理项目总结

June 21, 2019 · 1 min · jiezi

nginx网站性能优化篇1gzip压缩与expire浏览器缓存

gzip压缩概述网页在服务器端经过了gzip或者其他格式的压缩后的输出明显减少了content-length字节,当访问过百万时,这些减少的字节就会变为客观的流量给节约下来;从而减轻服务器的压力以及网页的访问速度; 原理客户端在向服务端发送http请求时,在请求头中有一个Accept-Encoding的头信息,该头信息告知服务器端本客服端能接收什么样的压缩文件,如果服务器端配置了压缩的需求,就会返回相应的压缩文件,然后浏览器再解码呈现出来;我们在做采集时,需要采集的是未压缩的文件,所以在http请求头上不要包含Accept-Encoding的键; 通过这个原理在php给app写接口时,可做一些安全方面的处理,具体如何实现,期待和有经验的app开发人员一起研究.Nginx的压缩在http段添加如下配置 gzip on|off; #是否开启gzipgzip_buffers 32 4K| 16 8K #缓冲(压缩在内存中缓冲几块? 每块多大?)gzip_comp_level [1-9] #推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)gzip_disable #正则匹配UA 什么样的Uri不进行gzipgzip_min_length 200 # 开始压缩的最小长度(再小就不要压缩了,意义不在)gzip_http_version 1.0|1.1 # 开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)gzip_proxied # 设置请求者代理服务器,该如何缓存内容gzip_types text/plain application/xml # 对哪些类型的文件用压缩 如txt,xml,html ,cssgzip_vary on|off # 是否传输gzip压缩标志Example gzip on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_http_version 1.1;gzip_comp_level 2;gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;gzip_vary on;gzip_proxied expired no-cache no-store private auth;gzip_disable "MSIE [1-6]\.";注意: 图片/mp3这样的二进制文件,不必压缩,因为压缩率比较小, 比如100->80字节,而且压缩也是耗费CPU资源的.比较小的文件不必压缩,意义不存在.expire浏览器缓存设置概述这里的缓存控制主要是针对图片,css,js等变化周期较短的静态文件;以图片为例,当我们第一次访问这张图片时,服务器返回的是200,同时在响应头返回了两个键,Etag:即该文件的'指纹'(唯一标识)以及Last-Modified:'文件的修改时间';此时浏览器,以及其他的缓存服务器就会把这张图片给缓存起来;再次请求这张图片时,请求头增加了两个键值,If-Modified-Since:上次发生改变的时间;If-None-Match:上次文件本身的Etag值,服务器根据这两个键值判断其Etag和Last-Modified,如果都没发生改变就不返回这张图片,只返回一个304的状态码,服务器接收到这个304的状态码就会自己去从缓存里面找这个被缓存的图片;这样就减少了服务器的带宽压力以及提升了网站访问速度; 配置在location段以及if段可以设置 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${ expires 30d;}location ~ .*\.(js|css)?${ expires 12h;}格式 ...

June 20, 2019 · 1 min · jiezi

React搭建个人博客二consultemplatenginxdocker实现负载均衡

一.简介上一篇只讲了博客的前端问题,这一篇讲一下后端的微服务搭建。项目的后端使用的thinkjs框架,在我之前的博客中已经写过,这里就不重点说明了。后端项目分为三个: 博客前台页面服务端:在这里。博客后台页面服务端:在这里。consul-template+nginx实现的基于微服务注册发现的负载均衡:在这里。前两个数据业务相关的服务即下图的service_web,第三个项目就是consul-template+nginx的实现的负载均衡。如果对consul基础概念不了解,建议读完我博客里这两篇文章再继续看下面的内容。consul+docker实现服务注册。consul+docker实现服务发现及网关。首先看下架构图: 架构图解析consul-template会订阅consul注册中心上的服务消息,当service-web改变时,consul注册中心会将新的service web信息推送给consul-template,consul-template会修改nginx配置文件,nginx重载入配置后,就达到了可以自动修改更新的负载均衡。 二.consul-template+nginx实现基于微服务的负载均衡consul-template 介绍Consul-Template是基于Consul的自动替换配置文件的应用。在Consul-Template没出现之前,大家构建服务发现系统大多采用的是Zookeeper、Etcd+Confd这样类似的系统。 使用场景:可以查询Consul中的服务目录、Key、Key-values等。这种强大的抽象功能和查询语言模板可以使Consul-Template特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers、Haproxy Backends、Varnish Servers、Application Configurations等。 代码介绍当consul注册中心的的服务改变时,consul-template会根据nginx-consul-template重新生成nginx.conf。首先看一下nginx.conf.ctmpl的代码: nginx.conf.ctmplupstream admin { {{range service "service-admin"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1; {{else}}server 127.0.0.1:65535; # force a 502{{end}}}upstream app { {{range service "service-web"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1; {{else}}server 127.0.0.1:65535; # force a 502{{end}}}server { listen 80 default_server;# 映射博客后台管理服务 location /admin{ proxy_pass http://admin/; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } #请求博客后台服务的静态资源 location ^~/static/blog-backend-react{ proxy_pass http://admin/static/blog-backend-react; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } #请求博客前台服务的静态资源 location ^~/static/blog-react{ proxy_pass http://app/static/blog-react; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 接口请求,映射博客前台服务 location /font{ proxy_pass http://app; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 接口请求,映射博客后台服务 location /api{ proxy_pass http://admin/api; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 默认映射到博客前端服务 location / { proxy_pass http://app; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }}template与正常nginx.conf区别就是upstream里部分,根据服务名——这里是两个服务,self-blog-backend博客后台管理服务与self-blog-fontend博客前台服务——动态生成服务对应的ip。template的反向代理部分,与正常nginx配置一致,因为有两个项目,所以每个url请求接口,静态资源,服务,都需要映射到特定的服务。服务启动后,根据模版生成的nginx配置文件如下: ...

June 19, 2019 · 3 min · jiezi

nginx相关命令

启动启动代码格式:nginx安装目录地址 -c nginx配置文件地址例如: [root@LinuxServer sbin]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf停止nginx的停止有三种方式: 从容停止 - 1、查看进程号 [root@LinuxServer ~]# ps -ef|grep nginx - 2、杀死进程 [root@LinuxServer ~]# kill -QUIT 2072快速停止1、查看进程号 [root@LinuxServer ~]# ps -ef|grep nginx2、杀死进程 [root@LinuxServer ~]# kill -TERM 2132 或 [root@LinuxServer ~]# kill -INT 2132强制停止 [root@LinuxServer ~]# pkill -9 nginx重启验证nginx配置文件是否正确 方法一:进入nginx安装目录sbin下,输入命令./nginx -t 显示nginx.conf syntax is oknginx.conf test is successful说明配置文件正确!方法二:在启动命令-c前加-t重启Nginx服务 方法一:进入nginx可执行目录sbin下,输入命令./nginx -s reload 即可方法二:查找当前nginx进程号,然后输入命令:kill -HUP 进程号 实现重启nginx服务

June 19, 2019 · 1 min · jiezi

nginx运维基础9了解PHPFPM与Nginx的通信机制

PHP-FPM 介绍CGI 协议与 FastCGI 协议每种动态语言( PHP,Python 等)的代码文件需要通过对应的解析器才能被服务器识别,而 CGI 协议就是用来使解释器与服务器可以互相通信。PHP 文件在服务器上的解析需要用到 PHP 解释器,再加上对应的 CGI 协议,从而使服务器可以解析到 PHP 文件。 由于 CGI 的机制是每处理一个请求需要 fork 一个 CGI 进程,请求结束再kill掉这个进程,在实际应用上比较浪费资源,于是就出现了CGI 的改良版本 FastCGI,FastCGI 在请求处理完后,不会 kill 掉进程,而是继续处理多个请求,这样就大大提高了效率。 PHP-FPM 是什么PHP-FPM 即 PHP-FastCGI Process Manager, 它是 FastCGI 的实现,并提供了进程管理的功能。进程包含 master 进程和 worker 进程两种;master 进程只有一个,负责监听端口,接收来自服务器的请求,而 worker 进程则一般有多个(具体数量根据实际需要进行配置),每个进程内部都会嵌入一个 PHP 解释器,是代码真正执行的地方。 Nginx 与 php-fpm 通信机制当我们访问一个网站(如 www.test.com)的时候,处理流程是这样的: www.test.com | | Nginx | |location 到 www.test.com/index.php | |加载 nginx 的 fast-cgi 模块 | |fast-cgi 监听 127.0.0.1:9000 地址 | |www.test.com/index.php 请求到达 127.0.0.1:9000 | | 等待处理...Nginx 与 php-fpm 的结合在 Linux 上,nginx 与 php-fpm 的通信有 tcp socket 和 unix socket 两种方式。 ...

June 19, 2019 · 2 min · jiezi

linux下如何解压zip文件

yum install -y unzip

June 18, 2019 · 1 min · jiezi

nginx运维基础8配置支持http2协议

了解http2协议HTTP 2.0 的主要目标是改进传输性能,实现低延迟和高吞吐量。从另一方面看,HTTP 的高层协议语义并不会因为这次版本升级而受影响。 所有HTTP 首部、值,以及它们的使用场景都不会变。现有的任何网站和应用,无需做任何修改都可以在HTTP 2.0 上跑起来。不用为了利用HTTP 2.0 的好处而修改标记。HTTP 服务器必须运行HTTP 2.0 协议,但大部分用户都不会因此而受到影响。 编译nginx的http2模块通过 `/usr/local/nginx/sbin/nginx -V` (注意是大写的V),查看当前nginx是否支持http2:--with-http_v2_module nginx version: nginx/1.14.0built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) built with OpenSSL 1.0.2o 27 Mar 2018TLS SNI support enabledconfigure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/usr/local/src/lnmp1.5/src/openssl-1.0.2o如果没有的话在编译nginx时要加上这一行 ./configure \--user=www \--group=www \--with-http_v2_module \--with-http_ssl_module \--with-stream \--with-openssl=./openssl-OpenSSL_1_1_0e \--with-pcre=./pcre-8.40 --with-pcre-jit \--with-zlib=./zlib-1.2.11make && make install生成证书可以参考我上一篇博文,申请免费证书。也可以手动生成一个伪证书 cd /usr/local/nginx/conf/mkdir key && cd keyopenssl genrsa -des3 -out server.key 1024openssl req -new -key server.key -out server.csr (根据提示随意的输入)openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt最终生成 ...

June 18, 2019 · 1 min · jiezi

Tidewaysxhprof-和-xhgui-打造-PHP-非侵入式监控平台

推荐阅读Tideways、xhprof 和 xhgui 打造 PHP 非侵入式监控平台超全的设计模式简介(45种)design-patterns-for-humans 中文版MongoDB 资源、库、工具、应用程序精选列表中文版有哪些鲜为人知,但是很有意思的网站?一份攻城狮笔记每天搜集 Github 上优秀的项目一些有趣的民间故事超好用的谷歌浏览器、Sublime Text、Phpstorm、油猴插件合集环境准备安装之前确保已经正确安装了以下软件 PHPNginxMongodb安装 PHP mongodb 扩展$ sudo pecl install mongodbPHP 配置文件中添加 [mongodb]extension=mongodb.so安装 PHP tideaways 扩展常规编译安装 $ git clone https://github.com/tideways/php-xhprof-extension.git$ cd /path/php-xhprof-extension$ phpize$ ./configure$ make$ sudo make installPHP 配置文件中添加 [tideways]extension=tideways_xhprof.so; 不需要自动加载,在程序中控制就行tideways.auto_prepend_library=0; 频率设置为100,在程序调用时可以修改tideways.sample_rate=100安装 xhgui-branch(xhgui 的汉化版)$ git clone https://github.com/laynefyc/xhgui-branch.git$ cd xhgui-branch$ php install.php修改 xhgui-branch 配置文件 <?phpreturn array( ... 'extension' => 'tideways_xhprof', ... 'save.handler' => 'mongodb', 'db.host' => 'mongodb://127.0.0.1:27017', 'db.db' => 'xhprof', ...);启动 mongodb 并设置 xhgui 索引,命令如下:$ mongo> use xhprof> db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )> db.results.ensureIndex( { 'profile.main().wt' : -1 } )> db.results.ensureIndex( { 'profile.main().mu' : -1 } )> db.results.ensureIndex( { 'profile.main().cpu' : -1 } )> db.results.ensureIndex( { 'meta.url' : 1 } )xhgui 本地虚拟主机配置参考server { listen 80; server_name xhgui.test; root /Users/yaozm/Documents/wwwroot/xhgui-branch/webroot; # access_log /usr/local/var/log/nginx/access.log; error_log /usr/local/var/log/nginx/error.log; location / { try_files $uri $uri/ /index.php?$query_string; index index.php index.html index.htm; }}针对要分析的站点进行设置,直接在要分析站点的 nginx 配置中增加以下项,然后使配置生效就可以了。$ fastcgi_param PHP_VALUE "auto_prepend_file=/path/xhgui-branch/external/header.php";参考配置 ...

June 18, 2019 · 1 min · jiezi

nginx下多站点indexphp隐藏

示列 ## 根站点项目 location / { try_files $uri $uri/ /index.php?$query_string; } ## 二级项目 location /public/ { index index.php index.html; if (!-e $request_filename){ rewrite ^/public/(.*)$ /public/index.php/$1 last; } }完整server { listen 80; listen 443 ssl http2; ssl_certificate /usr/local/nginx/conf/ssl/xxx.com.crt; ssl_certificate_key /usr/local/nginx/conf/ssl/xxx.com.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_timeout 10m; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_buffer_size 1400; add_header Strict-Transport-Security max-age=15768000; ssl_stapling on; ssl_stapling_verify on; server_name xxx.com www.xxx.com; access_log off; index index.html index.htm index.php; root /data/wwwroot/xxx.com; ## 根站点项目 location / { try_files $uri $uri/ /index.php?$query_string; } ## 二级项目 location /public/ { index index.php index.html; if (!-e $request_filename){ rewrite ^/public/(.*)$ /public/index.php/$1 last; } } #error_page 404 /404.html; #error_page 502 /502.html; location ~ [^/]\.php(/|$) { #fastcgi_pass remote_php_ip:9000; fastcgi_pass unix:/dev/shm/php-cgi.sock; fastcgi_index index.php; include fastcgi.conf; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ { expires 30d; access_log off; } location ~ .*\.(js|css)?$ { expires 7d; access_log off; } location ~ /\.ht { deny all; }}

June 13, 2019 · 1 min · jiezi

nginx动态负载均衡

方案传统的负载均衡,如果Upstream参数发生变化,每次都需要重新加载nginx.conf文件,因此扩展性不是很高,所以我们可以采用动态负载均衡,实现Upstream可配置化、动态化,无需人工重新加载nginx.conf,类似分布式的配置中心 Consul+Consul-template 每次发现配置更改需要raload nginx,重启Nginx。Consul+OpenResty 实现无需raload动态负载均衡Consul+upsync+Nginx 实现无需raload动态负载均衡Consul+upsync+NginxConsul环境搭建https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zipyum -y install unzipunzip consul_0.7.5_linux_amd64.zip./consul 出现下面提示说明成功[root@localhost local]# ./consulusage: consul [--version] [--help] <command> [<args>]Available commands are: agent Runs a Consul agent configtest Validate config file event Fire a new event exec Executes a command on Consul nodes force-leave Forces a member of the cluster to enter the "left" state info Provides debugging information for operators join Tell Consul agent to join cluster keygen Generates a new encryption key keyring Manages gossip layer encryption keys kv Interact with the key-value store leave Gracefully leaves the Consul cluster and shuts down lock Execute a command holding a lock maint Controls node or service maintenance mode members Lists the members of a Consul cluster monitor Stream logs from a Consul agent operator Provides cluster-level tools for Consul operators reload Triggers the agent to reload configuration files rtt Estimates network round trip time between nodes snapshot Saves, restores and inspects snapshots of Consul server state version Prints the Consul version watch Watch for changes in Consulnginx-upsync-moduleUpsync是新浪微博开源的基于Nginx实现动态配置的三方模块。Nginx-Upsync-Module的功能是拉取Consul的后端server的列表,并动态更新Nginx的路由信息。此模块不依赖于任何第三方模块。Consul作为Nginx的DB,利用Consul的KV服务,每个Nginx Work进程独立的去拉取各个upstream的配置,并更新各自的路由。nginx-upsync-module: ...

June 12, 2019 · 2 min · jiezi

初识Spalash

输入下面命令运行splash: docker run -p 8050:8050 scrapinghub/splash一个splash的基本实例: function main(splash, args) splash:go("http://www.baidu.com") splash:wait(0.5) lcoal title = splash:evaljs("document.title") return {title=title}end将上面实例复制到 localhost:8050 的代码编辑区域,并将网址设为 http://www.baidu.com 点击Render me!返回 http://www.baidu.com 的title 我们在这里定义的方法名称为main(),这个名称是固定的,Splash会根据这个名字执行。 入口及返回值该方法的返回值既可以是字典形式,也可以是字符串形式,最后都会转化为Splash HTTP Response。 异步处理Splash支持异步处理,但是这里没有显式指明回调方法,其回调实在Splash内部完成的。 示例如下: function main(splash, args) local example_urls = {"www.baidu.com", "www.taobao.com", "www.zhihu.com"} local urls = args.urls or example_urls local results = {} for index, url in ipairs(urls) do local ok, reason = splash:go("http://" .. url) if ok then splash:wait(2) results[url] = splash:png() end end return resultsend上面实例运行结果为,三个网站的的截图。在脚本内调用的wait()方法类似与sleep()。其参数为等待的秒数。 ...

June 12, 2019 · 2 min · jiezi

Nginx配置注解

#指定Nginx Worker进程运行用户以及用户组user www www;#指定了Nginx要开启的进程数,一般几个CPU就写几worker_processes 2;#错误日志位置error_log logs/error.log;#指定进程id的存储文件位置pid logs/nginx.pid;#指定单进程打开文件数,需与系统设定一致worker_rlimit_nofile 65535;events { #指定nginx工作模式,nginx主要的工作模式有select、poll、kqueue、epoll #其中select、poll是标准工作模式,kqueue、epoll为高效工作模式,epoll用在Linux系统中,而kqueue用在BSD系统中 use epoll; #指定单进程的最大连接数,即一个进程同时能处理1024个请求 worker_connections 1024;}#HTTP部分http { #指定配置文件所包含的文件 include mime.types; #指定默认类型为二进制流,也就是当文件类型未定义时使用这种方式. #例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口 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"';; #设置允许客户端请求的最大的单个文件字节数 client_max_body_size 20m; #指定来自客户端请求头的headerbuffer大小,如果自定义了消息头或有更大的cookie,可以在这里增加缓冲大小 client_header_buffer_size 16k; #指定客户端请求中较大的消息头的缓存最大数量和大小,4为个数,32k为大小,最大缓存为4个32kb large_client_header_buffers 4 32k; #开启高效传输模式 sendfile on; #tcp_nopush,tcp_nodelay设置on,防止网络阻塞 tcp_nopush on; tcp_nodelay on; #指定客户端连接保持活动的超时时间 keepalive_timeout 65; #指定客户端请求头读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误 client_header_timeout 10; #指定客户端请求主体读取超时时间,如果超过这个时间客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误 client_body_timeout 10; #指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接 send_timeout 10; #开启gzip压缩,实时压缩输出数据流 gzip on; #设置允许压缩的页面最小字节数 gzip_min_length 1k; #指定内存空间来存贮压缩结果,这里指定4个单位为16k的内存来存储压缩结果,即总大小为64k gzip_buffers 4 16k; #指定识别HTTP协议版本,默认是1.1 gzip_http_version 1.1; #指定gzip压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源 gzip_comp_level 2; #指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩 gzip_types text/plain application/x-javascript text/css application/xml; #该选项开启可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Varnish缓存经过Nginx压缩的数据 gzip_vary on; #隐藏Nginx版本号 server_tokens off; #SERVER部分 server { #指定Nginx监端口 listen 8000; #用来指定IP或者域名 server_name localhost; #指定Nginx默认的字符集,只有utf-8支持中文字符 charset utf-8; #指定访问日志的名称及位置 access_log logs/host.access.log main; #可有多个location location / { #指定网页根目录 root /data/www/default.com; #设定默认首页 index index.html index.htm; #Nginx默认是不允许列出整个目录的,在server或location段里添加上 autoindex on;来启用目录浏览。 #开启目录浏览 autoindex on ; #默认为on,显示出文件的确切大小,单位是bytes。 #改为off后,显示出文件的大概大小,单位是kB或者MB或者GB autoindex_exact_size off ; #默认为off,显示的文件时间为GMT时间。 #改为on后,显示的文件时间为文件的服务器时间 autoindex_localtime on; } #开启目录浏览 location /down/ { #访问目录 alias /home/wwwroot/test/; autoindex on; } #指定错误页面 error_page 500 502 503 503 /50x.html; #定义错误页面,如果是500错误,则把站点根目录下的 50x.html 返给用户 location = /50x.html { root /data/www/www.error.com ; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} #配置PHP location ~ \.php$ { #指定网页根目录 root /data/www/default.com; #指定fastcgi的地址和端口 fastcgi_pass 127.0.0.1:9000; #默认页面 fastcgi_index index.php; #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; #配置fastcgi参数 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #引入fastcgi参数 include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one #location ~ /\.ht { # deny all; #} #指定url中包含jsp或者?的全部转发到192.168.0.10的80端口即tomcat处理 location ~ (jsp|\?) { proxy_pass http://192.168.0.10:80; } }#站点server,eg: www.default.com#可配置多个站点server { listen 80; server_name www.default.com; root /data/www/www.default.com; index index.php index.html index.htm; location / { root /data/www/www.default.com; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /data/www/www.error.com ; }}#多个站点配置引入#conf.d/www.site.com conf.d/www.site2.cominclude conf.d/*#其他说明#针对单个域名请求做出单个连接超时的配置.#比如些动态解释和静态解释可以根据业务的需求配置#proxy_connect_timeout :后端服务器连接的超时时间_发起握手等候响应超时时间#proxy_read_timeout:连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)#proxy_send_timeout :后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据

June 12, 2019 · 2 min · jiezi

NginxTomcat动静分离

动静分离动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路动静分离简单的概括是:动态文件与静态文件的分离。 软件开发中,有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件,否则动态文件。因此我们后台处理忽略静态文件。这会有人又说那我后台忽略静态文件不就完了吗。当然这是可以的,但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决。动静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。这里我们将静态资源放到nginx中,动态资源转发到tomcat服务器中。 ###静态资源访问 server { listen 80; server_name static.tmp.com; location /static/imgs { root data/tmp; index index.html index.htm; } } ###动态资源访问 server { listen 80; server_name www.tmp.com; location / { proxy_pass http://127.0.0.1:8080; index index.html index.htm; } }

June 12, 2019 · 1 min · jiezi

nginx-学习

应用场景http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。静态资源静态资源访问 存放在nginx的html页面 虚拟主机配置基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台基于ip的虚拟主机,几乎不用基于域名的虚拟主机 server { listen 80; server_name my.tmp.com; location / { root data/tmp1; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 80; server_name you.tmp.com; location / { root data/tmp2; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }}基于端口的虚拟主机 server { listen 8080; server_name 8080.tmp.com; location / { root data/tmp1; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 8081; server_name 8081.tmp.com; location / { root data/tmp2; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }}配置反向代理反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。反向代理的好处隐藏真实内部ip地址,请求先访问nginx代理服务器(外网可以访问到),在使用nginx服务器转发到真实服务器中。 ...

June 12, 2019 · 1 min · jiezi

linux-安装nginx

安装gcc gcc-c++(如新环境,未安装请先安装)$ yum install -y gcc gcc-c++安装wget$ yum -y install wget安装PCRE库$ cd /usr/local/$ wget https://sourceforge.net/proje...$ tar -zxvf pcre-8.43.tar.gz$ cd pcre-8.43$ ./configure$ make && make install如果报错:在 linux 中执行 wget 命令提示 -bash: wget: command not found解决办法 yum -y install wget安装SSL库$ cd /usr/local/$ wget http://www.openssl.org/source...$ tar -zxvf openssl-1.0.1j.tar.gz$ cd openssl-1.0.1j$ ./config$ make && make install安装zlib库$ cd /usr/local/$ wget http://zlib.net/zlib-1.2.11.t...$ tar -zxvf zlib-1.2.11.tar.gz$ cd zlib-1.2.11$ ./configure$ make && make install安装nginx$ cd /usr/local/$ wget http://nginx.org/download/ngi...$ tar -zxvf nginx-1.9.9.tar.gz$ cd nginx-1.9.9$ ./configure$ make && make install启动nginx/usr/local/nginx/sbin/nginx配置 ...

June 11, 2019 · 2 min · jiezi

前端项目部署到云服务器

前端项目准备我们需要在 package.json 里面添加一行"homepage": ".",如果不加上这个的话之后打包的时候,打开index.html会报错项目完成以后,运行 npm run build 进行打包例如打包之后的文件夹为 build 云服务器设置首先进入服务器,然后安装 nginx推荐 yum 源安装 安装 nginx 服务器ssh root@yourIp // 首先打开命令行,连上你的服务器yum install -y nginx // 命令安装 nginx 服务器配置nginx安装完成后,进入 nginx 配置文件目录 一般是 /etc/nginx/ 下在该目录下新建一个 vhost 文件夹作为你自己的配置文件目录然后进入 vhost 新建一个配置文件,比如 example.conf输入如下配置 server { listen 5000; // 端口号可以自己设置 server_name localhost; root /usr/local/reactProjects/yourReactProject; // 注意这是里放你上面 build 文件夹里的内容 location / { try_files $uri @fallback; } location @fallback { rewrite .* /index.html break; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }}注意: /usr/local/reactProjects/yourReactProject 路径只是举个例子,你可以放在其他目录下另外,上传文件到云服务器可以用 xftp 或者其他的软件再输入 vi nginx.conf 添加下图划红线部分代码,把你的配置 include 进来 ...

June 11, 2019 · 1 min · jiezi

Nginx-日志自定义记录及启用日志缓冲区

原文链接: 何晓东 博客 如果想统计网站的访问来源信息,可以用 php 获取信息,记录到数据库的形式,也可以直接使用 nginx 提供的访问日志,来记录网站的访问详情,管理员可以通过分析 nginx 的访问日志,来分析用户的访问来源,访问行为详情,网站页面访问热度等。此外,nginx 自身也有错误日志,方便运维人员调试 nginx。对于记录日志的行为,如果每次进行磁盘操作,将会较多的耗费资源,基于这个情况可以开启 nginx 日志缓冲区,缓冲区满或者定时写入的时间到了,再一次写入日志。访问日志nginx 在处理请求后立即在访问日志中写入有关客户端请求的信息。默认情况下,访问日志位 logs/access.log 中,信息以预定义的组合格式写入日志。想要精确记录访问信息,就需要自定义一个更加完整的访问日志格式,如下所示: http { log_format geoproxy '[$time_local] $remote_addr ' '$realip_remote_addr $remote_user ' '$request_method $server_protocol ' '$scheme $server_name $uri $status ' '$request_time $body_bytes_sent ' '$geoip_city_country_code3 $geoip_region ' '"$geoip_city" $http_x_forwarded_for ' '$upstream_status $upstream_response_time ' '"$http_referer" "$http_user_agent"'; ...}这个日志配置被命名为 geoproxy,它使用许多 nginx 变量来演示 nginx 日志记录功能。详细讲解配置选项中各个变量的具体含义:当用户发起请求时,会记录服务器时间 $time_local, $remote_user 值为通过基本授权的用户名称;用于 nginx 处理 geoip_proxy 和 realip_header 指令的打开连接的 IP 地址和客户端 IP 地址;之后记录 HTTP 请求方法 $request_method、协议 $server_protocol 和 HTTP 方法 $scheme:http 或 https;当然还有服务器名称 $server_name、请求的 URI 和响应状态码;除基本信息外,还有一些统计的结果数据:包括请求处理的毫秒级时间 $request_time、服务器响应的数据块大小 $body_bytes_sent;此外,客户端所在国家 $geoip_city_country_code3、地区 $geoip_region 和城市信息 $geoip_city 也被记录在内;变量 $http_x_forwarded_for 用于记录由其它代理服务器发起的请求的 X-Forwarded-For 头消息;upstream 模块中一些数据也被记录到日志里:被代理服务器的响应状态码 $upstream_status 、建立链接和从上游服务器接收响应主体最后一个字节的时间 $upstream_response_time、 建立和上游服务器的链接时间 $upstream_connect_time、建立链接和从上游响应头的第一个字节的时间 $upstream_header_time。 请求来源 $http_referer 和用户代理 $http_user_agent 也可以被记录在日志里;nginx 的日志记录功能非常强大和灵活的,需要注意的是:用于定义日志格式的 log_format 指令仅适用于 http 块级指令内,所有时间值均以毫秒为单位,以毫秒分辨率进行测量。。 ...

June 10, 2019 · 2 min · jiezi

Docker-快速安装搭建-Ngnix-环境并配置反向代理

欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 《Java 核心知识整理&面试.pdf》资源链接!!个人网站: https://www.exception.site/docker/docker-install-nginx 本节中,我们将学习如何通过 Docker 快速安装&搭建 Ngnix, 为您的服务添加反向代理功能。 一、下载 Nginx 镜像docker pull nginx:alpinePS:我这里用的是 alipne 轻量级的镜像.下载完成后,通过 docker images 命令检查一下镜像是否下载成功: 二、先以简单的方式运行镜像docker run -d --name nginx nginx:alpine-d: 以后台方式运行镜像;—name: 指定容器的名称为 nginx;命令执行完成后,通过 docker ps命令确认一下容器是否启动成功。确认成功后,再访问一下 80 端口,看看 nginx 服务是否启动成功: 三、复制相关配置文件至宿主机复制运行中 nginx 相关配置文件到宿主机的指定路径下: # 复制名称为 nginx 容器中 /etc/nginx/nginx.conf 文件夹到宿主机的 /docker/nginx 路径下docker cp nginx:/etc/nginx/nginx.conf /docker/nginx# 复制名称为 nginx 容器中 /etc/nginx/conf.d 文件到宿主机的 /docker/nginx 路径下docker cp nginx:/etc/nginx/conf.d /docker/nginx复制完成后,查看指定路径的配置文件,如下: 四、修改 Nginx 配置文件,添加反向代理先通过命令 ifconfig 命令获取 docker0网卡的 ip 地址: ...

June 10, 2019 · 1 min · jiezi

前端培训初级阶段场景实战20190613Nginx代理正确食用方式

前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 截止到 2019-05-30 期,所有成员都进行了一次分享。内部对课程进行了一些调整,之后会针对项目开始 review 。我这边预期准备进入中级阶段,中间还是会穿插一些实战。 前端培训目录 今天讲什么?nginx 的 servernginx 的 location 匹配规则nginx 的 root、rewrite、proxy_pass、aliasnginx 的命令以及报错日志今天为什么会开这个题目? 公司内部的前端构建工具升级(gulp),帮小伙伴处理了一下 nginx 的配置,辅助提升开发的体验。公司想要加快网页访问速度(前端缓存),为了测试,我改了我自己服务器的 nginx 配置。 PWA ()manifest ()其他方案(localStroage存)有老哥有科学有效的方案吗?缓存这块我还在实验中,我司有结果之后我会写个文章发出来。nginx 的 server定义虚拟主机相关。server 中通过 server_name 来匹配域名,listen来匹配端口 server_name用于匹配域名,需要已经映射的域名。举个栗子,我在阿里云有一台云服务器 IP:123.56.16.33:443。买了一个域名 lilnong.top。我现在把我的域名指向了我的ip。那所有请求我域名的都会到我这台服务器上。我需要用 server_name 来判断请求的是那台主机,再进行分发 listen用于匹配端口号,一般来说,我们当做服务的就需要加上 80 和 443 协议端口用途http80浏览器访问https443浏览器访问ftp21 server_name 与 host 匹配优先级完全匹配通配符在前的,如 *.lilnong.top在后的,如 www.lilnong.*正则匹配,如 ~^\.www\.lilnong\.com$如果都不匹配 优先选择 listen 配置项后有 default 或 default_server 的找到匹配 listen 端口的第一个 server 块nginx 的 location 匹配规则location 是什么?location 是用于在 server 服务中,根据 URL 进行匹配查找。属于 ngx_http_core_module 模块。 ...

June 10, 2019 · 2 min · jiezi

nginx-host-和-httphost-的区别

$host是core模块内部的一个变量 当请求头里不存在Host属性或者是个空值,$host则等于server_name如果请求头里有Host属性,那么$host等于Host属性除了端口号的部分,例如Host属性是www.example.com,那么$host就是www.example.com$http_host不是一个固定的变量,他其实是$http_HEADER通配后的结果。 $http_HEADER,注意,这里的HEADER是一个通配符,通配的是请求头里的header属性,例如$http_content_type表示请求头里content-type属性的值,同理,$http_host指的就是请求头里的host属性。

June 9, 2019 · 1 min · jiezi

nginx运维基础7配置SSL支持https访问

关于 SSL 证书有关 SSL 的介绍可以参阅阮一峰老师的《SSL/TLS协议运行机制的概述》。 SSL 证书主要有两个功能:加密和身份证明,通常需要购买,也有免费的,本文使用阿里云的一年免费期的ssl证书。 申请免费证书阿里云控制台-产品与服务-安全(云盾)-SSL证书,点击购买证书,选择免费型DV SSL->补全申请签发证书,然后下载证书。 配置证书进入nginx配置目录,增加certs/文件夹,把刚刚下载的两个文件上传到certs/文件夹中。对443端口和80端口进行监听,443端口要启用sslserver { listen 443; server_name bjubi.com; // 你的域名 ssl on; root /var/www/bjubi.com; // 前台文件存放文件夹,可改成别的 index index.html index.htm;// 上面配置的文件夹里面的index.html ssl_certificate /etc/nginx/conf.d/certs/site2/www.site1.com.crt; ssl_certificate_key /etc/nginx/conf.d/certs/site2/www.site1.com.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { index index.html index.htm; }}server { listen 80; server_name www.site1.com;// 你的域名 rewrite ^(.*)$ https://$host$1 permanent;// 把http的域名请求转成https}HTTPS服务器优化减少 CPU 运算量SSL 的运行计算需要消耗额外的 CPU 资源,一般多核处理器系统会运行多个工作进程(worker processes),进程的数量不会少于可用的 CPU 核数。SSL 通讯过程中『握手』阶段的运算最占用 CPU 资源,有两个方法可以减少每台客户端的运算量: ...

June 8, 2019 · 2 min · jiezi

喵星在线Flask博客上线布署过程

原文:http://www.catonlinepy.tech/声明:原创不易,未经许可,不得转载 这篇文章,猫姐将讨论如何将flask程序部署到ubuntu服务器上。其中,部署过程涉及到Flask,Nginx,Gunicorn,Supervisor的安装使用。通过学习今天的文章,你将学会部署自己开发的Flask web程序,真正让自己开发的应用上线运行。 0. Flask Web应用处理请求的过程 1. 安装相应的依赖环境使用ssh username@ip 进入云主机的shell环境,并在云主机上安装需要依赖环境,使用如下命令安装: sudo apt-get install nginx supervisor python-pip python3-venvssh的使用方法:ssh命令,加上@前面是云主机服务器的用户名,@后面是云主机服务器的ip地址。 2. 创建虚拟环境如果云主机中没有创建虚拟环境,那么我们有必要创建一个。虚拟开发环境的主要作用是为了将web项目所用的各种库与操作系统自带的python库隔离开来,这样做的好处是开发环境与系统环境隔离,环境之间不会相互影响,特别是对于多人协作的大型项目开发,建立虚拟环境是非常有必要的。下面开始创建虚拟环境: # 使用下面命令,创建一个虚拟开发环境$ python3 -m venv <虚拟环境的名字># 激活刚才建立的虚拟开发环境,(这里我们创建一个名为miao_venv的虚拟环境)$ python3 -m venv miao_venv$ source maio_venv/bin/activate# 安装flask web程序所需要的python包$ pip installl -r requirement.txt激活虚拟环境后,进入run.py文件的目录,在终端中输入python run.py,就可以将程序运行起来了。但是,这样生产环境中将flask程序运行起来是不安装的,并且处理用户请求的能力也非常不足。所以,我们应该去使用gunicorn这个工具去运行我们的Flask web程序。 3. 设置GunicornGunicorn(“Green Unicorn”)是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。和大多数的web框架兼容,并具有实现简单,轻量级,自动管理多个worker进程,高性能等多个特点。 采用如下命令安装gunicorn: pip install gunicorngunicorn运行Flask web程序的方法也非常简单,如下命令即可达到目的: gunicorn filename(run):变量名(app) -b localhost:端口号 &# 解释:filename指的是能够将flask程序运行起来的python文件,如run.py的文件名run。冒号后面的是flask实例化的app变量。端口号是在网页中输入的url的端口号查看端口服务是否生效,可以使用下面的命令: # 在命令行中输入:$ ps aux|grep gunicorn# 下面是效果(miao_venv) root@vultr:~/flaskblog# ps aux|grep gunicornroot 4124 0.0 0.0 11020 980 pts/0 S+ 10:35 0:00 grep --color=auto gunicornroot 11117 0.0 2.1 33308 21400 ? S May28 0:10 /root/blog_venv/bin/python3 /root/blog_venv/bin/gunicorn run:app -b localhost:5006root 11120 0.0 7.6 160528 77160 ? S May28 0:17 /root/blog_venv/bin/python3 /root/blog_venv/bin/gunicorn run:app -b localhost:5006这样就能够使用gunicorn进程去监听5006的端口。现在gunicorn进程是工作在后台的,但只有一个gunicorn进程会处理web请求,当用户访问量过大时,网站的并发处理能力非常弱。最理想的方法是,使用supervisor工具去启动并监控多个gunicorn进程。 ...

June 8, 2019 · 1 min · jiezi

网络云盘项目nginx添加fastdfs模块

解压 fastdfs-nginx-module-1.20进入Nginx安装目录重新配置安装包,添加fastdfs源码目录sudo ./configure --add-module=/root/libinstall/fastdfs-nginx-module-1.20/srcmake 报错 解决方案:root@ubuntu:/home/wangsx/libinstall/download/nginx-1.10.3# find /usr/include/ -name common_define.h/usr/include/fastcommon/common_define.h修改 obj/makefile,添加找到的路径 make&&make install启动 nginx#/usr/local/nginx/sbin/nginxroot@ubuntu:/usr/local/nginx# ps -aux|grep nginxroot 13860 0.0 0.0 36836 600 ? Ss 07:48 0:00 nginx: master process ./nginxroot 14072 0.0 0.0 21292 928 pts/2 S+ 07:54 0:00 grep --color=auto nginx发现worker 进程未启动查看日志 vi ./logs/error.log缺少配置文件 ,找到拷贝到目录下 root@ubuntu:~/libinstall/fastdfs-nginx-module-1.20/src# cp mod_fastdfs.conf /etc/fdfs/修改 mod_fastdfs.conf 配置文件 保存退出:重启nginx root@ubuntu:/etc/fdfs# ps -aux |grep nginxroot 14326 0.0 0.0 36836 604 ? Ss 08:19 0:00 nginx: master process nginxroot 14331 0.0 0.0 21292 1084 pts/2 S+ 08:19 0:00 grep --color=auto nginx依旧没有worker进程继续看log ...

June 8, 2019 · 1 min · jiezi

网络云盘项目fastCGI和spawnfcgi的安装

准备安装包fcgi-2.4.1-SNAP-0910052249.tar.gzspawn-fcgi-1.6.4.tar.gz解压tar zxvf fcgi-2.4.1-SNAP-0910052249.tar.gztar zxvf spawn-fcgi-1.6.4.tar.gz安装 fcgi cd fcgi-2.4.1-SNAP-0910052249./configuremakemake出错: 解决方案:找到fcgio.h 或fcgio.cpp文件添加: #include <stdio.h>继续: makemake install安装spawn-fcgi./autogen.sh./configuremakemake install报错./autogen.sh: 11: ./autogen.sh: autoreconf: not foundautoconf aclocalautoconf又报错。。。算了不折腾了重新下个 wget http://download.lighttpd.net/spawn-fcgi/releases-1.6.x/spawn-fcgi-1.6.4.tar.gz./configuremake&&make install一气呵成~!

June 7, 2019 · 1 min · jiezi

nginx运维基础6Nginx的Rewrite语法详解

概述重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读和索引你的网站的能力;而且在你改变了自己的网站结构后,无需要求用户修改他们的书签,无需其他网站修改它们的友情链接;它还可以提高你的网站的安全性;而且通常会让你的网站更加便于使用和更专业。 Nginx Rewrite规则相关指令Nginx Rewrite规则相关指令有if、rewrite、set、return、break等,其中rewrite是最关键的指令。 Rewrite重写,写在server段或者location段都可,后出现的先应用 #判断访问地址if ($remote_addr = 192.168.1.100) { return 403;}#判断访问的是否ie;if ($http_user_agent ~ MSIE) { rewrite ^.*$ /ie.htm; break; #不break会循环重定向(是ie重写到ie.htm,然后又发现是ie,又重写到ie.htm...)}#跳转到404if (!-e $document_root$fastcgi_script_name) { rewrite ^.*$ /404.html; break;} 注意: Nginx对配置的格式非常的严格,if后面一定要有空格,运算符前后也必须要用空格隔开 If 空格 (条件) { 重写模式}rewrite的核心还是正则表达式,其他的只要知道其语法规则既可规则参考~ 为区分大小写匹配~* 为不区分大小写匹配!~和!~*分别为区分大小写不匹配及不区分大小写不匹配-f和!-f用来判断是否存在文件-d和!-d用来判断是否存在目录-e和!-e用来判断是否存在文件或目录-x和!-x用来判断文件是否可执行last 相当于Apache里的[L]标记,表示完成rewrite,呵呵这应该是最常用的set 设置变量return 返回状态码 break 终止匹配, 不再匹配后面的规则redirect 返回302临时重定向 地址栏会显示跳转后的地址permanent 返回301永久重定向 地址栏会显示跳转后的地址内置变量参考$args, 请求中的参数;$content_length, HTTP请求信息里的"Content-Length";$content_type, 请求信息里的"Content-Type";$document_root, 针对当前请求的根路径设置值;$document_uri, 与$uri相同;$host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;$limit_rate, 对连接速率的限制;$request_method, 请求的方法,比如"GET"、"POST"等;$remote_addr, 客户端地址;$remote_port, 客户端端口号;$remote_user, 客户端用户名,认证用;$request_filename, 当前请求的文件路径名$request_body_file$request_uri, 请求的URI,带查询字符串;$query_string, 与$args相同;$scheme, 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;$server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";$server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);$server_name, 请求到达的服务器名;$server_port, 请求到达的服务器端口号;$uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。以上变量也可以用打印日志哦范例分析Example1不存在的文件跳到404.html ...

June 7, 2019 · 1 min · jiezi

nginx运维基础5Nginx的location攻略

概述location 有"定位"的意思, 根据Uri来进行不同的定位.在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分,定位到不同的处理方式上.伪静态,反向代理,负载均衡等等都离不开location. 语法location [=|~|~*|^~] patt {}中括号可以不写任何参数,此时称为一般匹配,也可以写参数.因此,大类型可以分为3种: location = patt {} [精准匹配]location patt{} [一般匹配]location ~ patt{} [正则匹配]匹配说明精准匹配 =完全匹配指定的 pattern ,且这里的 pattern 被限制成简单的字符串,也就是说这里不能使用正则表达式. server { server_name website.com; location = /abcd { […] }}http://website.com/abcd # 正好完全匹配http://website.com/ABCD # 如果运行 Nginx server 的系统本身对大小写不敏感,比如 Windows ,那么也匹配http://website.com/abcd?param1 # 忽略查询串参数(query string arguments),也同样匹配http://website.com/abcd/ # 不匹配,因为末尾存在反斜杠(trailing slash),Nginx 不认为这种情况是完全匹配http://website.com/abcde # 不匹配,因为不是完全匹配一般匹配 (None)可以理解为左前缀匹配(like pattern%),这种情况下,匹配那些以指定的 patern 开头的 URI,注意这里的 URI 只能是普通字符串,不能使用正则表达式. server { server_name website.com; location /abcd { […] }}http://website.com/abcd # 正好完全匹配http://website.com/ABCD # 如果运行 Nginx server 的系统本身对大小写不敏感,比如 Windows ,那么也匹配http://website.com/abcd?param1 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1http://website.com/abcd/ # 末尾存在反斜杠(trailing slash)也属于匹配范围内http://website.com/abcde # 仍然匹配,因为 URI 是以 pattern 开头的正则匹配 ~对大小写敏感(在window上无效),且 pattern 须是正则表达式 ...

June 6, 2019 · 3 min · jiezi

nginx运维基础4Nginx的日志管理日志格式与定时分割日志

Nginx日志主要分为两种:访问日志和错误日志。日志开关在Nginx配置文件(一般在server段来配置)中设置,两种日志都可以选择性关闭,默认都是打开的。 访问日志access_log#日志格式设定log_format access '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" $http_x_forwarded_for';#定义本虚拟主机的访问日志access_log ar/loginx/ha97access.log access;log_format access 中的access表示给后面定义的日志个数取了个名为main的名称,便于在access_log指令中引用 对比日志格式和输出的结果可以发现,日志格式用一对单引号包起来,多个日志格式段用可以放在不同的行,最后用分号(;)结尾单引号中的双引号("),空白符,中括号([)等字符原样输出,比较长的字符串通常用双引号(")包起来,看起来不容易更加清楚,$开始的变量会替换为真实的值 日志的格式$server_name #虚拟主机名称。$remote_addr #远程客户端的IP地址。- #空白,用一个“-”占位符替代,历史原因导致还存在。$remote_user #远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白。[$time_local] #访问的时间与时区,比如18/Jul/2016:17:00:01 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。$request #请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求,请求的是什么$status #记录请求返回的http状态码,比如成功是200。$uptream_status #upstream状态,比如成功是200.$body_bytes_sent #发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。$http_referer #记录从哪个页面链接访问过来的。 $http_user_agent #客户端浏览器信息$http_x_forwarded_for #客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。$ssl_protocol #SSL协议版本,比如TLSv1。$ssl_cipher #交换数据中的算法,比如RC4-SHA。 $upstream_addr #upstream的地址,即真正提供服务的主机地址。 $request_time #整个请求的总时间。 $upstream_response_time #请求过程中,upstream的响应时间。访问日志中一个典型的记录如下: 192.168.1.102 - scq2099yt [18/Mar/2013:23:30:42 +0800] "GET /stats/awstats.pl?config=scq2099yt HTTP/1.1" 200 899 "http://192.168.1.1/pv/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows XXX; Maxthon)"需要注意的是:log_format配置必须放在http内,否则会出现如下警告信息: nginx: [warn] the "log_format" directive may be used only on "http" level in /etc/nginx/nginx.conf:97access_log中记录post请求的参数常见的nginx配置中access log一般都只有GET请求的参数,而POST请求的参数却不行。http://wiki.nginx.org/NginxHt... ...

June 5, 2019 · 1 min · jiezi

Nginx-极简入门教程

上篇文章和大家聊了 Spring Session 实现 Session 共享的问题,有的小伙伴看了后表示对 Nginx 还是很懵,因此有了这篇文章,算是一个 Nginx 扫盲入门吧! <!--more--> 基本介绍Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。 Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。 Nginx 特点是占有内存少,并发能力强。 事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,一般来说,如果我们在项目中引入了 Nginx ,我们的项目架构可能是这样: 在这样的架构中 , Nginx 所代表的角色叫做负载均衡服务器或者反向代理服务器,所有请求首先到达 Nginx 上,再由 Nginx 根据提前配置好的转发规则,将客户端发来的请求转发到某一个 Tomcat 上去。 那么这里涉及到两个概念: 负载均衡服务器就是进行请求转发,降低某一个服务器的压力。负载均衡策略很多,也有很多层,对于一些大型网站基本上从 DNS 就开始负载均衡,负载均衡有硬件和软件之分,各自代表分别是 F5 和 Nginx (目前 Nginx 已经被 F5 收购),早些年,也可以使用 Apache 来做负载均衡,但是效率不如 Nginx ,所以现在主流方案是 Nginx 。 ...

June 5, 2019 · 1 min · jiezi

利用-Nginx-处理-Vue-开发环境的跨域

1. 需求本地测试域名与线上域名相同,以便正确传递 Cookie 和进行 SSO 测试。 注:由于 SSO 登录后,相关 Cookie 被加在四级域名上,因而需要做到本地测试域名和线上接口域名相同。 2. 方案配置 Host 文件使线上域名指向 Localhost: 127.0.0.1 product.xxx.xxx.com配置 Nginx 进行对应转发: server { listen 80; listen [::]:80; server_name ${product.xxx.xxx.com}; location /api { proxy_pass https://${ip.ip.ip.ip}; proxy_set_header Host $host; } location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; } }配置 vue.config.js 以免出现 Invalid Host header 报错: { devServer: { disableHostCheck: true }}

June 5, 2019 · 1 min · jiezi

nginx运维基础3Nginx的编译PHP

Apache默认是把PHP作为本身的一个模块(mod_php)来运行的,而Nginx是以FastCGI方式运行的。所以使用Nginx+PHP就是直接配置为FastCGI模式。 安装PHP下载地址: http://php.net/downloads #下载PHPcd /usr/local/src/wget http://cn2.php.net/distributions/php-5.5.0.tar.gz#安装依赖包yum -y install gcc make gd-devel libjpeg-devel libpng-devel libxml2-devel bzip2-devel libcurl-devel #编译安装,以下参数支持,ftp,图片函数,pdo等支持,因为使用了php自带的mysqlnd,所以不需要额外安装mysql的lib库了.如果你是64位系统,参数后面加上--with-libdir=lib64,如果不是可以跳过。tar -zxvf php-5.5.0.tar.bz2cd php-5.5.0./configure --prefix=/usr/local/php-5.5.0 --with-config-file-path=/usr/local/php-5.5.0/etc --with-bz2 --with-curl --enable-ftp --enable-sockets --disable-ipv6 --with-gd --with-jpeg-dir=/usr/local --with-png-dir=/usr/local --with-freetype-dir=/usr/local --enable-gd-native-ttf --with-iconv-dir=/usr/local --enable-mbstring --enable-calendar --with-gettext --with-libxml-dir=/usr/local --with-zlib --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --enable-dom --enable-xml --enable-fpm --with-libdir=lib64make&&make install#配置PHPcp php.ini-production /usr/local/php-5.5.0/etc/php.inicp /usr/local/php-5.5.0/etc/php-fpm.conf.default /usr/local/php-5.5.0/etc/php-fpm.conf#启动php-fpm/usr/local/php-5.5.0/sbin/php-fpm#查看进程netstat -lnt | grep 9000tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN配置Nginx+PHPnginx+php的配置比较简单,核心就一句话:把请求的信息转发给9000端口的PHP进程,让PHP进程处理指定目录下的PHP文件 location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; # 告诉PHP进程,当前的脚本是 $document_root$fastcgi_scriptname,PHP会去找这个脚本并处理,所以脚本的位置要指对 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params;}

June 4, 2019 · 1 min · jiezi

nginx部署代理跨域

关于nginx,咱们先了解nginx在开发过程中的主要作用nginx解决跨域nginx负载均衡一、nginx解决跨域如果要理解什么是跨域 广义上的跨域是指一个域下的文档或脚本试图去请求另一个域下的资源。即浏览器的同源策略/SOP限制引起的跨域也属于在内;那么什么是同源策略呢?同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。同源策略即: 协议+域名+端口"三者相同常见的跨域场景如下: URL 说明 是否允许通信 http://www.baidu.com/hello.js http://www.baidu.com/world.js 同一域名,不同文件或路径 允许(无跨域) http://www.baidu.com/hello/world.js http://www.baidu.com:8000/hello.js http://www.baidu.com/hello.js 同一域名,不同端口 不允许(有跨域) http://www.baidu.com/hello.js https://www.baidu.com/world.js 同一域名,不同协议 不允许(有跨域) http://www.baidu.com/hello.js http://192.168.22.128/world.js 域名和域名对应ip 不允许(有跨域) http://baidu.com/hello.js http://x.baidu.com/hello.js 主域相同,子域不同 不允许(有跨域) http://www.baidu.com/hello.js http://www.baidu.com/hello.js http://www.bai.com/world.js 不同域名 不允许(有跨域)常见的跨域解决方案有如下:1. jsonp解决跨域2. document.domain + iframe解决跨域3. nginx代理解决跨域4. nodejs中间件代理解决跨域重点来了 nginx代理解决跨域;server { listen 80; server_name localhost; //前端域名 具体原理解释在下方 location / { // location / 代理所有请求 而如果是 location /api 则匹配到有/api 前缀的请求才会代理 proxy_pass www.baidu.com; // 服务端域名 } }前端server域名是localhost服务器server域名是www.baidu.com根据浏览器的SOP/同源策略 localhost对www.baidu.com发起请求一定会出现跨域问题;但现在只要我们启动nginx服务器把server_name设置成前端的域名,此时前端发起的请求相当于是localhost对localhost发起,这样是不会引起跨域的;但真实情况是,nginx对localhost的请求代理回 www.baidu.com这里赘述一下什么是代理; ...

June 4, 2019 · 1 min · jiezi

PHP技术栈

本文旨在给要学习 PHP 的新手一个大概的认知轮廓,在心里有个学习的结构,有的放矢,避免走太多弯路。大神请忽略。 入门阶段预备知识1、掌握基本HTML、JS、CSS语法;熟悉 Bootstrap。 参考: https://www.runoob.com/html/h... https://www.liaoxuefeng.com/w... https://www.runoob.com/css/cs... 验收最低标准:模仿写出jd.com或者vip.com首页第一屏内容。2、熟悉Linux命令行 熟悉常用发行版系统(CentOS、Ubuntu)安装 熟悉常用命令行操作,包括文件管理、用户管理、权限管理、防火墙管理等 熟悉VIM使用 验收最低标准:掌握lnmp环境搭建。PHP基础掌握PHP基础语法、文件上传、cookie、Session、JSON。 掌握MySQL数据库连接:pdo使用。 掌握redis连接及简单应用。 掌握命名空间。 掌握面向对象编程思想。 参考:https://www.runoob.com/php/php-tutorial.html 学习框架学会使用ThinkPHP框架。主要是该框架在国内使用普及率太高了。不建议使用Laravel入门,因为该框架使用了较多的语法糖、第三方库,对新手可能有难度。 验收最低标准:可以使用ThinkPHP最新版作为入手框架,写出一个简单的博客。页面简单写就行。数据之间使用TP的 display 渲染到页面。学习写接口学会 Charles 抓包,看豆瓣的接口返回的数据。 学会写接口(GET、POST)的就行。 学会使用 POSTMAN。 验收标最低准:把上面的博客项目改成前后端分离的,先写完接口(最好有文档),再在页面里使用ajax调用接口数据。至此,你已经入门了。如果需要继续往下,还要学习。 第二阶段PHP使用 composer 安装PHP第三方库 对于PHP断点调试非常熟悉 学习常用PHP扩展 使用 SPL 掌握 PSR 规范 掌握反射的使用 掌握设计模式 熟练使用常用框架。 了解php和php-fpm的大部分配置选项和含义。 熟悉HTTP协议。 熟悉正则表达式。 MYSQL熟悉MYSQL优化的一些技巧,例如MySQL的性能追查,包括slow_log/explain等;对于order by、limit、like等一些坑能避开;能够熟练使用常用的索引;对于表结构创建选用哪种数据类型做到胸有成竹等等。 熟悉常用的配置,知道如何调优。 熟练配置主从。 NOSQL掌握Redis使用:对于常用数据结构的经典使用场景非常熟悉;了解Redis的事务、RDB、AOF等机制。 掌握memcache的使用,知道与redis的区别。 了解一下MongoDB。 Linux熟悉常用文本命令:例如wc、awk、split、diff、grep、sed等。 熟悉sort、uniq的使用。 熟练掌握ps、netstat、top等命令使用。 熟练使用Supervisor。 熟悉如何编写shell脚本。 能够理解Nginx的配置的含义。 第三阶段PHP该阶段PHP已经非常熟悉了,拥有快速开发项目、快速解决BUG的能力。代码遵循psr规范、稳定性很高。 熟悉消息队列使用,在很多场景合适的选择消息队列进行异步解耦。 熟悉如何使用 Elasticsearch 代替MYSQL的全文搜索功能。 熟悉多进程编程。 熟悉socket编程,对于网络IO模型有一定的认知,熟悉多路复用(select/poll/epoll)技术。 熟悉swoole框架,能应用于项目上。 不限制于框架本身,任何框架一天内快速入手。 对php的工作机制熟悉,熟悉php-fpm生命周期。 能够知道PHP相对于c等强类型语言性能为什么会慢。 对于PHP内部的实现原理有一定的认知,例如变量的实现、zend引擎的了解。 对于PHP的扩展有一定的认知,可以编写简单的扩展。 ...

June 4, 2019 · 1 min · jiezi

Nginx-转发-socket-端口配置

原文链接:何晓东 博客 Nginx 转发 socket 端口常见场景:在线学习应用,在常规功能之外,增加一个聊天室功能,后端选择 swoole 提供服务提供者,同时不想前端直接 ip:port 方式链接到服务,需要使用 Nginx 进行转发。常规情况,我们可以在用户页面,直接建立 socket 链接,但这样的操作会暴露端口,带来一定的安全隐患,使用 Nginx 进行转发,可以隐藏端口。额外的问题就是一些 header 参数也需要在转发过程中带给 socket 服务提供者,其他只需要 Nginx 处理一下从常规协议转换到 Websocket 就可以。 其中,"Upgrade" 是 逐跳(hop-by-hop) 头,无法从客户端转发到代理服务器,通过转发代理,客户端可以使用 CONNECT 方法来规避此问题。但是,这不适用于反向代理,因为客户端不知道任何代理服务器,并且需要在代理服务器上进行特殊处理。同时逐跳头包含 "Upgrade" 和 "Connection" 都无法传递,则需要在转换为 Websocket 的时候带上这两个参数:例如: location /chat/ { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";}进阶:让转发到代理服务器的 "Connection" 头字段的值,取决于客户端请求头的 "Upgrade" 字段值。例如: http { map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { ... location /chat/ { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } }注意:示例中的 http://backend 为一组负载均衡的服务器,只有单台服务器的,可以写成 proxy_pass http://127.0.0.1:9501; 这样的。 ...

June 3, 2019 · 1 min · jiezi

Cenos服务器中配置nginx

下载安全终端MobaXterm_Personal首先,下载安全终端后,连接到自已的公网IP 连接成功后显示如以上. Nginx简介Nginx是一款轻量级的网页服务器、反向代理服务器。相较于Apache、lighttpd具有占有内存少,稳定性高等优势。它最常的用途是提供反向代理服务 连接上服务器后 第一步:安装gcc gcc-c++命令为: yum install -y gcc gcc-c++第二步:安装PCRE库$ cd /usr/local/$ wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz$ tar -zxvf pcre-8.36.tar.gz$ cd pcre-8.36$ ./configure$ make && make install如报错:configure: error: You need a C++ compiler for C++ support解决:yum install -y gcc gcc-c++ 第三步:安装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第四步:安装zlib库存$ cd /usr/local/$ wget http://zlib.net/zlib-1.2.11.tar.gz$ tar -zxvf zlib-1.2.11.tar.gz$ ./configure$ make && make install第五步:安装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 --user=nobody --group=nobody --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-http_sub_module --with-http_ssl_module(注: --with-http_ssl_module:这个不加后面在nginx.conf配置ssl:on后,启动会报nginx: [emerg] unknown directive "ssl" in /opt/nginx/conf/nginx.conf 异常)$ make && make install启动nginx$ /usr/local/nginx/sbin/nginx第六步:检查是否启动成功打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功. ...

June 3, 2019 · 1 min · jiezi

nginx运维基础2Nginx的配置文件说明及虚拟主机配置示例

配置文件说明#定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为当前主机的CPU总核心数。worker_processes 8; #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]error_log ar/loginx/error.log info; #进程文件pid /usr/local/nginx/logs/nginx.pid; #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。worker_rlimit_nofile 65535; #工作模式与连接数上限events{ #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。 use epoll; #单个进程最大连接数(最大连接数=连接数*进程数) worker_connections 65535;} #设定http服务器http{ include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型 charset utf-8; #默认编码 server_names_hash_bucket_size 128; #服务器名字的hash表大小 client_header_buffer_size 32k; # 客户请求头缓冲大小 nginx默认会用client_header_buffer_size这个buffer来读取header值,如果 header过大,它会使用large_client_header_buffers来读取 large_client_header_buffers 4 64k; client_max_body_size 8m; #设定请求大小; sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。 autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。 tcp_nopush on; #防止网络阻塞 tcp_nodelay on; #防止网络阻塞 keepalive_timeout 120; #长连接超时时间,单位是秒 #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; #gzip模块设置 gzip on; #开启gzip压缩输出 gzip_min_length 1k; #最小压缩文件大小 gzip_buffers 4 16k; #压缩缓冲区 gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0) gzip_comp_level 2; #压缩等级 gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。 gzip_vary on; #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用 upstream nginx.com { #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。 server 192.168.80.121:80 weight=3; server 192.168.80.122:80 weight=2; server 192.168.80.123:80 weight=3; } #虚拟主机的配置,一个server就代表一个虚拟主机,这里可重复设置的配置很多,建议使用include,设置多个主机的时候可以减少配置文件的代码量; server { #监听端口 listen 80; #域名可以有多个,用空格隔开 server_name www.nixi8.com nixi8.com; index index.html index.htm index.php; root /data/www/nixi8; ##### include enable-php.conf ##### #资源定位 location ~ .*.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } #图片缓存时间设置 location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10d; } #JS和CSS缓存时间设置 location ~ .*.(js|css)?$ { expires 1h; } #日志格式设定 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; #定义本虚拟主机的访问日志 access_log /home/wwwlogs/access.log access; #对 "/" 启用反向代理 location / { proxy_pass http://127.0.0.1:88; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #以下是一些反向代理的配置,可选。 proxy_set_header Host $host; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数, proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 } #设定查看Nginx状态的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file confpasswd; #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。 } #本地动静分离反向代理配置 #所有jsp的页面均交由tomcat或resin处理 location ~ .(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; } #所有静态文件由nginx直接读取不经过tomcat或resin location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { expires 15d; } location ~ .*.(js|css)?$ { expires 1h; } }}修改了配置文件后最好先检查一下修改过的配置文件是否正 确,以免重启后Nginx出现错误影响服务器稳定运行。判断Nginx配置是否正确命令如下: ...

June 2, 2019 · 2 min · jiezi

Docker快速搭建一套PHPNginxMySQLRedisXdebugMemcached-开发环境并演进

痛点笔者在尝试起一个新web项目时,往往会陷入重新建立一套Docker环境的繁琐事当中。我想大家在开始做一个新项目时,或者快速为了和以前的项目做完全的隔离,也会起一套新docker环境。 从这篇文章你会得到采用docker-compose容器编排技术,一步启动全部服务。php容器在官方的基础上还打包了一些常用拓展(附带build源码,动手能力强可以自己打包),php,nginx,mysql都附带有自定义配置文件(便于开发测试的配置调整),都供下载。 架构 本片文章搭建出来的环境如上图。 环境说明运行环境Mac OS 10.13.6Virtual Box 5.2.14Ubuntu 16.04.4Docker 17.07.0-ce容器Nginx 1.12.1-alpinePHP-fpm 5.6MySQL 5.7Redis 3.2Memcached 1.4.27这里说明一下笔者运行环境,采用了在Mac机上安装vbox虚拟机,在虚拟机里面的debian环境安装了Docker环境,文件放在Mac环境,通过文件挂载方式,达到Mac环境编辑,Docker环境实时更新效果。你要问为啥不在Mac下直接装Docker,历史原因~运行材料.├── build ## docker 镜像build 材料│   ├── php5.6 ## php 5.6│   │   ├── Dockerfile│   │   ├── imagick-3.4.3.tgz│   │   ├── memcached-2.2.0.tgz│   │   ├── redis-4.0.2.tgz│   │   ├── sources.list│   │   └── xdebug-XDEBUG_2_5_5.tar.gz│   └── php-cli ## php cli 的自建镜像│   ├── amqp-1.9.3.tgz│   ├── Dockerfile│   ├── Dockerfile-php-swoole│   ├── memcached-3.0.4.tgz│   ├── redis-4.1.1.tgz│   ├── sources.list.jessie│   ├── swoole-4.0.4.tgz│   ├── swoole-4.2.6.tgz│   ├── xdebug-2.6.1.tgz│   └── yaf-3.0.7.tgz├── config ## 配置文件│ ├── apt ## 由于使用的debian系列,所以命名apt│ │ └── sources.list ## 更新为国内源│ ├── memcached ## memchached的配置│ │ └── memcached.conf│ ├── mysql ## mysql 的配置│   │   ├── conf.d│   │   │   └── mysqld_safe_syslog.cnf│   │   └── my.cnf│ ├── nginx ## nginx 的配置│   │   ├── conf.d│   │   │   ├── default│   │   │   └── xiuno│   │   ├── mime.types│   │   ├── nginx.conf│   │   └── sites-enabled│ ├── php ## php的配置,分cli,和fpm配置│   │   ├── cli│   │   │   ├── conf.d│   │   │   │   ├── 05-opcache.ini│   │   │   │   ├── 10-pdo.ini│   │   │   │   ├── 20-curl.ini│   │   │   │   ├── 20-gd.ini│   │   │   │   ├── 20-imagick.ini│   │   │   │   ├── 20-json.ini│   │   │   │   ├── 20-memcache.ini│   │   │   │   ├── 20-mysqli.ini│   │   │   │   ├── 20-mysql.ini│   │   │   │   ├── 20-pdo_mysql.ini│   │   │   │   ├── 20-readline.ini│   │   │   │   ├── 20-redis.ini│   │   │   │   ├── 20-xdebug.ini│   │   │   │   └── swoole.ini│   │   │   └── php.ini│   │   ├── fpm│   │   │   ├── conf.d│   │   │   │   ├── docker.conf│   │   │   │   ├── www.conf│   │   │   │   └── zz-docker.conf│   │   │   ├── docker-php-fpm.conf│   │   │   ├── php-fpm.conf│   │   │   ├── php.ini│   │   │   └── pool.d│   │   │   └── www.conf│   │   └── mods-available│   │   ├── curl.ini│   │   ├── gd.ini│   │   ├── imagick.ini│   │   ├── json.ini│   │   ├── memcache.ini│   │   ├── mysqli.ini│   │   ├── mysql.ini│   │   ├── opcache.ini│   │   ├── pdo.ini│   │   ├── pdo_mysql.ini│   │   ├── readline.ini│   │   ├── redis.ini│   │   └── xdebug.ini│ └── redis ## redis 配置│   ├── redis.conf│   ├── redis-server.sh│   └── sentinel.conf├── data ## 为了数据持久化│ ├── mysql ## mysql 文件挂载│ └── redis ## redis 持久化数据文件夹├── docker-compose.yaml ## 容器编排 !!!├── log ## 各个容器产生的日志│ ├── mysql ## mysql日志│ │ ├── error.log│ │ └── mysql.log│ ├── nginx ## nginx 日志│   │   ├── access.log│   │   ├── access_xiuno.log│   │   ├── error.log│   │   └── error_xiuno.log│   └── php├── php ## php代码存放目录│ └── xiunobbs ## php项目└── tool ## php 一些工具 ├── composer.phar └── phpunit-4.8.36.phar配置文件下载git clone https://gitee.com/xupaul/docker_fast_init配置说明目前笔者还没有写相关自动化脚本自动适配用户的使用环境,所以这里需要先调整一下下载后的配置文件。docker-compose.yml 文件调整这个文件有大量的文件挂载配置,这块就需要调整,拿一个举例。 ...

June 2, 2019 · 3 min · jiezi

nginx运维基础1Nginx的编译安装与使用

nginx的官方手册: http://nginx.org/en/docs/ 编译安装(本文以centos为例)下载地址: http://nginx.org/en/download.... # 为了支持rewrite功能,我们需要安装pcreyum install pcre*# 安装openssl,如果不需要ssl支持,请跳过这一步yum install openssl*# 编译./configure --prefix=/usr/local/nginx-1.5.1 \--with-http_ssl_module \--with-http_stub_status_module --with-pcre# 编译参数说明--with-http_stub_status_module #支持nginx状态查询--with-http_ssl_module #支持https--with-pcre #为了支持rewrite重写功能,必须制定pcrecd /usr/local/nginx 看到如下4个目录 conf 配置文件 html 网页文件logs 日志文件 sbin 主要二进制程序configure 参数说明--prefix= 指向安装目录--sbin-path 指向(执行)程序文件(nginx)--conf-path= 指向配置文件(nginx.conf)--error-log-path= 指向错误日志目录--pid-path= 指向pid文件(nginx.pid)--lock-path= 指向lock文件(nginx.lock)(安装文件锁定,防止安装文件被别人利用,或自己误操作。)--user= 指定程序运行时的非特权用户--group= 指定程序运行时的非特权用户组--builddir= 指向编译目录--with-rtsig_module 启用rtsig模块支持(实时信号)--with-select_module 启用select模块支持(一种轮询模式,不推荐在高载环境下使用)禁用:--without-select_module--with-poll_module 启用poll模块支持(功能与select相同,与select特性相同,为一种轮询模式,不推荐在高载环境下使用)--with-file-aio 启用file aio支持(一种APL文件传输格式)--with-ipv6 启用ipv6支持--with-http_ssl_module 启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)--with-http_realip_module 启用ngx_http_realip_module支持(这个模块允许从请求标头更改客户端的IP地址值,默认为关)--with-http_addition_module 启用ngx_http_addition_module支持(作为一个输出过滤器,支持不完全缓冲,分部分响应请求)--with-http_xslt_module 启用ngx_http_xslt_module支持(过滤转换XML请求)--with-http_image_filter_module 启用ngx_http_image_filter_module支持(传输JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。gd库要用到)--with-http_geoip_module 启用ngx_http_geoip_module支持(该模块创建基于与MaxMind GeoIP二进制文件相配的客户端IP地址的ngx_http_geoip_module变量)--with-http_sub_module 启用ngx_http_sub_module支持(允许用一些其他文本替换nginx响应中的一些文本)--with-http_dav_module 启用ngx_http_dav_module支持(增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)默认情况下为关闭,需编译开启--with-http_flv_module 启用ngx_http_flv_module支持(提供寻求内存使用基于时间的偏移量文件)--with-http_gzip_static_module 启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)--with-http_random_index_module 启用ngx_http_random_index_module支持(从目录中随机挑选一个目录索引)--with-http_secure_link_module 启用ngx_http_secure_link_module支持(计算和检查要求所需的安全链接网址)--with-http_degradation_module 启用ngx_http_degradation_module支持(允许在内存不足的情况下返回204或444码)--with-http_stub_status_module 启用ngx_http_stub_status_module支持(获取nginx自上次启动以来的工作状态)--without-http_charset_module 禁用ngx_http_charset_module支持(重新编码web页面,但只能是一个方向--服务器端到客户端,并且只有一个字节的编码可以被重新编码)--without-http_gzip_module 禁用ngx_http_gzip_module支持(该模块同-with-http_gzip_static_module功能一样)--without-http_ssi_module 禁用ngx_http_ssi_module支持(该模块提供了一个在输入端处理处理服务器包含文件(SSI)的过滤器,目前支持SSI命令的列表是不完整的)--without-http_userid_module 禁用ngx_http_userid_module支持(该模块用来处理用来确定客户端后续请求的cookies)--without-http_access_module 禁用ngx_http_access_module支持(该模块提供了一个简单的基于主机的访问控制。允许/拒绝基于ip地址)--without-http_auth_basic_module禁用ngx_http_auth_basic_module(该模块是可以使用用户名和密码基于http基本认证方法来保护你的站点或其部分内容)--without-http_autoindex_module 禁用disable ngx_http_autoindex_module支持(该模块用于自动生成目录列表,只在ngx_http_index_module模块未找到索引文件时发出请求。)--without-http_geo_module 禁用ngx_http_geo_module支持(创建一些变量,其值依赖于客户端的IP地址)--without-http_map_module 禁用ngx_http_map_module支持(使用任意的键/值对设置配置变量)--without-http_split_clients_module 禁用ngx_http_split_clients_module支持(该模块用来基于某些条件划分用户。条件如:ip地址、报头、cookies等等)--without-http_referer_module 禁用disable ngx_http_referer_module支持(该模块用来过滤请求,拒绝报头中Referer值不正确的请求)--without-http_rewrite_module 禁用ngx_http_rewrite_module支持(该模块允许使用正则表达式改变URI,并且根据变量来转向以及选择配置。如果在server级别设置该选项,那么他们将在 location之前生效。如果在location还有更进一步的重写规则,location部分的规则依然会被执行。如果这个URI重写是因为location部分的规则造成的,那么 location部分会再次被执行作为新的URI。 这个循环会执行10次,然后Nginx会返回一个500错误。)--without-http_proxy_module 禁用ngx_http_proxy_module支持(有关代理服务器)--without-http_fastcgi_module 禁用ngx_http_fastcgi_module支持(该模块允许Nginx 与FastCGI 进程交互,并通过传递参数来控制FastCGI 进程工作。 )FastCGI一个常驻型的公共网关接口。--without-http_uwsgi_module 禁用ngx_http_uwsgi_module支持(该模块用来医用uwsgi协议,uWSGI服务器相关)--without-http_scgi_module 禁用ngx_http_scgi_module支持(该模块用来启用SCGI协议支持,SCGI协议是CGI协议的替代。它是一种应用程序与HTTP服务接口标准。它有些像FastCGI但他的设计 更容易实现。)--without-http_memcached_module 禁用ngx_http_memcached_module支持(该模块用来提供简单的缓存,以提高系统效率)-without-http_limit_zone_module 禁用ngx_http_limit_zone_module支持(该模块可以针对条件,进行会话的并发连接数控制)--without-http_limit_req_module 禁用ngx_http_limit_req_module支持(该模块允许你对于一个地址进行请求数量的限制用一个给定的session或一个特定的事件)--without-http_empty_gif_module 禁用ngx_http_empty_gif_module支持(该模块在内存中常驻了一个1*1的透明GIF图像,可以被非常快速的调用)--without-http_browser_module 禁用ngx_http_browser_module支持(该模块用来创建依赖于请求报头的值。如果浏览器为modern ,则$modern_browser等于modern_browser_value指令分配的值;如 果浏览器为old,则$ancient_browser等于 ancient_browser_value指令分配的值;如果浏览器为 MSIE中的任意版本,则 $msie等于1)--without-http_upstream_ip_hash_module 禁用ngx_http_upstream_ip_hash_module支持(该模块用于简单的负载均衡)--with-http_perl_module 启用ngx_http_perl_module支持(该模块使nginx可以直接使用perl或通过ssi调用perl)--with-perl_modules_path= 设定perl模块路径--with-perl= 设定perl库文件路径--http-log-path= 设定access log路径--http-client-body-temp-path= 设定http客户端请求临时文件路径--http-proxy-temp-path= 设定http代理临时文件路径--http-fastcgi-temp-path= 设定http fastcgi临时文件路径--http-uwsgi-temp-path= 设定http uwsgi临时文件路径--http-scgi-temp-path= 设定http scgi临时文件路径-without-http 禁用http server功能--without-http-cache 禁用http cache功能--with-mail 启用POP3/IMAP4/SMTP代理模块支持--with-mail_ssl_module 启用ngx_mail_ssl_module支持--without-mail_pop3_module 禁用pop3协议(POP3即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。是因特网电子邮件的第一个离线协议标 准,POP3协议允许用户从服务器上把邮件存储到本地主机上,同时根据客户端的操作删除或保存在邮件服务器上的邮件。POP3协议是TCP/IP协议族中的一员,主要用于 支持使用客户端远程管理在服务器上的电子邮件)--without-mail_imap_module 禁用imap协议(一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。IMAP协议运行在TCP/IP协议之上, 使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。)--without-mail_smtp_module 禁用smtp协议(SMTP即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。)--with-google_perftools_module 启用ngx_google_perftools_module支持(调试用,剖析程序性能瓶颈)--with-cpp_test_module 启用ngx_cpp_test_module支持--add-module= 启用外部模块支持--with-cc= 指向C编译器路径--with-cpp= 指向C预处理路径--with-cc-opt= 设置C编译器参数(PCRE库,需要指定–with-cc-opt=”-I /usr/local/include”,如果使用select()函数则需要同时增加文件描述符数量,可以通过–with-cc- opt=”-D FD_SETSIZE=2048”指定。)--with-ld-opt= 设置连接文件参数。(PCRE库,需要指定–with-ld-opt=”-L /usr/local/lib”。)--with-cpu-opt= 指定编译的CPU,可用的值为: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64--without-pcre 禁用pcre库--with-pcre 启用pcre库--with-pcre= 指向pcre库文件目录--with-pcre-opt= 在编译时为pcre库设置附加参数--with-md5= 指向md5库文件目录(消息摘要算法第五版,用以提供消息的完整性保护)--with-md5-opt= 在编译时为md5库设置附加参数--with-md5-asm 使用md5汇编源--with-sha1= 指向sha1库目录(数字签名算法,主要用于数字签名)--with-sha1-opt= 在编译时为sha1库设置附加参数--with-sha1-asm 使用sha1汇编源--with-zlib= 指向zlib库目录--with-zlib-opt= 在编译时为zlib设置附加参数--with-zlib-asm= 为指定的CPU使用zlib汇编源进行优化,CPU类型为pentium, pentiumpro--with-libatomic 为原子内存的更新操作的实现提供一个架构--with-libatomic= 指向libatomic_ops安装目录--with-openssl= 指向openssl安装目录--with-openssl-opt 在编译时为openssl设置附加参数--with-debug 启用debug日志常用操作# 启动/usr/nginx/sbin/nginx nginx startservice nginx start # centos7以下# 重启kill -HUP 主进程号或进程号文件路径/usr/nginx/sbin/nginx -s reload # 关闭/usr/nginx/sbin/nginx -s stop # 停止运行ps -ef | grep nginx # 查到主进程号kill -QUIT 主进程号 #从容停止kill -TERM 主进程号 #快速停止Nginxpkill -9 nginx #强制停止Nginx#另外, 若在nginx.conf配置了pid文件存放路径则该文件存放的就是Nginx主进程号,如果没指定则放在nginx的logs目录下。有了pid文件,我们就不用先查询Nginx的主进程号,而直接向Nginx发送信号了,命令如下:kill -信号类型 '/usr/nginx/logs/nginx.pid'信号控制语法命令信号选项nginx的主进程号Kill-HUP4873Kill-USR1cat /xxx/path/log/nginx.pid信号选项命令信号选项TERM, INT快速关闭QUIT优雅的关闭进程,即等请求结束后再关闭HUP改变配置文件,平滑的重读配置文件(不需要重启)USR1重读日志,在日志按月/日分割时有用USR2平滑的升级WINCH优雅关闭旧的进程(配合USR2来进行升级)

June 1, 2019 · 1 min · jiezi

高性能网站搭建前端性能优化-附Vue首屏加载时间优化详细方案

前言事实上, 只有10%-20%的最终用户响应时间是发在从Web服务器获取HTML文档并传送到浏览器中的。如果希望能够有效地减少页面的响应时间,就必须关注剩余80%-90%的最终用户体验。--Steve Souders在这篇博客中,我根据工作中的实际项目经验和一些测试的经验中总结出了前端页面在性能上优化方案。其中一些经验吸收自《高性能网站建设指南》Steve Souders 著 电子工业出版社。 一、 代码相关优化1. 将样式表放在首部-使用link标签将样式表放在文档的HEAD中遵循HTML规范,将样式表放在头部,可以有效避免白屏和无样式内容的闪烁。<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title></title> <!-- 使用link标签将样式表放在文档的HEAD中 --> <link rel="stylesheet" href="example.css"></head><body></body></html>2. 将脚本放在底部将脚本放在顶部会造成的影响: 脚本阻塞对其后面内容的显示; 脚本会阻塞对其后面组件的下载;将脚本放在底部</body>标签之前, 类似于document.body.appendChild(yourScript), 不会阻塞页面内容的呈现,而且页面中的可视组件可以尽早下载。<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title></title> <link rel="stylesheet" href="example.css"></head><body> <!-- 将脚本放在底部 --> <script src="example.js"></script></body></html>3. 减少HTTP请求1) CSS Sprites (雪碧图)将多个图片合成一张图片,通过background-position来定位所需要的图片。每次请求的话只需要请求一张图片减少http请求。(如果使用图标的话建议使用svg,也可以使用iconfont)合成雪碧图的工具有很多本地工具:https://github.com/iwangx/sprite(国人写的)在线工具https://www.toptal.com/develo...本地工具: 在线工具: 2) 内联图片和脚本通过内联图片和脚本无需额外的HTTP请求,图片小于10K的可以设置内联为base64位。<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4SUJRXhpZgAATU>3) 合并脚本和样式表一般来说,使用外部脚本和样式表对性能更有利,然而如果将模块化的代码分开放到多个小文件中,会降低性能,每个文件都会导致一个额外的HTTP请求4. 使用外部Javascript和cssGood <link rel="stylesheet" href="example.css"><script src="example.js"></script>bad <style>// code</style><script>// code</script>使用外部Javascript和Css的主要作用有: 可以配置缓存 有利于组件重用5. 使用CDN (内容分发网络 Content Delivery Network)CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。--摘自百度百科通过CDN引入的资源目前基本都是使用目前最新的HTTP2协议,所以在性能上可以做到极致优化,感谢CDN。BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务UNPKG6. 代码压缩1) Gzip 压缩gzip压缩可以节省50%-70%的网络开销浏览器支持的压缩类型可以通过network的Accept-Encoding: gzip, deflate来查看。支持deflate的浏览器也支持gzip,但很多浏览器支持gzip却不支持deflate,因此gzip是最理想的压缩方法node端 使用compression如果是webpack项目可以看下面的Vue首屏加载时间优化方案里的gzip压缩// npm install compression --save-devconst compression = require('compression')2) 代码压缩前端打包压缩的有grunt,gulp,webpack,可以对HTML,CSS,Javascript代码压缩 ...

May 31, 2019 · 2 min · jiezi

模拟nginx热部署

热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。首先在本地模拟一个线上需要升级 Nginx 的环境,假设旧版本为 nginx-1.0.15,需要升级到 nginx-1.16.0。 配置旧版本# 下载 nginx-1.0.15wget http://nginx.org/download/nginx-1.0.15.tar.gz# 解压压缩包tar -zxf nginx-1.0.15.tar.gz# 进入解压后的目录cd nginx-1.0.15# 配置 nginx./configure --prefix=/home/nginx# 编译安装make && make install# 运行 nginxsudo /home/nginx/sbin/nginx此时访问服务器地址应该可以看到 nginx 的欢迎页面了。 获得新版本二进制# 下载 nginx-1.16.0wget http://nginx.org/download/nginx-1.16.0.tar.gz# 解压压缩包tar -zxf nginx-1.16.0# 进入解压后的目录cd nginx-1.16.0/# 配置 nginx./configure --prefix=/home/nginx# 只编译不需要安装make在编译后的 objs 目录中,可以看到二进制文件 nginx。 热部署经过以上步骤,我们实现了一个正在运行的旧版本 nginx 和编译完成的新版本 nginx 二进制执行文件。 热部署的流程是: 备份旧的 nginx 可执行文件新的 nginx 可执行文件直接替换旧的(此时旧的 nginx 进程还在运行)向 nginx master 进程发送热部署信号,新的 nginx 进程启动,旧的 worker 不再就收请求。关闭旧的 worker 进程,完成热部署。# 备份cp /home/nginx/sbin/nginx /home/nginx/sbin/nginx.old# 替换 cp -f objs/nginx /home/nginx/sbin/nginx# 查看 master pidps -ef | grep nginx root 23712 1 0 21:21 ? 00:00:00 nginx: master process /home/nginx/sbin/nginxnobody 23715 23712 0 21:21 ? 00:00:00 nginx: worker process# 发送热部署信号,这里 master pid 替换为自己查询到的kill -USR2 23712# 查看当前 nginx 进程情况,27522 就是新的 master 进程ps -ef | grep nginx root 23712 1 0 21:21 ? 00:00:00 nginx: master process /home/nginx/sbin/nginxnobody 23715 23712 0 21:21 ? 00:00:00 nginx: worker processroot 27522 23712 0 21:41 ? 00:00:00 nginx: master process /home/nginx/sbin/nginxnobody 27524 27522 0 21:41 ? 00:00:00 nginx: worker process# 关闭旧的 workerkill -WINCH 23712# 再次查看进程,可以发现旧的worker进程关闭了ps -ef | grep nginx root 23712 1 0 21:21 ? 00:00:00 nginx: master process /home/nginx/sbin/nginxroot 27522 23712 0 21:41 ? 00:00:00 nginx: master process /home/nginx/sbin/nginxnobody 27524 27522 0 21:41 ? 00:00:00 nginx: worker process保留旧的 master 进程是为了在新的版本存在问题时,可以快速回退到原版本。如果发现问题要紧急回滚呢? ...

May 30, 2019 · 2 min · jiezi

Nginx-操作响应头信息

原文链接:何晓东 博客 前置条件:需要编译 ngx_http_headers_module 模块,才支持 header 头信息操作add_header意思为将自定义的头信息的添加到响应头,指令为 add_header name value [always];,可以用在 http {}, server {}, location {}, if in location {} 上下文中,只有当响应状态码等于 200, 201 (1.3.10), 204, 206, 301, 302, 303, 304, 307 (1.1.16, 1.0.13), 或 308 (1.13.0) 时生效,如果 always 参数指定了,头信息将无视状态码,在所有响应中强制返回。 注意: 可以声明多个 add_header 指令,当且仅当 当前区块没有 add_header 的时候,才会继承上级声明的 add_header 信息 例如: server { add_header a 123; location / { root /path; } location /download/ { add_header b 321; }}如上的例子,在访问 /download/ 路由的时候,将返回 b 321 这样的头信息,而访问 / 路由时,将返回上级指定的 a 123 头信息。 ...

May 28, 2019 · 2 min · jiezi

Nginx-配置跨越支持

用你最美的姿态,去「跨域」那座山。阅读原文在日常的开放中,我们经常遇到跨域的问题,常用的处理方式都是在代码层添加 cros 支持,但若你有 Nginx 配置权限,在 Nginx 上处理跨域将使得程序异常简单和高效。 代理假设我们的前端域名为 example.com,API 服务架设在 api.example.com 域名下,那我们可以通过代理的形式来配置跨越请求,具体的配置为: 在 Nginx 的 example.com 虚拟主机文件中配置如下的代理配置成功重启后,前端即可用 example.com/api 的方式和 API 交互# /etc/nginx/sites-enabled/example.com.conflocation /api/ { proxy_pass http://api.example.com/; }这种方式的原理是将 API 提供的服务,代理到前端域名的二级目录下,从而避免跨域。 Response Header当然由于很多情况下我们不想将服务代理到前端域名二级目下,那可以通过在 Http Response 中添加 Header 来解决跨越,具体配置如下: # /etc/nginx/snippets/cros.conf;if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always; add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,Content-Disposition' always; add_header 'Access-Control-Max-Age' 1728000 always; add_header 'Content-Length' 0; add_header 'Content-Type' 'text/plain; charset=utf-8'; return 204;}if ($request_method ~* "(GET|POST|DELETE|PUT)") { add_header 'Access-Control-Allow-Origin' '*' always;}关于何时会发起 OPTIONS 请求及 OPTIONS 请求的内容,可参考阮老师的这篇文章—— 跨域资源共享 CORS 详解然后在 API 服务域名下添加 CROS 支持即可 ...

May 27, 2019 · 1 min · jiezi

流程图模板免费下载制作流程图的是什么软件

亿图流程图制作软件是一款用于绘制各种流程图,同时兼具跨平台,云储存,分享功能的专业流程图制作软件。操作简单,功能强大,非常容易实现可视化、分析和交流复杂信息。软件内置海量精美的流程图模板与图库,帮助你轻松绘制项目管理流程图,程序流程图,工作流程图,过程流程图等。 如何用来绘制一个流程图呢 第一步 选择从模板创建或者创建一个新页面 方法一:创建一个新的页面 点击文件-新建-流程图。 双击模板下的流程图选择需要绘制的种类,进入编辑状态。 图片描述 方法二:使用模板创建程图 点击文件-新建-流程图。 当找到需要的模板时,双击模板或者点击右上角预览窗口下的创建导按钮,即可成功创建一个含有预设内容的流程图。 图片描述 第二步 添加图形 方法一:用图形的浮动按钮添加 从左侧模板库中拖出一个流程形状。 点击四周的浮动按钮。 图片描述 方法二: 从库里拖放添加 从界面左边的符号库里拖动一个图形。 把拖动的图形移动到要吸附的标题旁,松开鼠标会自动链接。 图片描述 第三步 排版和连接线样式 排版十分灵活,可以智能的调整大小和对齐,还可以根据已经存在图形的位置标出对齐线,其自动性为我们带来便捷。 图片描述 第四步 添加文本和其他内容 添加文本 双击流程图图形。 输入文本。 点击绘图页面的任意空白区域或者按 ESC 键完成输入文字。 图片描述 另外流程图制作软件不仅可以添加文件,还可以添加超链接,附件、图释和其他内容以提供上下文信息。 ...

May 27, 2019 · 1 min · jiezi

Python爬虫入门教程-7100-蜂鸟网图片爬取之二

1. 蜂鸟网图片-简介今天玩点新鲜的,使用一个新库 aiohttp ,利用它提高咱爬虫的爬取速度。 安装模块常规套路 pip install aiohttp 运行之后等待,安装完毕,想要深造,那么官方文档必备 :https://aiohttp.readthedocs.io/en/stable/ 接下来就可以开始写代码了。 我们要爬取的页面,这一次选取的是 http://bbs.fengniao.com/forum/forum_101_1_lastpost.html打开页面,我们很容易就获取到了页码 好久没有这么方便的看到页码了。 尝试用 aiohttp 访问这个页面吧,模块的引入,没有什么特殊的,采用 import 即可如果我们需要 使用Asyncio + Aiohttp异步IO 编写爬虫,那么需要注意,你需要异步的方法前面加上async 接下来,先尝试去获取一下上面那个地址的网页源码。 代码中,先声明一个fetch_img_url的函数,同时携带一个参数,这个参数也可以直接写死。 with 上下文不在提示,自行搜索相关资料即可 (`・・´) aiohttp.ClientSession() as session: 创建一个session对象,然后用该session对象去打开网页。session可以进行多项操作,比如post, get, put等 代码中 await response.text() 等待网页数据返回 asyncio.get_event_loop创建线程,run_until_complete方法负责安排执行 tasks中的任务。tasks可以为单独的函数,也可以是列表。 import aiohttp import asyncio async def fetch_img_url(num): url = f'http://bbs.fengniao.com/forum/forum_101_{num}_lastpost.html' # 字符串拼接 # 或者直接写成 url = 'http://bbs.fengniao.com/forum/forum_101_1_lastpost.html' print(url) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6726.400 QQBrowser/10.2.2265.400', } async with aiohttp.ClientSession() as session: # 获取轮播图地址 async with session.get(url,headers=headers) as response: try: html = await response.text() # 获取到网页源码 print(html) except Exception as e: print("基本错误") print(e)# 这部分你可以直接临摹loop = asyncio.get_event_loop()tasks = asyncio.ensure_future(fetch_img_url(1))results = loop.run_until_complete(tasks)上面代码最后一部分也可以写成 ...

May 27, 2019 · 2 min · jiezi

mac下修改nginx配置

主要命令: 查看nginx信息:brew info nginx切换至nginx配置文件所在路径:cd /usr/local/etc/nginx修改nginx配置文件:vim nginx.conf查看ng配置是否正确:nginx -t重启ng:nginx -s reload详细步骤如下: 1、通过查看nginx信息,查看配置文件所在路径 brew info nginx 2、切换至配置文件所在路径 cd /usr/local/etc/nginx 3、修改配置文件,以修改目录为例 将默认目录修改为指定目录/Users/lanyf/www vim nginx.conf找到 location / { root html; index index.html index.htm; }修改为 location / { root /Users/lanyf/www; index index.html index.htm; }4、查看修改后的配置是否正确 nginx -t5、重启ng nginx -s reload

May 26, 2019 · 1 min · jiezi

mac安装nginx

由于mac自带brew,所以mac下安装nginx相对比较简单。 主要命令: 查看版本号:brew -v更新Homebrew : brew update搜索nginx:brew search nginx安装:brew install nginx查看nginx版本:nginx -v查看nginx信息:brew info nginx启动nginx:nginx访问网址:http://localhost:8080重启nginx:nginx -s reload关闭nginx:ps -ef|grep nginx sudo kill -QUIT 进程号详细步骤请继续阅读: 1、查看brew版本 brew -v 由于我的brew版本比较旧,所以进行了更新 2、更新Homebrew brew update注:若无反应可进行切换镜像,可更换镜像,我使用的是清华大学的镜像:https://mirrors.tuna.tsinghua... 3、安装nginx(1)搜索nginx brew search nginx (2)安装nginx brew install nginx此处需要漫长的等待... 安装完成后,可查看nginx版本 nginx -v出现版本信息,说明安装成功 可通过以下命令查看nginx信息,如安装路径等 brew info nginx启动nginx nginxhttp://localhost:8080进行访问, 如果出现如下界面,说明启动成功 重启 nginx -s reload关闭 ps -ef|grep nginxsudo kill -QUIT 进程号

May 26, 2019 · 1 min · jiezi

Copy攻城狮日志Docker部署D2Admin-人人企业版

Created by huqi at 2019-5-24 21:01:30 Updated by huqi at 2019-5-26 00:00:42前言最近后端的小伙伴在探索docker部署,给我也提了需求,希望我别掉链子,也能将前端服务通过docker部署。于是乎,我在大掘金找到了一篇不错的实践,@快狗打车前端团队 的 [[手把手系列之]Docker 部署 vue 项目](https://juejin.im/post/5cce4b...。出于Copy的职业本能,看完文章立马动手尝试了一下,一顿操作猛如虎,通过Docker部署了一个vue-cli生成的demo,当然,理论上来看,也就是部署了一个静态目录dist。简单的实践效果如图。介于目前项目的前端开发基于D2Admin 人人企业版,有了快狗团队的手摸手,很快就能用Docker部署这样一个后台管理平台。本文默认使用linux且安装了docker@18.09.6、node@8.9.0及git@1.8.3.1。 git clone及项目打包“巧妇难为无米之炊”,代码都没有,何谈部署?说时迟那时快,先clone一下源代码。D2Admin 人人企业版大概9.25M的样子,我的ECS配置极差,网络环境也比较差,拉取的时间稍微长一点,都吃完一片西瓜了,都还在95%的进度。当然,乳沟您本地已经打包好了请略过一下操作,还有时间可以多吃几片西瓜。一般来说在实际上线中,前端可能只要给到打包之后的文件夹就够了。 git clone https://github.com/d2-projects/d2-admin-renren-security-enterprise.gitcd d2-admin-renren-security-enterprisenpm installnpm run build这里build主要目的还是为了获取到dist目录。 构建镜像,部署静态资源这里借助docke获取nginx镜像,通nginx镜像作为基础来构建D2Admin 人人企业版镜像。 拉取nginx镜像: docker pull nginx创建nginx配置文件: mkdir nginxvi nginx/deafult.confdeafult.conf server { listen 80; server_name localhost; #charset koi8-r; access_log /var/log/nginx/host.access.log main; error_log /var/log/nginx/error.log error; location / { root /usr/share/nginx/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 /usr/share/nginx/html; }}新建Dockerfile文件: ...

May 26, 2019 · 1 min · jiezi

vue项目打包后怎样优雅的解决跨域

前言在使用vue.js开发前端项目时,再结合webpack搞起各种依赖、各种插件进行开发,无疑给前端开发带来了很多便捷,就在解决跨域这个问题上,相信众多用vue.js的前端同僚们同我一样尝到了甜头,开发环境全靠proxyTable一通配置简直不要太酸爽。还不明所以然的新手们可能还没搞清我说的是什么,就是下面这几行配置: proxyTable: { '/api': { target: 'http://113.113.113.113:5000', //假的接口地址哈 changeOrigin: true, pathRewrite: { '^/api': '' } },我们的跨域竟然就这样完美的解决了,然后就开始愉快的请求后端的接口啦!! 回到正题具体场景:公司的一个h5项目是部署在客户端的,但是部署后出现bug了,由于多人协同开发且赶进度竟然是打包后因为CSS的问题多个页面布局乱了,但是开发环境并没有问题啊,怎么打完包样式就乱了?那就打开dist下的index.html看看呗,复现一下bug,想都不用想,页面没数据怎么复现,再去造一套假数据?作为一个不喜欢这样折腾的人必然是不想做这种事情的。 就不劳烦后端了,咱自己解决! nginx还是要会一些些的,自己配置一下,分分钟解决,哈哈! server { listen 8082; server_name 127.0.0.1; //咱自己nginx服务器地址 #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location /app-api { rewrite ^.+app-api/?(.*)$ /$1 break; include uwsgi_params; proxy_pass http://113.113.113.113:5001/; //后端接口地址 //关键部分start add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,token'; //关键部分end //以下配置参见nginx配置文档哈 #Proxy Settings proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Connection close; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_max_temp_file_size 0; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; }}目的是把后端接口用nginx再代理一遍,咱自己用nginx间接允许一下跨域请求! ...

May 25, 2019 · 1 min · jiezi

马蜂窝ABTest多层分流系统的设计与实

导读: 5 月 23 日,马蜂窝旅游网宣布完成 2.5 亿美元新一轮融资,此轮融资由腾讯领投。 在接授腾讯《潜望》栏目的专访时,马蜂窝 CEO 陈罡谈到,「现在马蜂窝是个数据驱动的公司,要以结果说话,能用 ABTest 解决的问题就没有必要谈其他」。 作为一家数据驱动的公司,当前在马蜂窝 ABTest 已经基本覆盖所有业务线并稳定运行。本篇文章,我们就来说一说驱动马蜂窝快速增长和优化的 ABTest 是什么,它究竟长什么样子。 什么是 ABTest产品的改变不是由我们随便「拍脑袋」得出,而是需要由实际的数据驱动,让用户的反馈来指导我们如何更好地改善服务。正如马蜂窝 CEO 陈罡在接受专访时所说:「有些东西是需要 Sense,但大部分东西是可以用 Science 来做判断的。」 说到 ABTest 相信很多读者都不陌生。简单来说,ABTest 就是将用户分成不同的组,同时在线试验产品的不同版本,通过用户反馈的真实数据来找出采用哪一个版本方案更好的过程。 我们将原始版本作为对照组,以每个版本进行尽量是小的流量迭代作为原则去使用 ABTest。一旦指标分析完成,用户反馈数据表现最佳的版本再去全量上线。 很多时候,一个按钮、一张图片或者一句文案的调整,可能都会带来非常明显的增长。这里分享一个ABTest 在马蜂窝的应用案例: 如图所示,之前我们交易中心的电商业务团队希望优化一个关于「滑雪」的搜索列表。可以看到优化之前的页面显示从感觉上是比较单薄的。但是大家又不确定复杂一些的展现形式会不会让用户觉得不够简洁,产生反感。因此,我们将改版前后的页面放在线上进行了 ABTest。最终的数据反馈表明,优化之后的样式 UV 提高了 15.21%,转化率提高了 11.83%。使用 ABTest 帮助我们降低了迭代的风险。 通过这个例子,我们可以更加直观地理解 ABTest 的几个特性: 先验性:采用流量分割与小流量测试的方式,先让线上部分小流量用户使用,来验证我们的想法,再根据数据反馈来推广到全流量,减少产品损失。并行性:我们可以同时运行两个或两个以上版本的试验同时去对比,而且保证每个版本所处的环境一致的,这样以前整个季度才能确定要不要发版的情况,现在可能只需要一周的时间,避免流程复杂和周期长的问题,节省验证时间。科学性:统计试验结果的时候,ABTest 要求用统计的指标来判断这个结果是否可行,避免我们依靠经验主义去做决策。为了让我们的验证结论更加准确、合理并且高效,我们参照 Google 的做法实现了一套算法保障机制,来严格实现流量的科学分配。 基于 Openresty 的多层分流模型大部分公司的 ABTest 都是通过提供接口,由业务方获取用户数据然后调用接口的方式进行,这样会将原有的流量放大一倍,并且对业务侵入比较明显,支持场景较为单一,导致多业务方需求需要开发出很多分流系统,针对不同的场景也难以复用。 为了解决以上问题,我们的分流系统选择基于 Openresty 实现,通过 HTTP 或者 GRPC 协议来传递分流信息。这样一来,分流系统就工作在业务的上游,并且由于 Openresty 自带流量分发的特性不会产生二次流量。对于业务方而言,只需要提供差异化的服务即可,不会侵入到业务当中。 选型 Openresty 来做 ABTest 的原因主要有以下几个: 整体流程 在设计 ABTest 系统的时候我们拆分出来分流三要素,第一是确定的终端,终端上包含了设备和用户信息;第二是确定的 URI ;第三是与之匹配的分配策略,也就是流量如何分配。 ...

May 24, 2019 · 2 min · jiezi

Nginx-静态文件服务配置及优化

原文链接: 何晓东 博客 根目录和索引文件root 指令指定将用于搜索文件的根目录。 为了获取所请求文件的路径,NGINX 将请求 URI 附加到 root 指令指定的路径。该指令可以放在 http {},server {} 或 location {} 上下文中的任何级别。在下面的示例中,为虚拟服务器定义了 root 指令。 它适用于未包含根指令的所有location {} 块,以显式重新定义根: server { root /www/data; location / { } location /images/ { } location ~ \.(mp3|mp4) { root /www/media; }}在这里,NGINX 针对 /images/ 开头的 URI 将在文件系统的 /www/ data/images/ 目录中搜索相应文件。 如果 URI 以 .mp3 或 .mp4 扩展名结尾,则 NGINX 会在 /www/media/ 目录中搜索该文件,因为它是在匹配的位置块中定义的。 如果请求以 / 结尾,则 NGINX 将其视为对目录的请求,并尝试在目录中查找索引文件。index 指令定义索引文件的名称(默认值为 index.html)。要继续该示例,如果请求 URI 是 /images/some/path/,则 NGINX 会返回文件 /www/data/images/some/path/index.html(如果存在)。如果没有,NGINX 默认返回 HTTP 404 错误(未找到)。要配置 NGINX 以返回自动生成的目录列表,请在 autoindex 指令中包含 on 参数: ...

May 23, 2019 · 2 min · jiezi

常用nginx-web配置

常用nginx对于web项目配置整理,做个笔记。 php web项目配置: server { listen 80; listen [::]:80; # 设置上传最大为5MB client_max_body_size 5m; root /srv/www/wechat/public; index index.html index.php; server_name example.com; location / { try_files $uri $uri/ =404; } # 支持php location ~ \.php$ { # Check that the PHP script exists before passing it try_files $fastcgi_script_name =404; fastcgi_index index.php; include fastcgi.conf; # With php-fpm (or other unix sockets): fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; # # With php-cgi (or other tcp sockets): # fastcgi_pass 127.0.0.1:9000; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; }}php web项目配置 支持laravel、symfony、Yii2单入口: ...

May 23, 2019 · 2 min · jiezi

服务器部署之Nginx

什么是nginx业务场景 优点特性 使用 Nginx.conf #user nobody; # 用户权限worker_processes auto; # 工作进程的数量#worker_cpu_affinity auto;#全局错误日志及PID文件error_log logs/error.log; # 日志输出#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;events { #epoll是多路复用IO(I/O Multiplexing)中的一种方式, #use 设置用于复用客户端线程的轮询方法。如果你使用Linux 2.6+,你应该使用epoll。如果你使用*BSD,你应该使用kqueue。 use epoll; # IOCP[window] , kqueue[bsd] , epoll[linux] #单个后台worker process进程的最大并发链接数 worker_connections 1024; #multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接。 multi_accept on; # 并发总数是 worker_processes 和 worker_connections 的乘积 # 即 max_clients = worker_processes * worker_connections # 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么 # 为什么上面反向代理要除以4,应该说是一个经验值 # 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000 # worker_connections 值的设置跟物理内存大小有关 # 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数 # 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右 # 我们来看看360M内存的VPS可以打开的文件句柄数是多少: # $ cat /proc/sys/fs/file-max # 输出 34336 # 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内 # 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置 # 使得并发总数小于操作系统可以打开的最大文件数目 # 其实质也就是根据主机的物理CPU和内存进行配置 # 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。 # ulimit -SHn 65535}http { include mime.types; #设定mime类型,类型由mime.type文件定义 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"'; #设置nginx是否将存储访问日志。关闭这个选项可以让读取磁盘IO操作更快 #access_log logs/access.log main; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件, #对于普通应用,必须设为 on, #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off, #以平衡磁盘与网络I/O处理速度,降低系统的uptime. # 高效文件传输 sendfile on; tcp_nopush on; tcp_nodelay on; # types_hash_max_size 影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升。 types_hash_max_size 2048; #连接超时时间 #keepalive_timeout 0; keepalive_timeout 65; gzip on; gzip_disable "MSIE [1-6]."; gzip_comp_level 6; gzip_min_length 1000; #置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。 gzip_proxied expired no-cache no-store private auth; gzip_types text/plain application/x-javascript text/xml text/css application/xml; #Buffers:另一个很重要的参数为buffer,如果buffer太小,Nginx会不停的写一些临时文件,这样会导致磁盘不停的去读写,现在我们先了解设置buffer的一些相关参数: #client_body_buffer_size:允许客户端请求的最大单个文件字节数 #client_header_buffer_size:用于设置客户端请求的Header头缓冲区大小,大部分情况1KB大小足够 #client_max_body_size:设置客户端能够上传的文件大小,默认为1m #large_client_header_buffers:该指令用于设置客户端请求的Header头缓冲区大小 #设定请求缓冲 client_body_buffer_size 10K; client_header_buffer_size 1k; client_max_body_size 8m; large_client_header_buffers 2 1k; map $http_user_agent $outdated { # 判断浏览器版本 default 0; "~MSIE [6-9].[0-9]" 1; "~MSIE 10.0" 1; } # weight:轮询权值,默认值为1。 # down:表示当前的server暂时不参与负载。 # max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。 # fail_timeout:有两层含义,一是在fail_timeout时间内最多容许max_fails次失败;二是在经历了max_fails次失败以后,30s时间内不分配请求到这台服务器。 # backup : 备份机器。当其他所有的非 backup 机器出现故障的时候,才会请求backup机器,因此这台机器的压力最轻。 # max_conns: 限制同时连接到某台后端服务器的连接数,默认为 0。即无限制。 # proxy_next_upstream : 这个指令属于 http_proxy 模块的,指定后端返回什么样的异常响应 #负载均衡 #upstream DataBase { # ip_hash; # 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 # server 10.xx.xx.xx weight=1 max_fails=2 fail_timeout=30s; # server 10.xx.xx.xx; # server 10.xx.xx.xx; #} server { listen 80; #端口号 server_name v.fpdiov.com; #域名 location /api { #代理API proxy_pass http://api.fpdiov.com:8090; # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; #在web服务器端获得用户的真实ip # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; proxy_connect_timeout 600; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_read_timeout 600; #连接成功后,后端服务器响应时间(代理接收超时) proxy_send_timeout 600; #后端服务器数据回传时间(代理发送超时) proxy_buffer_size 32k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服>务器传 keepalive_requests 500; proxy_http_version 1.1; proxy_ignore_client_abort on; } location ^~ / { root /mnt/www/fpd-car-manage-frontend; #启动根目录 if ($outdated = 1){ rewrite ^ http://oisbyqrnc.bkt.clouddn.com redirect; #判断浏览器版本跳转 } index index.html; #默认访问页面 try_files $uri $uri/ /index.html; } } #server { # listen 80; #侦听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; #&emsp;错误页面 # redirect server error pages to the static page /50x.html # #error_page 500 502 503 504 /50x.html; #location = /50x.html { # root html; #} #静态文件,nginx自己处理 #location ~ ^/(images|javascript|js|css|flash|media|static)/ { #过期30天,静态文件不怎么更新,过期可以设大一点, #如果频繁更新,则可以设置得小一点。 # expires 30d; #} # 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 { #启用 https, 使用 http/2 协议, nginx 1.9.11 启用 http/2 会有bug, 已在 1.9.12 版本中修复. # listen 443 ssl; # server_name localhost; # ssl on; # 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; # 设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。 # ssl_session_timeout 60m; #缓存有效期 # ssl_session_cache shared:SSL:10m; #储存SSL会话的缓存类型和大小 # location / { # root html; # index index.html index.htm; # } #}}

May 23, 2019 · 3 min · jiezi

OpenResty从入门到实战-课程返现福利

系统掌握一款高性能开发利器 《 OpenResty 从入门到实战 》课程大纲可以说,掌握了 OpenResty,你就可以同时拥有脚本语言的开发效率和迭代速度,以及 NGINX C 模块的高并发和高性能优势。《OpenResty从入门到实战》 作者温铭,同时也是 OpenResty 软件基金会主席,《OpenResty 最佳实践》作者。 关注有课学微信公众号,回复暗号 OR 获取购买地址,购买成功后提交购买截图即可获得返现。

May 22, 2019 · 1 min · jiezi

初探nginx-HTTP处理流程

作者:景罗 基本概念: Nginx作为一款开源的、高性能的HTTP服务器和反向代理服务器而闻名,本文基于nginx-1.15.0,将为读者简要介绍其HTTP处理流程。 通常nginx配置文件如下所示: worker_processes 1;events { worker_connections 1024;}http{ access_log logs/access.log main; server { listen 80; server_name example.com; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; } }}Nginx采用master-worker编模式,master初始化配置,创建Socket并监听端口,启动并管理worker进程,worker进程负责接收客户端请求并提供服务;其中程worker_processes配置的就是worker进程的数目;events指令块用于配置事件处理相关,比如worker_connections用于配置每个worker进程最大维护的socket链接数目;http指令块用于配置http请求处理相关,比如access_log用于配置access日志文件路径;server指令块用于配置virtual server,通常会在一台机器配置多个virtual server,监听不同端口号,映射到不同文件目录;比如listen可配置监听端口号;location指令块配置不同路径请求处理方式,比如proxy_pass可配置将请求按照http协议格式转发给上游,fastcgi_pass可配置将请求按照fastcgi协议转发给fpm处理。 Nginx高度模块化,每个模块实现某一具体功能,比如ngx_http_limit_req_module模块实现按请求速率限流功能,ngx_http_fastcgi_module模块实现fastcgi协议通信功能。每个模块都需要解析配置文件中相关配置,每个模块需要解析的所有配置都定义为ngx_command_t数组。 例如ngx_http_module模块,其ngx_command_t数定义如下: struct ngx_command_s { ngx_str_t name; ngx_uint_t type; char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); ...}; static ngx_command_t ngx_http_commands[] = { { ngx_string("http"), NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, ngx_http_block, ... },};name指令名称,解析配置文件时按照名称能匹配查找;type指令类型,NGX_CONF_NOARGS标识该配置无参数,NGX_CONF_BLOCK该配置是一个配置块,NGX_MAIN_CONF表示配置可以出现在哪些位置(NGX_MAIN_CONF、NGX_HTTP_SRV_CONF、NGX_HTTP_LOC_CONF);set指令处理函数;初始化服务器 http指令块用于配置http请求处理相关,解析http指令的处理函数为ngx_http_block,实现如下: static char * ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){ //解析main配置 //解析server配置 //解析location配置 //初始化HTTP处理流程所需的handler //初始化listening if (ngx_http_optimize_servers(cf, cmcf, cmcf->ports) != NGX_OK) { return NGX_CONF_ERROR; }} 函数ngx_http_block主要解析http块内部的main配置、server配置与location配置;同时会初始化HTTP处理流程所需的handler;以及初始化所有监听端口。 ...

May 22, 2019 · 3 min · jiezi

Nginx-http资源请求限制三种方法

原文链接:何晓东 博客 前置条件:nginx 需要有 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块,可以使用命令 2>&1 nginx -V | tr ' ' '\n'|grep limit 检查有没有相应模块,如果没有请重新编译安装这两个模块。测试版本为:nginx版本为1.15+ 限制链接数1.使用 limit_conn_zone 指令定义密钥并设置共享内存区域的参数(工作进程将使用此区域来共享密钥值的计数器)。第一个参数指定作为键计算的表达式。第二个参数 zone 指定区域的名称及其大小: limit_conn_zone $binary_remote_addr zone=addr:10m;2.在 location {}, server {} 或者 http {} 上下文中使用 limit_conn 指令来应用限制,第一个参数为上面设定的共享内存区域名称,第二个参数为每个key被允许的链接数: location /download/ { limit_conn addr 1;}使用 $binary_remote_addr 变量作为参数的时候,是基于 IP 地址的限制,同样可以使用 $server_name 变量进行给定服务器连接数的限制: http { limit_conn_zone $server_name zone=servers:10m; server { limit_conn servers 1000; }}限制请求速率速率限制可用于防止 DDoS,CC 攻击,或防止上游服务器同时被太多请求淹没。该方法基于 leaky bucket 漏桶算法,请求以各种速率到达桶并以固定速率离开桶。在使用速率限制之前,您需要配置 "漏桶" 的全局参数: ...

May 22, 2019 · 2 min · jiezi

13使用Docker-Compose-实现nginx负载均衡

以Docker的网络管理,容器的IP设置为基础知识实现Nginx负载均衡查看所有docker网络 docker network ls/*NETWORK ID NAME DRIVER SCOPEb832b168ca9a bridge bridge local373be82d3a6a composetest_default bridge locala360425082c4 host host local154f600f0e90 none null local*/// composetest_default 是上一篇介绍Compose时,docker-compose.yml文件所在的目录名,// 所以,用docker-compose创建的容器会默认创建一个以目录名为网络名的网络,并且是dridge(桥接)类型指定容器IP地址 官网文档地址:https://docs.docker.com/compo... 继续编写上一篇《12.使用Docker Compose容器编排工具》文章中的docker-compose.yml version: "3"services: web1: container_name: web1 image: "centos:httpd" ports: - "8080:80" privileged: true volumes: - "/app/www/web1/:/var/www/html/" command: ['/usr/sbin/init'] networks: nginx-lsb: ipv4_address: 192.169.0.3 web2: container_name: web2 image: "centos:httpd" ports: - "8081:80" privileged: true volumes: - "/app/www/web2/:/var/www/html/" command: ['/usr/sbin/init'] networks: nginx-lsb: ipv4_address: 192.169.0.2networks: nginx-lsb: driver: bridge ipam: config: - subnet: 192.169.0.0/16使用docker-compose启动容器 ...

May 22, 2019 · 2 min · jiezi

CENTOS-7安装步骤apachetomcat8534windowsx86

1,全文可能比较详细(就是比较琐碎)(对新手比较友好)全部命令在行末!2,首先克隆一个VM虚拟机。以下这个操作出错率较高,防止不必要损失。建议在虚拟机上动手操作! 选择完整克隆: 克隆OK 3,如果忘记root密码。我在其他博客有写解决方法!确保你的CONNECT是连接状态!(不用PUTTY就无碍啦) 开始操作: 4,从WINDOWS桌面,直接拖拽apache-tomcat-8.5.34-windows-x86.zip到VM虚拟机。 如图: 我们先找到他的位置: find / -name 'apache-tomcat-8.5.34-windows-x86*' 进入此目录,pwd记录下路径:[root@localhost Desktop]# pwd/home/yuanlai/Desktop5,将其拷贝到/usr/local/下。(记得将被拷贝的那个删除掉。节省磁盘空间。)已经删除:6,解压缩:unzip apache-tomcat-8.5.34-windows-x86.zip 同样记得删除: 最好重命名一下:改为tomcat。这样比较好找。 7,cd bin 不是 cd /bin 这两个完全不同的! 一个.bat用于WINDOWS。 另外一个.sh用于Linux。 查看权限:没有执行权限。 加上就好啦: chmod 777 startup.sh 但是,又出现: Catalina方便记忆: 改完之后就OK啦! 8,连接测试:默认是8080.要想在WINDOWS访问。要开放一下这个8080端口。![在这里插入图片描述](https://img-blog.csdn.net/20181004142057221?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjg1OTI4MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) firewall-cmd --zone=public --add-port=8080/tcp --permanent在防火墙中新增8080端口 firewall-cmd --reload重新加载防火墙,这样开启的8080端口才生效 ![在这里插入图片描述](https://img-blog.csdn.net/20181004142110401?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjg1OTI4MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 9,启用:![在这里插入图片描述](https://img-blog.csdn.net/20181004142117355?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjg1OTI4MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 然而开启不了。还要再写个文件。/etc/init.d/tomcat。/etc/init.d:存放着很多的服务程序(当然都是可执行的)init最初的意思。![在这里插入图片描述](https://img-blog.csdn.net/20181004142128763?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjg1OTI4MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 复制到具有很多服务的/etc/init.d里面。Vim编辑即可。如图,写入:# chkconfig: 112 63 37description: tomcat server init scriptSource Function Library. /etc/init.d/functions JAVA_HOME=/usr/local/jdk/CATALINA_HOME=/usr/local/tomcat 编辑完成后,再次编辑打开查看一下确认。赋予权限。 10, OK! 11,history 命令仅供参考。我也不知道哪个是必不可少的。 History可以查看最近500条命令! [root@localhost bin]# history 1 find / -name 'apache-tomcat-8.5.34-windows-x86*' 18 cd /home/yuanlai/Desktop/ 19 pwd 22 cd /usr/local/ 23 ls 27 cp /home/yuanlai/Desktop/apache-tomcat-8.5.34-windows-x86.zip ./ 28 ls 29 cd /home/yuanlai/Desktop/ 30 rm apache-tomcat-8.5.34-windows-x86.zip apache-tomcat-8.5.34-windows-x86.zip 31 ls 32 cd /usr/local/ 33 ls 34 unzip apache-tomcat-8.5.34-windows-x86.zip 35 ls 36 rm apache-tomcat-8.5.34-windows-x86.zip 37 ls 38 mv apache-tomcat-8.5.34 tomcat 39 ls 43 cd tomcat/ 44 ls 5 7 cd bin 61 ls 62 ./startup.sh 63 ls -al 64 chmod 777 startup.sh 65 ls -al 67 ./startup.sh 69 chmod 777 catalina.sh 70 ./startup.sh 72 firewall-cmd --zone=public --add-port=8080/tcp --permanent 73 firewall-cmd --reload 76 service tomcat start 77 cp -p /usr/local/tomcat/bin/catalina.sh /etc/init.d/tomcat 78 vim /etc/init.d/tomcat 79 chmod 755 /etc/init.d/tomcat 80 chkconfig --add tomcat 81 chkconfig tomcat on 82 service tomcat start 83 service tomcat restart 84 service tomcat stop 85 service tomcat start ...

May 22, 2019 · 1 min · jiezi

服务器部署

什么是服务器?1.组成部分2.分类3.特点业务场景 部署什么?如何选择安全防御措施步骤创建主机创建用户安装运行环境把项目同步到服务器安装进程管理程序使用ip和端口调试,没问题,使用nginx作为反向代理使用域名访问(先申请再绑定)

May 21, 2019 · 1 min · jiezi

5Compose编排nginxphp

上一篇的手工操作多容器运行nginx+php,很麻烦,该怎么办?Docker Compose 跟上先删掉上篇创建的容器和网络,如若不然,完成本章会产生冲突 docker stop nginxdocker stop fpm docker network rm lnmp先将上节手工运行的nginx容器命令拿过来作为编写docker-compose.yml文件的参考: docker run -d --network lnmp --ip 192.169.0.3 --link fpm:php --name nginx --rm -p 80:80 -v ~/www:/usr/share/nginx/html -v ~/nginx.conf:/etc/nginx/nginx.conf nginx:1.15.0-alpine继续编辑前面章节创建的 mycompose/docker-compose.yml文件 version: "3"services: fpm: container_name: fpm image: "php:7.1-fpm-alpine3.8" volumes: - ~/www:/php networks: lamp: ipv4_address: 192.158.0.2 httpd: container_name: httpd image: "httpd:2.4-alpine" ports: - 8080:80 links: - fpm:php volumes: - ~/www:/usr/local/apache2/htdocs - ~/httpd.conf:/usr/local/apache2/conf/httpd.conf networks: lamp: ipv4_address: 192.158.0.3 nginx: container_name: nginx image: "nginx:1.15.0-alpine" ports: - 8081:80 links: - fpm:php volumes: - ~/www:/usr/share/nginx/html - ~/nginx.conf:/etc/nginx/nginx.conf networks: lamp: ipv4_address: 192.158.0.4networks: lamp: driver: bridge ipam: config: - subnet: 192.158.0.0/16docker-compose启动项目 ...

May 21, 2019 · 1 min · jiezi

利用XForwardedFor伪造客户端IP漏洞成因及防范

问题背景在Web应用开发中,经常会需要获取客户端IP地址。一个典型的例子就是投票系统,为了防止刷票,需要限制每个IP地址只能投票一次。 如何获取客户端IP在Java中,获取客户端IP最直接的方式就是使用request.getRemoteAddr()。这种方式能获取到连接服务器的客户端IP,在中间没有代理的情况下,的确是最简单有效的方式。但是目前互联网Web应用很少会将应用服务器直接对外提供服务,一般都会有一层Nginx做反向代理和负载均衡,有的甚至可能有多层代理。在有反向代理的情况下,直接使用request.getRemoteAddr()获取到的IP地址是Nginx所在服务器的IP地址,而不是客户端的IP。 HTTP协议是基于TCP协议的,由于request.getRemoteAddr()默认获取到的是TCP层直接连接的客户端的IP,对于Web应用服务器来说直接连接它的客户端实际上是Nginx,也就是TCP层是拿不到真实客户端的IP。 为了解决上面的问题,很多HTTP代理会在HTTP协议头中添加X-Forwarded-For头,用来追踪请求的来源。X-Forwarded-For的格式如下: X-Forwarded-For: client1, proxy1, proxy2X-Forwarded-For包含多个IP地址,每个值通过逗号+空格分开,最左边(client1)是最原始客户端的IP地址,中间如果有多层代理,每一层代理会将连接它的客户端IP追加在X-Forwarded-For右边。 下面就是一种常用的获取客户端真实IP的方法,首先从HTTP头中获取X-Forwarded-For,如果X-Forwarded-For头存在就按逗号分隔取最左边第一个IP地址,不存在直接通过request.getRemoteAddr()获取IP地址: public String getClientIp(HttpServletRequest request) { String xff = request.getHeader("X-Forwarded-For"); if (xff == null) { return request.getRemoteAddr(); } else { return xff.contains(",") ? xff.split(",")[0] : xff; }}另外,要让Nginx支持X-Forwarded-For头,需要配置: proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;$proxy_add_x_forwarded_for会将和Nginx直接连接的客户端IP追加在请求原有X-Forwarded-For值的右边。 伪造X-Forwarded-For一般的客户端(例如浏览器)发送HTTP请求是没有X-Forwarded-For头的,当请求到达第一个代理服务器时,代理服务器会加上X-Forwarded-For请求头,并将值设为客户端的IP地址(也就是最左边第一个值),后面如果还有多个代理,会依次将IP追加到X-Forwarded-For头最右边,最终请求到达Web应用服务器,应用通过获取X-Forwarded-For头取左边第一个IP即为客户端真实IP。 但是如果客户端在发起请求时,请求头上带上一个伪造的X-Forwarded-For,由于后续每层代理只会追加而不会覆盖,那么最终到达应用服务器时,获取的左边第一个IP地址将会是客户端伪造的IP。也就是上面的Java代码中getClientIp()方法获取的IP地址很有可能是伪造的IP地址,如果一个投票系统用这种方式做的IP限制,那么很容易会被刷票。 伪造X-Forwarded-For头的方法很简单,例如Postman就可以轻松做到: 当然你也可以写一段刷票程序或者脚本,每次请求时添加X-Forwarded-For头并随机生成一个IP来实现刷票的目的。 如何防范方法一在直接对外的Nginx反向代理服务器上配置: proxy_set_header X-Forwarded-For $remote_addr;如果有多层Nginx代理,内层的Nginx配置: proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;在最外层Nginx(即直接对外提供服务的Nginx)使用$remote_addr代替上面的$proxy_add_x_forwarded_for,可以防止伪造X-Forwarded-For。$proxy_add_x_forwarded_for会在原有X-Forwarded-For上追加IP,这就相当于给了伪造X-Forwarded-For的机会。而$remote_addr是获取的是直接TCP连接的客户端IP,这个是无法伪造的,即使客户端伪造也会被覆盖掉,而不是追加。 需要注意的是,如果有多层代理,只在直接对外访问的Nginx上配置X-Forwarded-For为$remote_addr,内层的Nginx还是要配置为$proxy_add_x_forwarded_for,不然内层的Nginx又会覆盖掉客户端的真实IP。 完成以上配置后,业务代码中再通过上面的getClientIp()方法,获取X-Forwarded-For最左边的IP地址即为真实的客户端地址,且客户端也无法伪造。 方法二Tomcat服务器解决方案:org.apache.catalina.valves.RemoteIpValve RemoteIpValve可以替换Servlet API中request.getRemoteAddr()方法的实现,让request.getRemoteAddr()方法从X-Forwarded-For头中获取IP地址。也就是在业务代码中不需要再自己实现类似于上面的getClientIp()方法来从X-Forwarded-For中获取IP,而是直接使用request.getRemoteAddr()方法。想要使用RemoteIpValve,仅需要在Tomcat配置文件server.xml中Host元素内末尾加上: <Valve className="org.apache.catalina.valves.RemoteIpValve" ... />RemoteIpValve有一套防止伪造X-Forwarded-For的机制,实现思路:遍历X-Forwarded-For头中的IP地址,和方法一不同的是,不是直接取左边第一个IP,而是从右向左遍历。遍历时可以根据正则表达式剔除掉内网IP和已知的代理服务器本身的IP(例如192.168开头的IP),那么拿到的第一个非剔除IP就会是一个可信任的客户端IP。这种方法的巧妙之处在于,即使伪造X-Forwarded-For,那么请求到达应用服务器时,伪造的IP也会在X-Forwarded-For值的左边,真实的IP为放到右边的某个位置,从右向左遍历就可以避免取到这些伪造的IP地址。 方法三Node.js 框架 Egg.js 的解决方案:https://eggjs.org/zh-cn/tutor... Egg.js 可通过设置maxProxyCount指定代理层数,然后取X-Forwarded-For头中从右往左数第maxProxyCount个IP即为真实 IP 地址,如果有伪造 IP 地址了必然在最左边,就会被忽略掉。 ...

May 16, 2019 · 1 min · jiezi

Nginx-内容缓存及常见参数配置

原文链接:何晓东 博客 使用场景:项目的页面需要加载很多数据,也不是经常变化的,不涉及个性化定制,为每次请求去动态生成数据,性能比不上根据请求路由和参数缓存一下结果,使用 Nginx 缓存将大幅度提升请求速度。基础只需要配置 proxy_cache_path 和 proxy_cache 就可以开启内容缓存,前者用来设置缓存的路径和配置,后者用来启用缓存。 http { ... proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { proxy_cache mycache; location / { proxy_pass http://localhost:8000; } }}对应参数说明:1.用于缓存的本地磁盘目录是 /path/to/cache/ 2.levels 在 /path/to/cache/ 设置了一个两级层次结构的目录。将大量的文件放置在单个目录中会导致文件访问缓慢,所以针对大多数部署,我们推荐使用两级目录层次结构。如果 levels 参数没有配置,则 NGINX 会将所有的文件放到同一个目录中。 3.keys_zone 设置一个共享内存区,该内存区用于存储缓存键和元数据,有些类似计时器的用途。将键的拷贝放入内存可以使 NGINX 在不检索磁盘的情况下快速决定一个请求是 HIT 还是 MISS,这样大大提高了检索速度。一个 1MB 的内存空间可以存储大约 8000 个 key,那么上面配置的 10MB 内存空间可以存储差不多 80000 个key。 4.max_size 设置了缓存的上限(在上面的例子中是 10G)。这是一个可选项;如果不指定具体值,那就是允许缓存不断增长,占用所有可用的磁盘空间。当缓存达到这个上线,处理器便调用 cache manager 来移除最近最少被使用的文件,这样把缓存的空间降低至这个限制之下。 5.inactive 指定了项目在不被访问的情况下能够在内存中保持的时间。在上面的例子中,如果一个文件在 60 分钟之内没有被请求,则缓存管理将会自动将其在内存中删除,不管该文件是否过期。该参数默认值为 10 分钟(10m)。注意,非活动内容有别于过期内容。NGINX 不会自动删除由缓存控制头部指定的过期内容(本例中Cache-Control:max-age=120)。过期内容只有在 inactive 指定时间内没有被访问的情况下才会被删除。如果过期内容被访问了,那么 NGINX 就会将其从原服务器上刷新,并更新对应的 inactive 计时器。 ...

May 14, 2019 · 2 min · jiezi

Nginx-安装配置以及简单部署

Nginx 安装配置以及简单部署安装Centos 建议 yum install Nginx 简单安装其他安装方法: wget http://nginx.org/download/ngi...tar -zxvf nginx-1.9.8.tar.gzcd nginx-1.9.8./configuremake && make install 或者 make 之后 make install到此安装完成,安装路径为默认路径,具体路径看系统;查看路径命令:whereis nginxUbuntu 建议 apt install Nginx 简单安装其他安装方法参考Centos安装方法;配置 Nginx 服务器Nginx 默认配置文件为 nginx.conf ubuntu 安装会为 用户配置好各种配置,默认配置文件中会附赠一个实例,可以直接在site-enabled文件夹中,新建一个配置文件;user nginx; // 默认即可worker_processes auto; // 默认设置自动选择进程数量,可以自行设置error_log /var/log/nginx/error.log; // 错误信息存储路径pid /run/nginx.pid; // 进程信息保存文件# Load dynamic modules. See /usr/share/nginx/README.dynamic.include /usr/share/nginx/modules/*.conf;events { worker_connections 1024; // 最大连接数}http { // log信息输出格式,可以自行定义 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 /var/log/nginx/access.log main; //指定日至文件的路径及日志记录格式 sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; include /etc/nginx/site-enabled/*.conf; // ubuntu 默认安装,无需定义,如果没有,可以自行定义,定义的是conf配置文件的路径以及名称,必须定义在 http 块中,Nginx会自动搜索相应的配置文件并加载 }server 配置配置好主文件之后,主配文件不包含server块,需额外的自行配置;默认配置如下:upstream django { # server unix:/root/HHZS.sock; server 127.0.0.1:8001; # for a web port socket (we'll use this first) // 转发请求至 8001 端口与 uwsgi 进行通信} server { listen 80 default_server; // 默认监听请求端口 listen [::]:80 default_server; // 同上 charset utf-8; // 默认编码方式 server_name _; // 默认ip访问,可以设置为域名,通过域名访问 root /usr/share/nginx/html; client_max_body_size 75M; # adjust to taste # Django media location /imgs { alias /root/imgs; # your Django project's media files - amend as required } location /statics { alias /root/hhsc2019/hhsc2019/statics; # your Django project's static files - amend as required uwsgi_read_timeout 120s; uwsgi_send_timeout 120s; proxy_read_timeout 1200; } location / { // 默认访问路径 uwsgi_pass django; include /root/hhsc2019/uwsgi_params; # the uwsgi_params file you installed }}

May 13, 2019 · 2 min · jiezi

Nginx-禁止未匹配域名访问

导语在最开始配置 nginx 的时候,是修改的 default.conf 文件。文件中显式指定了 listen 80 default_server;,也就是没有匹配到的域名会转到这里来处理。接下来修改为只匹配设置的域名,其他返回 404(当然状态码可以更改)。 解决方案很简单的配置就可以。 server { listen 80 default_server; #server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { return 404; root /usr/share/nginx/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 /usr/share/nginx/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; #}}多提一句,在 nginx.conf 中 http 内添加 server_tokens off; 可以隐藏版本号。配置好之后,记得重启 nginx。重点在于 listen 80 default_server; 和 return 404,如此配置,没有匹配到的域名,包括直接 ip 访问,都会 404;以下是我测试配置的流程,各位感兴趣可以看下。 ...

May 11, 2019 · 2 min · jiezi

笔记整理http协议浅析二

作者:杨志晓 http的版本:a.HTTP建立在TCP协议之上。 b.HTTP/0.9 于1991年发布。 c.HTTP/1.0 于1996年发布。 d.HTTP/1.1 于1999年发布。 e.HTTP/2 于2015年发布。 http 1.0 no keep-alive(默认短链接)a.工作原理如图:2_1.jpg b.每次与服务器交互,都需要新开一个连接! 2_2.jpg c.抓包分析: demo:4张图片+html总共5个请求 2_3.jpg 2_4.jpg 每一条tcp链接都会直接返回connection close 试想一下:请求一张图片,新开一个连接,请求一个CSS文件,新开一个连接,请求一个JS文件,新开一个连接。HTTP协议是基于TCP的,TCP每次都要经过三次握手,四次挥手,慢启动...这都需要去消耗我们非常多的资源的! http 1.1 默认有 keep-alivea.相对于持久化连接还有另外比较重要的改动: HTTP 1.1增加host字段HTTP 1.1中引入了Chunked transfer-coding,范围请求,实现断点续传(实际上就是利用HTTP消息头使用分块传输编码,将实体主体分块传输)HTTP 1.1管线化(pipelining)理论,客户端可以同时发出多个HTTP请求,而不用一个个等待响应之后再请求注意:这个pipelining仅仅是限于理论场景下,大部分桌面浏览器仍然会选择默认关闭HTTP pipelining!所以现在使用HTTP1.1协议的应用,都是有可能会开多个TCP连接的!b.工作原理如图: 只建立一条tcp链接,但是每个请求都是串行的,如下图所示 2_5.jpg c.对上面同一个demo 在开启keep-alive后进行抓包分析:(4张图片+html总共5个请求) 2_6.jpg 5个请求发起一条tcp连接 2_7.jpg d.图片增加后抓包如下(开启keep-alive): 2_8.jpg e.通过增加图片个数抓包后发现,浏览器同时建立了6条tcp连接,观察浏览器网络请求加载图如下:2_9.jpg f.http1.1 支持pipelining(流水线) 条件是:sever端需要支持,同时浏览器也要开启,工作原理如下图: 2_10.jpg HTTP Pipelining其实是把多个HTTP请求放到一个TCP连接中一一发送,而在发送过程中不需要等待服务器对前一个请求的响应;只不过,客户端还是要按照发送请求的顺序来接收响应! g.查询了 火狐浏览器开启pipelining方法: 在搜索栏输入 network.http.pipelining ,查询一下,如果没有,请右击鼠标,选择“新建”——布尔,然后输入 network.http.pipelining ,赋值true,然后点击确定。 解释:激活这个键值之后,Pipelining同时发出成倍数的连接请求,从而达到提升连接速度的效果。网络上的大多数网站都是基于HTTP协议,而HTTP1.1可以支持多线程的连接请求,通过这个操作可以减少Firefox载入网页的时间。 h.总结:http1.x问题: 在HTTP1.0中,发送一次请求时,需要等待服务端响应了才可以继续发送请求。 在HTTP1.1中,发送一次请求时,不需要等待服务端响应了就可以发送请求了,但是回送数据给客户端的时候,客户端还是需要按照响应的顺序来一一接收 所以说,无论是HTTP1.0还是HTTP1.1提出了Pipelining理论,还是会出现阻塞的情况。从专业的名词上说这种情况,叫做线头阻塞(Head of line blocking)简称:HOLB http2.0(建立在https基础上)a.SSL(Secure Sockets Layer) 安全套接层,是一种安全协议,经历了 SSL 1.0、2.0、3.0 版本后发展成了标准安全协议 - TLS(Transport Layer Security) 传输层安全性协议。TLS 有 1.0 (RFC 2246)、1.1(RFC 4346)、1.2(RFC 5246)、1.3(RFC 8446) 版本。 ...

May 10, 2019 · 1 min · jiezi

笔记整理http协议浅析一

作者:杨志晓 一、相关协议类概念:a.TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。 其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。 通过面向连接、端到端和可靠的数据包发送。b.SPDY协议是Google提出的基于传输控制协议(TCP)的应用层协议,通过压缩、多路复用和优先级来缩短加载时间。 该协议是一种更加快速的内容传输协议。c.QUIC(Quick UDP Internet Connections)基于UDP的传输层协议,提供像TCP一样的可靠性。在提高web应用性能上,可以选择在应用层使用HTTP2.0实现多路传输,在物理层使用CDN解决网络拥塞和最后一公里问题。在传输层,目前主要使用TCP,但由于TCP本身的问题(一个充满补丁的丑陋的协议),成为了限制web应用性能的一个瓶颈。 二、wireshark抓包解析报文:a.mac网卡(多路访问控制协议(multiple access control protocol) 1_1.png b.Ip报文解析1_2.png ip报头长度计算:1_3.png 5*4 =20 c.tcp报文解析1_4.png 三、http1.0基本原理a.通过一个普通html分析:1_5.png 1_6.png b.如上图分析:绿色为:Waiting (TTFB):TTFB (Time To First Byte),是最初的网络请求被发起到从服务器接收到第一个字节这段时间,它包含了 TCP连接时间,发送HTTP请求时间和获得响应消息第一个字节的时间。 蓝色为:Content Download c.等待时间影响因素:从发送请求到收到响应之间的空隙,会受到线路、服务器距离等因素的影响。 d.浏览器同域名发出6个请求,建立几个tcp?1 or 6? 带着上面的疑问我们对demo进行抓包抓包分析: 1_7.png 分析后发现:三张图片+html总共四个请求index.html+section4new.png端口是55653section01.png+section2.jpg端口是55654 为什么是这样呢:查看tcp抓包: 1_8.png 通过抓包看到 :第一个http请求 index.html请求端口是:55653第二个http请求 section4new.png请求端口是:55653第三个http请求 section01.png请求端口是:55654第四个http请求section2.jpg请求端口是:55654 同时也看到tcp开始建立时同时发出了两条请求 1_9.png 默认谷歌浏览器发起了两条tcp请求(浏览器不同,可能是请求个数少) 同样抓包中看到了tcp的三次握手 1_10.png http2.0 :a.浏览器加载如下:1_11.png b.讨论点:http1.1请求会是按照如下图1还是图2?1_12.png 讨论结论:http1.1 without pipelining: 通过tcp连接上一个请求相应完后,下一个请求才能发出http1.1 with pipelining: 通过tcp连接,上一个请求发出,下一个请求不需要等待,但是返回是同一顺序。http2.0在TCP连接上传输的是帧,客户端会将要传输的数据拆分为不同的帧,并标记对应的数据流ID,异步发出,服务端接收到帧集合根据数据流ID拼凑起来即为客户端发送来的数据。同理,服务端也是将数据拆分为不同帧返回。 附浏览器同域名请求的最大并发限制:1_13.png 附课堂板书:1_14..]

May 10, 2019 · 1 min · jiezi

计算机网络Concentrator

摘自Wiki:【谷歌机翻】在现代电信系统的发展过程中,需要将大量低速接入设备与大型电话公司的“中心局”交换机连接在一起。在第一代数字网络中,模拟信号在连接到电话交换机的线卡上数字化。为了降低本地环路成本,决定通过在客户社区部署小型转换设备,将此转换推向客户端。这些设备将单个链路上的多个数字信号组合到更大的电话交换机,这将为客户提供服务。这些设备最初被称为远程集中器或简称遥控器。 在提供三重播放服务(语音,电视,互联网)的光纤分配系统中,数字化已到达客户端,信号在源处被数字化并使用客户边缘路由器进行组合。该流量在光网络终端进入分发网络,并使用波分复用和无源光网络传送到中心局。 在电信领域,术语集中器具有以下含义: 在数据传输中,功能单元允许公共路径处理比路径中当前可用的信道更多的数据源。集中器通常在许多低速,通常是异步信道和一个或多个高速,通常是同步信道之间提供通信能力。通常可以在低速侧容纳不同的速度,代码和协议。低速信道通常在竞争中运行并需要缓冲。[1]一种连接多个链路只有一个目的地的设备,该设备的主要功能是在两个或多个连接在一起的服务器之间进行一种负载均衡,数据分配是根据服务器处理速率完成的。[1]电缆设备中的配线架或其他组件,电缆连接在一起。[需要引证]ISP使用集中器来启用调制解调器拨号;这种集中器有时被称为调制解调器集中器或远程访问集中器。术语“接入集中器”还用于描述在计算机网络中使用的类似的提供商边缘设备,其不再依赖于调制解调器,例如, FTTH。[2]

May 10, 2019 · 1 min · jiezi

如何挑选云主机需要注意些什么呢

云主机的使用越来越广泛,面对众多商家和云主机,如何挑选适合自己的一款呢,群英给大家如下几点建议。 1.网站类型:云主机的选择要根据网站的需求而定,若网站使用图片少,更新不频繁,可选标配的云主机,若动态页面较多,建议选择2核以上的云主机; 2.网站访问量:对自己网站流量做一个评估,若访问量较高,CPU、内存、带宽不足的话,网站访问就会比较卡顿,此时建议选择一些高配置的云主机,确保网站访问流畅; 3.配置选择:不同的业务需求,有不同配置的云主机可选择,配置不同,服务器和价格都存在差距; 4.带宽选择:可选独享或共享带宽,共享带宽是用户们共享带宽资源,稳定性会差一些,独享带宽稳定性较好,但价格会贵一些,根据实际需求来选择; 5.机房选择:企业要根据自己的用户群体分布,就近原则来选择机房的位置,保证较好的访问速度和用户体验。

May 9, 2019 · 1 min · jiezi

vue单页面打包文件大首次加载慢从75M到13M蜕变

npm run build 文件过大打包生成文件: 浏览器访问效果: 第一步:Nginx开启gzip (配置完切记重启nginx) 后台配置nginx.config。关于gzip压缩代码: http { gzip on; #开启或关闭gzip on off gzip_disable "msie6"; #不使用gzip IE6 gzip_min_length 100k; #gzip压缩最小文件大小,超出进行压缩(自行调节) gzip_buffers 4 16k; #buffer 不用修改 gzip_comp_level 3; #压缩级别:1-10,数字越大压缩的越好,时间也越长 gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; # 压缩文件类型 gzip_vary off; #跟Squid等缓存服务有关,on的话会在Header里增加 "Vary: Accept-Encoding" } 第二部:vue项目中config/index.js productionGzip: true, //是否开启gizp压缩 productionGzipExtensions: ['js', 'css'], 开启后cnpm run build 会生成*.gz文件。像这样: ...

May 9, 2019 · 1 min · jiezi

跳坑指南在vps上部署hexo博客的那些事

说在前面本地使用macOS,vps系统为debian 8;虽说是跳坑指南,但是这篇文章本意也仅仅自用,总结一下自己遇到的问题和解决方法,仅供参考,如有其他问题请百度(google) 整体思路:本地调试完的hexo项目文件通过git推送给vps,然后直接部署在vps上使用域名来访问,这样一个属于自己的blog就可以完成了 本地环境GitGit是一个免费的开源分布式版本控制系统,旨在快速,高效地处理从小型到大型项目的所有事务。这原是广泛用在代码的版本控制,在hexo建站里面的主要作用是推送渲染好的静态网页文件到部署的仓库。 下载Git与安装因为本来我就有,所以这里就不多介绍;网上其他大佬也有很多教程 node.js下载Node.js与安装同上,本地环境也有; HexoHexo是一个快速、简洁且高效的静态博客框架。安装简单,虽然网上教程一大堆,建议参考官方文档。重要!官方文档有中文 ????。 官方文档https://hexo.io/zh-cn/ 安装hexo首先确保本地安装好git和node.js,在终端中输入npm install -g hexo-cli 创建hexo项目(建站)hexo init <folder> // 初始化项目文件夹;<folder>为自定义hexo项目名称cd <folder> // 打开项目文件夹npm install // 安装依赖完成上述步骤,查看自己的项目文件夹内,目录应为: .├── node_modules //依赖包├── scaffolds // 模版├── source // 文章资源| ├── _drafts //草稿| └── _posts //发布文章├── themes //主题| └── landscape //默认主题├── package.json // npm配置文件(可以不用管它)└── _config.yml //hexo配置文件配置hexo既然生成了博客了,那自然需要自己来配置一下自己的博客的信息,打开_config.yml文件进行配置;具体配置参考官方文档:https://hexo.io/zh-cn/docs/co... 下载主题主题我挑了很久,最后选择综合症的我只有选了好多人推荐的next主题next官方文档:https://github.com/theme-next... 下载根据文档给的方式使用git clonegit clone https://github.com/theme-next/hexo-theme-next themes/next 试了几次,我一直报错 'RPC failed; curl 18 transfer closed with outstanding read data remaining' ...

May 8, 2019 · 2 min · jiezi

Windows平台后端开发环境神器Laragon裂墙推荐

Laragon is a portable, isolated, fast & powerful universal development environment for PHP, Node.js, Python, Java, Go, Ruby. It is fast, lightweight, easy-to-use and easy-to-extend.Laragon是一个可移植,隔离,快速且功能强大的通用开发环境,适用于PHP,Node.js,Python,Java,Go,Ruby。它快速,轻便,易于使用且易于扩展。Laragon仓库从github下载 前言从事web开发已经两年多了, 在Windows平台的服务后端开发环境搭建方面最早使用的是XAMPP, 到后来用了很长一段时间的WampServer, 再后来因为nginx的关系用上了功能看似很多的phpstudy, 而这phpstudy的使用体验真是太糟心了, 界面操作逻辑不方便那还没什么, 可运行的nginx服务不稳定会莫名终止就太气人了。每每这样都绝望地将项目放到Laravel推荐的标准开发环境HomeStead上面跑,杀鸡也用牛刀着实不痛快。直到我在Alternativeto(一个推荐同类软件的网站)上发现了Laragon,这款工具真是太棒了,简直将我从麻烦的环境问题中将我解救了出来。对于一款免费还帮了我这么多的工具,我觉得我得为它做点什么才不负于它,于是我想把它推荐给所有需要在Windows平台搭建后台开发环境的开发者,让更多的人知道它的威名~ 一些简单介绍Laragon这是一个可一键开启Apache、Nginx、MySQL、Redis、Memcached等服务的开发环境神器,适用于PHP,Node.js,Python,Java,Go和Ruby的开发。 安装目录 开箱可用的程序下图是程序的存入目录 主界面 选择要开启的服务 常规设置 Laragon最打动我的地方1.项目目录可以放在硬盘任意位置,而不必是软件的安装目录下 选好代码根目录后,会为每个文件夹自动生成相应nginx配置文件auto.开头的文件就是自动生成的配置文件,这类文件会在每次更换代码根目录时被删除再新建,因此建议按自己项目情况配置好后,另起文件名。 同时会根据目录更新host文件 根目录选择了一个php的Laravel项目,public/是入口目录 在设置好代码根目录时Laragon就已经设置好默认的nginx配置了,因此可以直接打开 如果是ThinkPHP项目,nginx的url重写配置要重新定义,如 2.不止有让你的项目跑起来的服务程序,还携带了一系列让你高效开发的配套工具数据库查看有HeidiSQL命令行终端有Cmder专业的日志查看工具[Logs Viewer]成为Laragon默认文本打开工具且加入到Windows右键菜单编辑器[Notepad++]FTP工具WinSCPComposerGit... 还有很多就不一一赘述了总之就是贴心~ 在Cmder中使用composer 3.扩展版本和服务非常简单比如Laragon自带的php版本是7.2的,我要扩展到7.3的话就是从官网上下载windows平台php二进制包,放到Laragon安装目录的bin/php/目录下,然后选择用这个包运行即可。就是这么简单。 放置包 选择使用该包 4.免费一键开启ngrok内网穿透,让本地项目可通过外网查看菜单>代码根目录项>分享>选择要分享出去的目录 ngrok 外网访问这个功能估计是免费且服务器在海外,因此速度和稳定性不是七分理想,偶尔一用还是很不错的,也省了很多功夫。 后记如果我上面说的也是你想要的,那请立即下载体验吧。

May 7, 2019 · 1 min · jiezi

selectpollepoll只需要看这一篇就好了

select、poll、epoll:select,poll,epoll都是IO多路复用的机制 select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。epoll跟select都能提供多路I/O复用的解决方案。在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则一般操作系统均有实现。 1、没有最大并发连接的限制,能打开的FD(file descriptor:文件描述符)的上限远大于1024(1G的内存上能监听约10万个端口); 2、效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数; 即Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。 select有三个缺点: 1、连接数受限 2、查找匹配速度慢 3、数据由内核拷贝到用户态 poll改善了第一个缺点,epoll改善了三个缺点。 (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。 (2)poll==>时间复杂度O(n) poll本质上和select没有区别,它将用户传入的数据拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的.因为每次调用时都会对连接进行线性遍历,所以随着FD的增加会造成遍历速度慢的“线性下降性能问题”。 (3)epoll==>时间复杂度O(1) epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1)) 总结: 综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特点。 1、表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。 2、select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善

May 2, 2019 · 1 min · jiezi

nginx-对同一-ip-访问请求速率限制

模块ngx_http_limit_req_module主要用到的指令 limit_req limit_req_log_level limit_req_status limit_req_zone 所述ngx_http_limit_req_module模块(0.7.21)用于限制每一个定义的键值的请求的处理速率,特别是从一个单一的IP地址的请求的处理速率。使用“漏桶”方法进行限制。 示例配置http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ... server { ... location / search / { limit_req zone=one burst=5; }指令句法: limit_req zone=name [burst=number] [nodelay | delay=number];默认: -语境: http,server,location设置共享内存区域和请求的最大突发大小。如果请求速率超过为区域配置的速率,则延迟处理,以便以定义的速率处理请求。过多的请求被延迟,直到它们的数量超过最大突发大小,在这种情况下请求以错误终止。默认情况下,最大突发大小等于零。例如,指令 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;server { location / search / { limit_req zone=one burst=5; }平均每秒允许不超过1个请求,突发不超过5个请求。 如果不希望在请求受限的情况下延迟过多的请求,nodelay则应使用以下参数: limit_req zone=one burst=5 nodelay;delay参数(1.15.7)指定在该过度请求成为被延迟请求的最大值。默认值为零,即所有过多的请求都会延迟。 可以有多个limit_req指令。例如,以下配置将限制来自单个IP地址的请求的处理速率,同时限制虚拟服务器的请求处理速率: limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;limit_req_zone $server_name zone=perserver:10m rate=10r/s;server { ... limit_req zone=perip burst=5 nodelay; limit_req zone=perserver burst=10;}当且仅当limit_req 当前级别没有指令时,这些指令才从先前级别继承 。 ...

May 2, 2019 · 1 min · jiezi

金山云centos7建站总结

购买云服务器购买弹性ip,弹性ip就是公网ip配置安全组入站规则,ping通ip更换yum源, mv /etc/yum.repos.d/CentOS.repo /etc/yum.repos.d/CentOS.repo_bakwget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/rep...更新 yum makecache yum -y update 出现Could not resolve host: mirrors.cloud.aliyuncs.com; Name or service not known",安全组配置出站规则安装nginx yum install gcc-c++yum install -y pcre-develyum install -y zlib-develyum install -y openssl openssl-develwget -c https://nginx.org/download/ng...tar -zxvf nginx-1.15.12.tar.gzcd nginx-1.15.12使用默认配置 ./configuremakemake install查看安装目录 whereis nginxcd /usr/local/nginx/sbin启动 /usr/local/nginx, 浏览器能够正常访问nginx页面查询nginx进场 ps aux|grep nginx其他命令./nginx -s stop ./nginx -s quit ./nginx -s reload开机启动: vim /etc/rc.local, 增加/usr/local/nginx/sbin/nginx设置执行权限 chmod 755 rc.localreboot 后应该能正常打开页面出现the HTTP rewrite module requires the PCRE library, yum -y install pcre-devel 出现the HTTP gzip module requires the zlib library, yum install -y zlib-devel安装node ...

April 30, 2019 · 1 min · jiezi

docker进阶nginx部署的几个重要点详解以及开发流程持续更新

部署基础知识url:协议://网站地址:端口(/)路径地址?参数eg: http://www.baidu.com:80/abc/dd/ www.baidu.com找服务器 80端口:找服务器上提供服务的应用 nginx uri:/abc/dd/ nginx的pid文件是可变化的等号两边不能空格,否则会报错tail -f 1.txt 实时监控文件变化 1.1 部署基础1.11.1 项目生命周期 传统项目生命周期 阶段 调研阶段 找方向点 设计阶段 方向点可视化 产品:产品需求文档、项目里程表 开发阶段 产品阶段功能实现 测试阶段 保证产品的阶段功能 运营阶段 项目部署 + 运营维护 关键点: 阶段间是有前后关系依赖的 阶段间项目的推进是有文档来主导 理想化的生命周期和开发模型1.2新型项目周期 软件项目: 一个产品被拆分成了非常多的子功能 团队组织:高效协作,沟通 图的理解: 四个圈串在一起 --- 子功能的完整周期 单个圈 --- 岗位的工作内容 图片: https://uploader.shimo.im/f/hRwe365QitwNgyS7.png 团队组织间的高效协作是很重要的 流程: 1 根据需求文档来梳理网站的目标架构 2 分析产品需求文档的功能,来梳理部署结点 部署节点示意图:图片: https://uploader.shimo.im/f/U... 3 根据部署结点去互联网上梳理各种解决方案(根据业务需求 4 整合所有的解决方案,-- 初版部署方案 5 根据实际的公司业务情况,对初版部署方案进行优化调整1.3 部署环境: ...

April 29, 2019 · 8 min · jiezi

Nginx-配置-Https-免费证书访问

配置HTTPS现在做博客或者做网站没有 https 已经不行了,就记录一下我在腾讯云配置 https 的过程吧,非常简单,1个小时就可以了。 还涉及到 http 访问自动转发到 https 访问路径。同时把不带 www 的顶级域名转发到带 www 的二级域名上,有利于 SEO. 申请证书不管是腾讯云还是阿里云都提供免费的证书使用,不过有效期是 1 年,到时候我们重新申请就可以了。我们以腾讯云为例子,申请证书。 然后验证一下 DNS 记录就好了,如果域名是在使用腾讯云解析的话直接选用自动 DNS 验证即可。 官方说法是申请证书需要10分钟-1天的时间,我大概就是十几分钟吧,很快就收到通知了。下载的证书包含 Apache、Nginx、Tomcat、IIS等服务器的配置文件。我们把 Nginx 文件夹下的两个文件传到服务器就行了。 配置证书我们在 etc/nginx/ 目录下新建 ssl 文件夹来存放证书。把 crt 证书文件和 key 私钥文件上传到这里。然后就可以配置 Nginx 配置文件了。 我的配置文件放在 sites-enabled 文件夹里,我们删掉默认的文件新建一个,具体配置内容可以参考腾讯云的操作指导。 下面是我的配置文件 # 配置 http 访问时通过 301 转发到 https 上。server{ listen 80; server_name example.com www.example.com; return 301 https://www.example.com$request_uri;}# 证书部分内容配置,注意证书路径写对,其他地方照抄就行了server { listen 443 ssl default_server; server_name www.example.com; ssl on; ssl_certificate /etc/nginx/ssl/1_www.example.com_bundle.crt; ssl_certificate_key /etc/nginx/ssl/2_www.example.com.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location / { proxy_pass http://127.0.0.1:8000; }}# 这一步把 顶级域名转发到 www 二级域名上,有利于 SEOserver { listen 443 ssl; server_name example.com; return 301 https://www.example.com$request_uri;}第一个server 配置的是把普通 80 端口访问的 http 协议转发到 https 访问。第二个server 配置的就是证书路径和一些参数,这个照抄就行了,只要把证书路径写对第三个server 配置的是把不带 www 的顶级域名转发到带 www 的二级域名,利于 SEO. 比如 example.com 会自动跳转到 www.example.com 。 ...

April 29, 2019 · 1 min · jiezi

开源-js-在线编程答题系统

前言:开源一套javascript的在线编程答题系统。技术架构:前端: Vue后端: Spring Boot数据库: Mysql持久层框架: Mybatis缓存存储: redis项目部署: docker部分截图: 项目演示: http://xcoding.me 项目前端: https://github.com/Zo3i/CodeJsFront 项目后端: https://github.com/Zo3i/CodeJsSystem 线上部署安装dockerwget https://raw.githubusercontent.com/Zo3i/OCS/master/docker/dockerInstall.sh && chmod +x dockerInstall.sh && ./dockerInstall.sh安装gityum install git一键部署wget https://raw.githubusercontent.com/Zo3i/CodeJsSystem/0040aa0b50f950f6bac160b81dced0a260ddac0b/web/src/main/docker/dockerRun.sh && chmod +x dockerRun.sh && ./dockerRun.sh完成部署访问前端:ip: 80 访问后端: ip: 8090/jsweb 账号/密码: system/admin

April 29, 2019 · 1 min · jiezi

URLOS应用开发基础10分钟制作nginx静态网站环境应用

URLOS开发者功能已上线有一段时间了,目前通过部分开发者的使用体验来看,不得不说URLOS在服务器软件开发效率方面确实有着得天独厚的优势,凭借docker容器技术与其良好的应用生态环境,URLOS必将迅速成为软件开发者的新宠儿。 本篇内容以入门为主,通过制作一个简单的静态网站环境应用,让新晋开发者能在短时间内对URLOS的开发流程有所认识。 URLOS基于docker容器技术,因此在应用开发过程中我们离不开docker的相关命令,对docker还不太了解的朋友,可以先大致了解一下docker的相关内容,本篇不做详细讨论。 URLOS应用开发的基本流程本篇目标是制作nginx静态网站环境,那么我们需要做的内容包括:运行一个基础镜像,在此镜像基础上安装nginx,设置网站根目录,打包并上传新镜像,通过URLOS添加新应用,发布并导出应用。 制作nginx静态网站环境一、拉取Alpine基础镜像为什么选择Alpine作为基础镜像?因为Alpine的文件体积小啊,基础镜像只有5.53MB,相比ubuntu镜像的88.9MB要小十几倍。使用docker pull alpine命令拉取alpine镜像: root@ubuntu:~# docker pull alpineUsing default tag: latestlatest: Pulling from library/alpinebdf0201b3a05: Pull completeDigest: sha256:28ef97b8686a0b5399129e9b763d5b7e5ff03576aa5580d6f4182a49c5fe1913Status: Downloaded newer image for alpine:latestroot@ubuntu:~#然后使用docker images命令查看镜像: root@ubuntu:~# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEurlos/urlos latest 4810506f7202 12 hours ago 447MBalpine latest cdf98d1859c1 2 weeks ago 5.53MBroot@ubuntu:~#二、更新镜像,安装nginx运行Alpine镜像并进入容器内部: root@ubuntu:~# docker run -it alpine sh/ #更换更新源: / # vi /etc/apk/repositories将其中内容换成阿里云的源 / # cat /etc/apk/repositorieshttps://mirrors.aliyun.com/alpine/v3.6/main/https://mirrors.aliyun.com/alpine/v3.6/community// #使用apk update执行更新: / # apk updatefetch https://mirrors.aliyun.com/alpine/v3.6/main/x86_64/APKINDEX.tar.gzfetch https://mirrors.aliyun.com/alpine/v3.6/community/x86_64/APKINDEX.tar.gzv3.6.5-25-g77eea063d8 [https://mirrors.aliyun.com/alpine/v3.6/main/]v3.6.5-18-gfdfe1f6192 [https://mirrors.aliyun.com/alpine/v3.6/community/]OK: 8453 distinct packages available/ #使用apk add nginx安装nginx: ...

April 27, 2019 · 2 min · jiezi

使用-nginx-反向代理多个-docker-容器

导语之前介绍 docker 的时候说过它的优势之一,就是可以在同一服务器中搭建多个环境,互相隔离。昨天就实际操作下,万万没想到如此多的坑,比之前从零开始搭建服务器都费时间。变换了好几种方案,最终还是解决了,中间的心酸就忽略吧,直接说操作方法。 架构服务器中已存在的是 laradock 镜像,可以运行 laravel 环境以及其他的 PHP,包含了 nginx、mysql、redis 等。我的想法是再添加一个 nginx 容器,用来做反向代理。根据子域名进行分发,可以分发给 laradock,也可以给其他任何容器(包括 wordpress、python、java)等等 修改 lradock要修改的只有一个地方,就是 nginx 监听的端口。 进入到 laradock 目录中修改 .env 文件,修改 NGINX_HOST_HTTP_PORT 值由 80 为 8000停止 nginx, docker-compose stop nginx重装 nginx,docker-compose build nginx启动 docker-compose up -d nginx这个时候在浏览器中是不能访问成功的,因为 nginx 已经不再监听 80 端口。 添加 nginx 容器新添加一个 nginx 容器用来做反向代理。在安装 laradock 的时候,已经有了 nginx:alpine 的镜像,可以直接生成容器。当然你也可以重新 pull 一个新的镜像。(推荐使用 alpine版本) 查看 nginx 镜像 ID,docker iamges生成新的 ngixn 容器, docker run --name proxy_nginx -p 80:80 -d [nginx image id]。也可以添加 -v 参数来映射配置文件,我的环境较少变动就不需要了此时在浏览器中访问,应该是 nginx 的默认页面,说明启动成功进入到生成的容器中 docker exec -it proxy_nginx sh安装 vim,apk add vim查看宿主机 ip,/sbin/ip route|awk '/default/ { print $3 }'在 /etc/nginx/conf.d/ 目录下添加新配置文件 laradock.conf,内容如下server { listen 80; server_name you_sits; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://[宿主机IP]:8000; }}退出容器,然后重启 docker restart proxy_nginx打开 8000 端口,参考这里结语这个时候访问的话,就可以代理到 laradock 中的 nginx 了。后续想要新增其他的容器,只要在 proxy_nginx 中添加新的代理规则就可以了。 ...

April 27, 2019 · 1 min · jiezi

不止LNMP的后端开发环境搭建

前言本次目标是在新安装在虚拟机中的CentOS7.5系统中安装一系列后端开发通常用到的程序服务(这里不介绍CentOS的安装),并以phpMyAdmin为例子部署一个网站. Nginx(1.16)MySQL(8.0,开机启动)PHP(7.3)Redis(1.5)memcached(1.4)Composer(1.8)phpMyAdmin(4.8)nodejs(10.15)yarn(1.15)重要提示:如果觉得一个个安装和配置太麻烦那推荐使用宝塔可视化管理工具进行操作,基本实现一键操作极大提高效率,简言之一个字,爽!(当然也不是完美的,如当版本该工具不支持在ubuntu安装MySQL8.0) 约定虚拟机ip是192.168.8.15,管理员用户名sorgo,服务程序执行用户名www,网站根除目录/data/wwwroot,安装和配置时除特别说明则root用户操作,执行编辑文件命令后,下一行开始向右缩进4个空格为本次编辑的内容 CentOSvmware虚拟机安装不到20分钟可以完成(基础网页服务器1810版本,选中文环境,yum源默认是163.com) 用户设置useradd www -s /usr/sbin/nologinuseradd -G www sorgopasswd sorgo#赋予sorgo用户root权限,且切换root时不用输密码, `-l`查看已有权限visudo #编辑内容: #添加一条,表示sorgo可使用`sudo`执行root权限 sorgo ALL=(ALL) NOPASSWD: ALL全局命令别名设置vim /etc/bashrc # 添加内容: alias s-start='systemctl start' alias s-stop='systemctl stop' alias s-restart='systemctl restart' alias s-enable='systemctl enable' alias s-disable='systemctl disablep' alias s-status='systemctl status' alias vi='vim' alias ll='ls -laph' alias ..='cd ..' alias nrd='npm run dev' alias nrh='npm run hot' alias nrp='npm run production' alias nrw='npm run watch' alias nrww='npm run watch-poll' alias yrd='yarn run dev' alias yrh='yarn run hot' alias yrp='yarn run production' alias yrw='yarn run watch' alias yrwp='yarn run watch-poll' alias pa='php artisan' alias phpspec='vendor/bin/phpspec' alias phpunit='vendor/bin/phpunit'#使修改立即生效source /etc/bashrc网站目录及权限#项目目录mkdir -p /data/wwwroot/#日志目录mkdir -p /data/wwwlogs/nginx/#网站基础应用的安装目录mkdir /data/server/#赋权chown -R sorgo:www /data/chmod -Rf g+s /data/网卡配置#查看网卡名,左侧一栏那个就是ifconfig#编辑网卡配置,使nat模式的ip固定下来vi /etc/sysconfig/network-scripts/ifcfg-ens33 #编辑内容: #配置文件关键内容,仅供参考 NAME=ens33 DEVICE=ens33 DEFROUTE=yes ONBOOT=yes #设置为static时要带`IPADDR` BOOTPROTO=static IPADDR=192.168.8.15 NETMASK=255.255.255.0 GATEWAY=192.168.8.2 DNS1=192.168.8.2yum源配置阿里源 ...

April 26, 2019 · 4 min · jiezi

下篇中高级前端大厂面试秘籍寒冬中为您保驾护航直通大厂

引言本篇文章会继续沿着前面两篇的脚步,继续梳理前端领域一些比较主流的进阶知识点,力求能让大家在横向层面有个全面的概念。能在面试时有限的时间里,能够快速抓住重点与面试官交流。这些知识点属于加分项,如果能在面试时从容侃侃而谈,想必面试官会记忆深刻,为你折服的~???? 另外有许多童鞋提到: 面试造火箭,实践全不会,对这种应试策略表达一些担忧。其实我是觉得面试或者这些知识点,也仅仅是个初级的 开始。能帮助在初期的快速成长,但这种策略并没办法让你达到更高的水平,只有后续不断地真正实践和深入研究,才能突破自己的瓶颈,继续成长。面试,不也只是一个开始而已嘛。~???? 建议各位小伙从基础入手,先看 (上篇)中高级前端大厂面试秘籍,寒冬中为您保驾护航,直通大厂(中篇)中高级前端大厂面试秘籍,寒冬中为您保驾护航,直通大厂小菜鸡博客求赞 ???? blog进阶知识Hybrid随着 Web技术 和 移动设备 的快速发展,在各家大厂中,Hybrid 技术已经成为一种最主流最不可取代的架构方案之一。一套好的 Hybrid 架构方案能让 App 既能拥有 极致的体验和性能,同时也能拥有 Web技术 灵活的开发模式、跨平台能力以及热更新机制。因此,相关的 Hybrid 领域人才也是十分的吃香,精通Hybrid 技术和相关的实战经验,也是面试中一项大大的加分项。 1. 混合方案简析Hybrid App,俗称 混合应用,即混合了 Native技术 与 Web技术 进行开发的移动应用。现在比较流行的混合方案主要有三种,主要是在UI渲染机制上的不同: Webview UI: 通过 JSBridge 完成 H5 与 Native 的双向通讯,并 基于 Webview 进行页面的渲染;优势: 简单易用,架构门槛/成本较低,适用性与灵活性极强;劣势: Webview 性能局限,在复杂页面中,表现远不如原生页面;Native UI: 通过 JSBridge 赋予 H5 原生能力,并进一步将 JS 生成的虚拟节点树(Virtual DOM)传递至 Native 层,并使用 原生系统渲染。优势: 用户体验基本接近原生,且能发挥 Web技术 开发灵活与易更新的特性;劣势: 上手/改造门槛较高,最好需要掌握一定程度的客户端技术。相比于常规 Web开发,需要更高的开发调试、问题排查成本;小程序 通过更加定制化的 JSBridge,赋予了 Web 更大的权限,并使用双 WebView 双线程的模式隔离了 JS逻辑 与 UI渲染,形成了特殊的开发模式,加强了 H5 与 Native 混合程度,属于第一种方案的优化版本;优势: 用户体验好于常规 Webview 方案,且通常依托的平台也能提供更为友好的开发调试体验以及功能;劣势: 需要依托于特定的平台的规范限定2. WebvievWebview 是 Native App 中内置的一款基于 Webkit内核 的浏览器,主要由两部分组成: ...

April 26, 2019 · 7 min · jiezi

马蜂窝火车票系统服务化改造初探

交通方式是用户旅行前要考虑的核心要素之一。为了帮助用户更好地完成消费决策闭环,马蜂窝上线了大交通业务。现在,用户在马蜂窝也可以完成购买机票、火车票等操作。 与大多数业务系统相同,我们一样经历着从无到有,再到快速发展的过程。本文将以火车票业务系统为例,主要从技术的角度,和大家分享在一个新兴业务发展的不同阶段背后,系统建设与架构演变方面的一些经验。 第一阶段:从无到有在这个阶段,快速支撑起业务,填补业务空白是第一目标。基于这样的考虑,当时的火车票业务从模式上选择的是供应商代购;从技术的角度需要优先实现用户在马蜂窝 App 查询车次余票信息、购票、支付,以及取消、退票退款等核心功能的开发。 图1-核心功能与流程 技术架构综合考虑项目目标、时间、成本、人力等因素,当时网站服务架构我们选择的是 LNMP(Linux 系统下 Nginx+MySQL+PHP)。整个系统从物理层划分为访问层 ( App,H5,PC 运营后台),接入层 (Nginx),应用层 (PHP 程序),中间件层 (MQ,ElasticSearch),存储层 (MySQL,Redis)。 对外部系统依赖主要包括公司内部支付、对账、订单中心等二方系统,和外部供应商系统。 图 2-火车票系统 V1.0 技术架构 如图所示,对外展现功能主要分为两大块,一块是 C 端 App 和 H5,另外是运营后台。二者分别经过外网 Nginx 和内网 Nginx 统一打到 php train 应用上。程序内部主要有四个入口,分别是: 供其他二方系统调用的 facade 模块运营后台调用的 admin 模块处理 App 和 H5 请求的 train 核心模块处理外部供应商回调模块四个入口会依赖于下层 modules 模块实现各自功能。对外调用上分两种情况,一种是调用二方系统的 facade 模块满足其公司内部依赖;一种是调用外部供应商。基础设施上依赖于搜索、消息中间件、数据库、缓存等。 这是典型的单体架构模式,部署简单,分层结构清晰,容易快速实现,可以满足初期产品快速迭代的要求,而且建立在公司已经比较成熟的 PHP 技术基础之上,不必过多担心稳定性和可靠性的问题。 该架构支撑火车票业务发展了将近一年的时间,简单、易维护的架构为火车票业务的快速发展做出了很大的贡献。然而随着业务的推进,单体架构的缺陷逐渐暴露出来: 所有功能聚合在一起,代码修改和重构成本增大研发团队规模逐渐扩大,一个系统多人开发协作难度增加交付效率低,变动范围难以评估。在自动化测试机制不完善的情况下,易导致「修复越多,缺陷越多」的恶性循环伸缩性差,只能横向扩展,无法按模块垂直扩展可靠性差,一个 Bug 可能引起系统崩溃阻碍技术创新,升级困难,牵一发而动全身为了解决单体架构所带来的一系列问题,我们开始尝试向微服务架构演进,并将其作为后续系统建设的方向。 第二阶段:架构转变及服务化初探从 2018 年开始,整个大交通业务开始从 LNMP 架构向服务化演变。 架构转变——从单体应用到服务化「工欲善其事,必先利其器」,首先简单介绍一下大交通在实施服务化过程中积累的一些核心设施和组件。 ...

April 26, 2019 · 2 min · jiezi

nginx-无法将nginx项识别为-cmdlet函数脚本文件或可运行程序的名称

输入nginx总是出现下面报错nginx : 无法将“nginx”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正 确,然后再试一次。所在位置 行:1 字符: 1+ nginx -s reload+ ~~~~~ + CategoryInfo : ObjectNotFound: (nginx:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException 一开始我用的是windows powerShell管理员身份运行的,后来我用cmd运行nginx命令就没有报错了。 第二个报错: nginx: [emerg] "server" directive is not allowed here in D:\nginx-1.15.12/conf/nginx.conf:47 自己新增的server写错了位置。写在了另一个server里面

April 25, 2019 · 1 min · jiezi

运维笔记PHPnginx编译安装参考

前言由于很多新手问我怎么做编译安装,所以就蛮整理一下。学会编译安装,无论是开发或者运维,都是皆要掌握的硬性要求。 PHP依赖yum install libxml2-devel bzip2-devel libcurl-devel libpng-devel libXpm-devel libjpeg-turbo-devel gmp-devel freetype-devel libvpx-devel krb5-devel zlib-devel pcre-devel pam-devel openssl openssl-devel libmcrypt libmcrypt-devellibmcrypt libmcrypt-devel 可能不存在需要添加repo yum install epel-releaseyum install libmcrypt libmcrypt-devel 安装步骤参考下载包 wget http://php.net/get/php-7.2.5....拓展差异 PHP7.2 enable-gd-native-ttf with-mcrypt 已经不支持编译参数 酌情加减(可移步其他文章了解参数 PHP编译参数详解) ./configure --prefix=/opt/php72 --with-config-file-scan-dir=/opt/php72/etc/php.d --disable-debug --with-pic --with-bz2 --with-gettext --with-gmp --enable-mbregex --enable-mbstring --with-openssl --with-zlib --with-layout=GNU --enable-exif --enable-zip --enable-sockets --enable-xml --with-pear --enable-fpm --with-pdo-mysql --with-curl --with-gd --with-mysqli --enable-soap --with-fpm-user=www --with-fpm-group=www --with-freetype-dir --enable-mbstring --enable-bcmath --with-jpeg-dir --with-ldap-dir配置文件整理cp php-fpm.conf.default php-fpm.confcp www.conf.default www.confcp php.ini-production /opt/php/php7/etc/php.ini 从源码包复制php.ini配置 ...

April 25, 2019 · 1 min · jiezi

Nginx下Frp强制重定向为https配置

迫于家里的路由将300M的带宽强行降到80M的速度,所以入手了一个3205U的软路由,果真没有令人失望,速度飞起O(∩_∩)O哈哈~ 当然,由于宽带没有公网IP所以DDNS就不能使用,转而使用frp,在折腾的过程中踩到了一些坑,所以记录下来,希望能帮助有需要的同学。 frps.ini(服务端配置)[common]bind_port = 5443kcp_bind_port = 5443vhost_http_port = 8080vhost_https_port = 4443# Frp的服务器指示面板配置admin_addr = frp.test.comdashboard_port = 6443dashboard_user = testdashboard_pwd = testlog_file = ./frps.log# trace, debug, info, warn, errorlog_level = infolog_max_days = 3# auth token 可自主生成一些字符串token = sfsfgsdgsdgsgddgsgtcp_mux = truemax_pool_count = 50# 用户自定义域名subdomain_host = frp.test.comfrpc.ini (客户端配置)[common]# 远程服务器IP地址server_addr = 8.8.8.8server_port = 5443token = sfsfgsdgsdgsgddgsgtls_enable = true[lede]type = httplocal_ip = 10.10.10.1local_port = 80# 这里的值最终会被解析为lede.frp.test.com(需要在你的域名服务器做指向你自己公网服务器的*.frp.test.com的# 域名泛解析)subdomain = ledeuse_encryption = false use_compression = true# HTTP基础认证可以不填写http_user = testhttp_pwd = testvhosts.conf(Nginx配置)server { listen 80; listen 443 ssl http2; ssl_certificate /usr/local/nginx/conf/ssl/lede.frp.test.com.crt; ssl_certificate_key /usr/local/nginx/conf/ssl/lede.frp.test.com.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_timeout 10m; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_buffer_size 1400; add_header Strict-Transport-Security max-age=15768000; ssl_stapling on; ssl_stapling_verify on; server_name lede.frp.okuka.com; access_log /data/wwwlogs/lede.frp.test.com_nginx.log combined; if ($ssl_protocol = "") { return 301 https://$host$request_uri; } location / { proxy_pass http://127.0.0.1:8080;#端口号一定要和frps.ini的vhost_http_port一致 proxy_set_header Host $host; proxy_set_header X-Real-IP 8.8.8.8;#这里填写你的公网服务器IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}注意!!!!!以上操作就能需要重启服务后才能使用 ...

April 25, 2019 · 1 min · jiezi

nginx配置那些事

随着项目的跟近,与nginx打的交道越来越多,现将遇到的问题记录如下: 相对路径在进行路径定义时,是否可以使用相对路径?NO 绝对不能够使用相对路径 日志# 根级别error_log /var/logs/error.log warn;http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # http级别 access_log /var/logs/access.log main; server { listen 8010; server_name 127.0.0.1 localhost; # server级别 error_log /var/logs/8010/access.log info; }}注意 1. 一定要用绝对路径。2. 如果日志没有马上显示,使用nginx -s reload来重启服务。3. 出现问题一定要看日志 root与alias访问:attachment时,访问/api/attachment: # 附件 location /attachment/ { root /api; index index.html index.htm; }等于: # 附件 location /attachment/ { alias /api/attachment/; index index.html index.htm; }

April 24, 2019 · 1 min · jiezi

用nginxWordPress搭建个人博客全流程

0x00 前言        WordPress是世界上最受欢迎的CMS系统,它是基于php和MySQL技术栈的,并且还有很多插件,可扩展性非常强。正好最近有一台空闲的ECS,于是来搭建一个玩玩。本教程是基于LEMP技术栈来搭建的,各个版本如下: L版本为CentOS7.6版本,E版本为nginx1.12.2版本M版本为Distrib 5.5.60-MariaDBP版本为php7.2此外,现在全面https已经是趋势了,自然我们也不能落后,所以还会使用Let's Encrypt来生成免费的SSL证书进行配置 0x01 前置条件有一个域名,我自己的域名为nomansky.xyz一台VPS或者云主机,如果是国内的IP需要备案具有sudo权限或root权限的用户,这里我新建一个wordpress用户来运行程序,并且使用下列命令设置为nologina. sudo useradd -s /sbin/nologin wordpress使用sudo yum install -y epel-release安装了epel源关闭firewalld,我更喜欢用iptables来做安全加固a. sudo systemctl stop firewalldb. sudo systemctl disable firewalld0x02 安装nginx执行sudo yum install nginx安装nginx启动nginx守护进程并设置为开机自启a. sudo systemctl start nginxb. sudo systemctl enable nginx将wordpress用户加入到nginx组usermod -a -G nginx wordpress,同时设置目录权限chmod 770 -R /var/lib/nginx/此时访问 http://nomansky.xyz 即可看到如下页面,则说明nginx安装成功了0x03 安装Mariadb        Mariadb作为MySQL的一个开源的分支,已经成为了CentOS用来替换MySQL的默认的数据库,所以我这里也使用Mariadb作为数据库。 执行sudo yum install mariadb-server -y来安装mariadb启动Mariadb并设置为开机自启a. sudo systemctl start mariadbb. sudo systemctl enable mariadb执行sudo mysql_secure_installation来加固Mariadb。你会看到要求设置数据库root密码、移除匿名用户、限制只能通过localhost登陆数据库root用户和移除test数据库,这里推荐全部选Y(YES),如下图所示,默认的数据库root密码为空除此之外,还要把mariadb监听的地址改为127.0.0.1:3306a. vim /etc/my.cnf.d/server.cnf打开Mariadb的配置文件b. 在[mysqld]下面加上bind=127.0.0.1,如下图所示c. 执行systemctl restart mariadb重启数据库d. 执行netstat -lntp可以看到已经监听为本地回环地址了0x04 创建数据库在安装完mariadb数据库,并对其进行加固后,我们自然需要新建一个数据库来存放数据,这里首先我们用之前设置的root账号密码来登陆数据库mysql -uroot -p,并执行以下几条语句 ...

April 24, 2019 · 3 min · jiezi

Nginx失败重试中的HTTP协议幂等问题: non_idempotent

Nginx通过反向代理做负载均衡时,如果被代理的其中一个服务发生错误或者超时的时候,通常希望Nginx自动重试其他的服务,从而实现服务的高可用性。实际上Nginx本身默认会有错误重试机制,并且可以通过proxy_next_upstream来自定义配置。 如果不了解HTTP协议以及Nginx的机制,就可能在使用过程中遇到各种各样的坑。例如服务出现了错误或超时却未重试,或者一些例如创建订单或发送短信这类的HTTP接口,客户端只发送一次请求,后台却由于Nginx重试导致创建了多个订单,或者收到多条短信,导致一些业务上的问题。 proxy_next_upstream在Nginx配置文件中,proxy_next_upstream用于指定在什么情况下Nginx会将请求转移到其他服务器上。其默认值是proxy_next_upstream error timeout,即发生网络错误以及超时,才会重试其他服务器。默认情况下服务返回500状态码是不会重试的,如果想在响应500状态码时也进行重试,可以配置: proxy_next_upstream error timeout http_500;当然还有http_502、http_503、http_404等可以指定在出现哪些状态码的情况下需要重试。具体配置项可以参考官方文档: http://nginx.org/en/docs/http... 。 用一个最简单的例子来测试一下该特性,例如下面是Spring Boot写了一个简单的HTTP接口,返回500状态码: @SpringBootApplicationpublic class NginxRetryApplication { public static void main(String[] args) { SpringApplication.run(NginxRetryApplication.class, args); }}@RestControllerclass TestController { @RequestMapping("/") public String test() { System.out.println("收到一个请求"); // 打印日志 throw new RuntimeException(); // 抛出异常, 返回500状态码 }}分别使用9030和9031两个端口号启动该Spring Boot服务,然后Nginx配置好负载均衡: upstream nginxretry { server 127.0.0.1:9030 max_fails=0; server 127.0.0.1:9031 max_fails=0;}server { listen 9039; location / { proxy_pass http://nginxretry; proxy_next_upstream error timeout http_500; }}注意:以上配置中max_fails=0是为了更方便的测试Nginx错误重试机制。max_fails默认值是1,用于指定一个server在一段时间内(默认10s)发生错误次数达到多少次,Nginx就会自动将该服务器下线。这里设置为0是禁用这个特性,防止在测试过程中服务器被踢下线不好测试。线上环境下一般不会设置max_fails=0。 配置完成后重启Nginx,使用GET方式请求 http://localhost:9039/ ,再分别查看9030和9031两个端口号对应的服务日志,可以发现两个服务都收到请求,也就是Nginx在访问其中一个服务收到500错误状态码后,又尝试去访问另一个服务。 ...

April 21, 2019 · 1 min · jiezi

nginx 之 proxy_pass 接口转发的规则

今天上了一个多页应用,发现接口转发后是 401。 最后发现是接口转发出错了。地址里多拼了一个 路径。 以前我一直以为location 字段会替换掉 proxy_pass 里面配置的 url 地址。 今天了解了一下 发现还是有不少细节的。// node js 文件,打印请求路径。方便查看后端真实接受到的请求地址const http = require(‘http’);http.createServer((req, res) => { console.log(req.url); res.end(您的 请求 地址是${req.url});}).listen(3000);proxy_pass 如何转发,首先看 proxy_pass 的url 配置。proxy_pass 只是HOSTproxy_pass 只是HOST,不包含任何路径,比如* http://host - √* https://host - √* http://host:port - √* https://host:port - √* http://host/ - x* http://host:port/ - x这种情况下,会把匹配到的所有路径直接穿透转发。比如以下的配置 location /api/ { proxy_pass http://127.0.0.1:3000; }访问 http://127.0.0.1:80/api/cc, 后端结果为 您的 请求 地址是/api/ccproxy_pass 包含路径这里的路径哪怕只是一个 / 也是存在的,如:http://host - xhttps//host/ - √http://host:port- xhttps://host:port/ - √http://host/api - √http://host/api/ - √这种情况下,url 里面会去掉 location 匹配的字符串,拼接到 proxy_pass 再进行转发。 location /api/ { proxy_pass http://127.0.0.1:3000/; }访问 http://127.0.0.1:81/api/cc, 后端结果为 您的 请求 地址是/cc重写代理链接 - url rewrite使用 rewrite 指令并且生效后,proxy_pass url 链接中的路径会被忽略,如:server { listen 83; location / { rewrite ^/api/(.) /fixpath=$1 break; proxy_pass http://127.0.0.1:3000/node/; } location ^/api/ { rewrite ^/api/(.) /fixpath=$1 break; proxy_pass http://127.0.0.1:3000/node/; } }访问 http://127.0.0.1:83/bb/cc 得到 您的 请求 地址是/node/bb/cc(匹配上 / 了,没有匹配 rewrite)访问 http://127.0.0.1:83/api/cc 得到 您的 请求 地址是/fixpath=cc (我们写的 proxy_pass http://127.0.0.1:3000/node/ 里面的 node路径丢失了 )知道了这几点,碰到转发接口也有一点底气啦~更多在github上看到的这本小书 ⬇️(参考资料)[https://xuexb.github.io/learn…]我的 nginx 配置events {}http { # proxy_pass url 只是 host # 这时候 location 匹配的完整路径将直接透传给 url ,如: server { listen 80; location / { proxy_pass http://127.0.0.1:3000; } location /api/ { proxy_pass http://127.0.0.1:3000; } } # url 包含路径 # 当 proxy_pass url 的 url 包含路径时,匹配时会根据 location 的匹配后的链接透传给 url ,注意匹配后就是这样: server { listen 81; location / { proxy_pass http://127.0.0.1:3000/; } location /api/ { proxy_pass http://127.0.0.1:3000/; } location /bpi/ { proxy_pass http://127.0.0.1:3000/v1; } location /cpi { proxy_pass http://127.0.0.1:3000/v1; } } # 当 location 以正则形式匹配时,proxy_pass 就不能以 / 结束了,也就是不能包含路径了, 会提示配置错误,比如错误的: server { listen 82; location / { proxy_pass http://127.0.0.1:3000/; } # nginx: [emerg] “proxy_pass” cannot have URI part in location given by regular expression, or inside named location, or inside “if” statement, or inside “limit_except” block in /test.conf:47 # location ~* ^/api/ { # proxy_pass http://127.0.0.1:3000/; # } # nginx: [emerg] “proxy_pass” cannot have URI part in location given by regular expression, or inside named location, or inside “if” statement, or inside “limit_except” block in /Users/tangdaoyuan/code/anheng/jz-bingjiang/test.conf:52 # location ~* ^/api/ { # proxy_pass http://127.0.0.1:3000/b1; # } } # 使用 rewrite 指令并且生效后,proxy_pass url 链接中的路径会被忽略,如: server { listen 83; location / { proxy_pass http://127.0.0.1:3000/node/; } location ^/api/ { rewrite ^/api/(.*) /fixpath=$1 break; proxy_pass http://127.0.0.1:3000/node/; } }}测试流程 : node 运行 服务, 启动Nginx 转发 , 再用postman 发送请求。 ...

April 20, 2019 · 2 min · jiezi

聊聊 Nginx 的反向代理

本文来自于我的慕课网手记:聊聊 Nginx 的反向代理,转载请保留链接 ;)背景最近在优化服务基础设施这块,正好有时间写一下Nginx的体会。相信大家都听说过反向代理,一提到反向代理一定会想到Nginx。什么你没听过Nginx?那么你一定听说过Apache吧!Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。Apache的发展时期很长,而且是毫无争议的世界第一大服务器。它有着很多优点:稳定、开源、跨平台等等。它出现的时间太长了,它兴起的年代,互联网产业远远比不上现在。所以它被设计为一个重量级的。它不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。所以这些都决定了Apache不可能成为高性能WEB服务器,轻量级高并发服务器Nginx就应运而生了。什么是Nginx俄罗斯的工程师Igor Sysoev,他在为Rambler Media工作期间,使用C语言开发了Nginx。Nginx作为WEB服务器一直为Rambler Media提供出色而又稳定的服务。然后呢,Igor Sysoev将Nginx代码开源,并且赋予自由软件许可证。由于:Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器(这是个开源的时代啊~)Nginx是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris, AIX,Mac OS等操作系统上。可以作为反向代理进行负载均衡的实现,带来的极大的稳定性。Nginx这样做的目的主要是将数据的承载量分摊到多个服务器上进行执行,这只是在服务基础设施上提高性能的优化手段之一。从下面图就可以看出:什么是反向代理?看了网上很多篇文章,下面这段话是我个人觉得介绍的最清楚的。反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。所以反向代理服务器是引用在服务端。决定哪台服务器提供服务。那么我就模拟了一个基本的反向代理和负载均衡配置实现,下面是我的操作步骤:反向代理的模拟首先创建多个 tomcat 服务器,我这里创建了三个:然后修改每个 tomcat 运行在不同的端口号上,每个 server.xml配置文件需要修改三处端口:分别在 8080,8081,8082 端口配置 8006,8081,8010 端口,分别进行启动测试,但是注意防火墙配置问题。测试结果如下:接着配置 nginx 的配置文件,进行反向代理:最后不断访问刚配置的 test.tomcats.com 域名,发现三台 tomcat 成功运行的页面都有出现,比例大致 1:1:1:恭喜你,配置成功了!配置负载均衡其实很简单,就是在刚刚配置的 nginx 文件中 的 upstream tomcats 中的 server 后面添加一个 weight, 即可代表权重。权重越高,分派请求的数量就越多。默认权重是 1。

April 18, 2019 · 1 min · jiezi