Nginx
(发音:engine X)是一款轻量级的HTTP
服务器(相比于Apache、Lighttpd而言),同时是一个高性能的HTTP
和反向代理服务器,如今国内主流网站基本搭建于Nginx
之上,诸如新浪、腾讯、网易、豆瓣。
Nginx
主要以事件驱动的方式编写,有兴趣可以移步这里看他们的源码,这让它拥有非常好的性能,同时也是一个非常高效的反向代理、负载均衡(不知道反向代理跟负载均衡的童鞋请自觉移步文章结尾恶补一下)。
官方站点也指出了Nginx
作为HTTP服务器的几项基本特性:
- 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲
- 无缓存的反向代理加速,简单的负载均衡和容错
- FastCGI,简单的负载均衡和容错
- 模块化的结构,包括gzipping,byte ranges,chunked responses,以及SSI-filter等filter。
- 支持SSL和TLSSNI.
对于前端童鞋而言,可能基本不会碰到服务器的东西,但如果像我这样子有『全栈工程师』心结的话倒是可以研究一下,自己成功配置Nginx启动自己的服务,以后再碰到这些关于Nginx的问题自己能够解决,丰衣足食~
接下来我将手把手教大家从安装到配置,搭建起Nginx环境,走起~
安装并启动Nginx
由于我是用Mac办公的,所以安装Nginx
是采用brew
进行的,在终端
输入下面命令安装好Nginx
:
# 强烈建议每次brew安装软件的时候先执行brew update保持软件依赖包都是最新的 brew update && brew install nginx |
紧接着就可以用浏览器打开http://localhost:8080看到Nginx
的欢迎信息。
跟Linux
系统有些不同,在Mac
下面Nginx
默认监听了8080
端口号,若强迫症(比如我)不希望每次打开网页都要输入端口号的话,那么请在终端
执行下面命令:
# 下面的1.8.0请根据最新安装版本号对应修改 sudo chown root:wheel /usr/local/Cellar/nginx/1.8.0/bin/nginx sudo chmod u+s /usr/local/Cellar/nginx/1.8.0/bin/nginx # 用vi编辑器打开nginx配置文件,找到server字段的listen字段并将其值修改为80 vi /usr/local/etc/nginx/nginx.conf |
修改完上面配置信息
之后,执行下面命令检查配置文件语法是否有误并且重新加载配置:
nginx -t && nginx -s reload
|
更多关于Nginx
命令的帮助可以输入nginx -h
查看,若想每次开机自动开启Nginx
,在终端
执行下面命令即可:
ln -sfv /usr/local/opt/nginx/*.plist ~/Library/LaunchAgents launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist |
Nginx配置不完全详解
Nginx
能否发挥淋漓尽致,就看配置文件了,由于Nginx
配置实在太多,不能一一解释,有兴趣移步官方文档。接下来我会给大家解释比较重要的配置,下面是我机器上的Nginx
的配置文件(我会带上注释):
| 强烈建议大家先打开自己的默认Nginx配置跟我的对比来看
| 可以在终端
执行 cat /usr/local/etc/nginx/nginx.conf.default
查看默认配置文件
# user字段表明了Nginx服务是由哪个用户哪个群组来负责维护进程的,默认是nobody # 我这里用了cainengtian用户,staff组来启动并维护进程 # 查看当前用户命令: whoami # 查看当前用户所属组命令: groups ,当前用户可能有多个所属组,选第一个即可 user cainengtian staff; # worker_processes字段表示Nginx服务占用的内核数量 # 为了充分利用服务器性能你可以直接写你本机最高内核 # 查看本机最高内核数量命令: sysctl -n hw.ncpu worker_processes 4; # error_log字段表示Nginx错误日志记录的位置 # 模式选择:debug/info/notice/warn/error/crit # 上面模式从左到右记录的信息从最详细到最少 error_log /usr/local/var/logs/nginx/error.log debug; # Nginx执行的进程id,默认配置文件是注释了 # 如果上面worker_processes的数量大于1那Nginx就会启动多个进程 # 而发信号的时候需要知道要向哪个进程发信息,不同进程有不同的pid,所以写进文件发信号比较简单 # 你只需要手动创建,比如我下面的位置: touch /usr/local/var/run/nginx.pid pid /usr/local/var/run/nginx.pid; events { # 每一个worker进程能并发处理的最大连接数 # 当作为反向代理服务器,计算公式为: `worker_processes * worker_connections / 4` # 当作为HTTP服务器时,公式是除以2 worker_connections 2048; } http { # 关闭错误页面的nginx版本数字,提高安全性 server_tokens off; include mime.types; default_type application/octet-stream; # 日志记录格式,如果关闭了access_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可以让读取磁盘IO操作更快 # 当然如果你在学习的过程中可以打开方便查看Nginx的访问日志 access_log off; sendfile on; # 在一个数据包里发送所有头文件,而不是一个接一个的发送 tcp_nopush on; # 不要缓存 tcp_nodelay on; keepalive_timeout 65; gzip on; client_max_body_size 10m; client_body_buffer_size 128k; # 关于下面这段在后面紧接着来谈! include /usr/local/etc/nginx/sites-enabled/*; } |
Nginx配置最佳实践
上面的配置文件
最后一行include
关键词会将/usr/local/etc/nginx/sites-enabled/
文件夹下面的所有文件都加载进当前的配置文件,这样子就可以将配置文件分离,nginx.conf
这个配置文件
修改之后以后基本不会修改,配置不同站点的时候只需要在/usr/local/etc/nginx/sites-enabled/
不断增加新的文件即可,这是比较好的配置方式。
比如我在/usr/local/etc/nginx/sites-enabled/
下面增加了两个文件,用来配置普通的HTTP
服务还有HTTPS
服务:
touch /usr/local/etc/nginx/sites-enabled/default touch /usr/local/etc/nginx/sites-enabled/default-ssl |
default配置解析
Nginx
整个配置的结构大致如下:
... events { ... } http { ... server { ... location xxx { ... } } } |
对比上面我的nginx.conf
文件可以知道default
文件的内容就是配置server
部分的,下面先弄一份最基本的配置(带有详细说明):
server { # Nginx监听端口号 listen 80; # 服务器的名字,默认为localhost,你也可以写成aotu.jd.com,这样子就可以通过aotu.jd.com来访问 server_name localhost; # 代码放置的根目录 root /var/www/; # 编码 charset utf-8; location / { # index字段声明了解析的后缀名的先后顺序 # 下面匹配到/的时候默认找后缀名为php的文件,找不到再找html,再找不到就找htm index index.php index.html index.htm; # 自动索引 autoindex on; # 这里引入了解析PHP的东西 include /usr/local/etc/nginx/conf.d/php-fpm; } # 404页面跳转到404.html,相对于上面的root目录 error_page 404 /404.html; # 403页面跳转到403.html,相对于上面的root目录 error_page 403 /403.html; # 50x页面跳转到50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } |
上面的配置的意思就是:访问http://localhost『80端口号可以直接省略』的时候会在/var/www/
下面找index.php
文件,如果没有找到就找index.html
,如果再没有找到那就找index.htm
,如果还是没有找到的话就404
跳转到404.html
,如果你刚好将/var/www/
设置为root
用户访问的话,那么就会直接无访问权限403
跳转到403.html
。
值得注意的是server
字段里面的root
字段,这个字段需要跟alias
字段区分开来,通过下面两段配置解释一下:
# 当用root配置的时候,root后面指定的目录是上级目录 # 并且该上级目录必须含有和location后指定的名称的同名目录,否则404 # root末尾的"/"加不加无所谓 location { root www/;} # 如果用alias配置,其后面跟的指定目录是准确的,并且末尾必须加"/",否则404 location { alias www/;} |
大家在实践过程中注意区分即可,配置之后要是碰到404
可以先考虑是否是这个原因。
配置反向代理
对于前端工程师而言,可能最容易成为全栈
的技能就是NodeJS
了,当我们用express
框架写好了一个Node
应用之后,比如启动的时候的访问地址是:http://localhost:3000/
,但是在部署到服务器上去之后,我们当然不希望别人这样子访问,最好的情况肯定是隐藏掉端口号。
例如我有一个Node
服务的名字是o2blog_wx
,在启动Node
的时候访问的地址是:http://localhost:3000/
,但是对外网我们希望是:http://aotu.jd.com/o2blog_wx
,接下来我们将通过Nginx
进行配置(带有详细注释)。
server { listen 80; server_name aotu.jd.com; root /var/www/; location /o2blog_wx/ { # 反向代理我们通过proxy_pass字段来设置 # 也就是当访问http://aotu.jd.com/o2blog_wx的时候经过Nginx反向代理到服务器上的http://127.0.0.1:3000 # 同时由于解析到服务器上的时候o2blog_wx这个字段都要处理 # 所以通过rewrite字段来进行正则匹配替换 # 也就是http://aotu.jd.com/o2blog_wx/hello经过Nginx解析到服务器变成http://127.0.0.1:3000/hello proxy_pass http://127.0.0.1:3000; rewrite ^/o2blog_wx/(.*) /$1 break; } } |
配置临时跳转
有时候我们觉得一开始配置的URL不好想换掉,但又不想原先的链接失效,比如一开始对外网的链接是:http://aotu.jd.com/o2blog_wx/,后来想改成http://aotu.jd.com/wxblog,又不想原先的失效。
这个时候可以在Nginx
上配置一个302
临时跳转,如下(server
部分跟前面的一样):
location /o2blog_wx/ { return 302 http://aotu.jd.com/wxblog } |
配置限制访问
在一台服务器上的资源不全部都是对外开放的,这个时候就需要通过Nginx
配置一个限制访问,比如查看本服务器的PHP
信息,我们就可以通过下面配置来实现限制访问:
# 当匹配到/info的时候只允许10.7.101.224访问,其它的全部限制 # 同时改写为/info.php location = /info { allow 10.7.101.224; deny all; rewrite (.*) /info.php } |
这个时候只有IP
为10.7.101.224
的机器才可以访问:http://aotu.jd.com/info,其它机器都会`403`拒绝访问!
当然最佳的实践是将IP
抽取出来变成白名单,这样子就可以实现部分IP
可以访问,其它的不能访问。
default-ssl 配置解析
我们都知道HTTP
在传输的过程中都是明文的,这直接导致了在传输的任何一个过程中都容易被窃取信息,所以才有了SSL
(安全套接层)以及升级版TLS
(传输层安全协议)的出现,其实就是在HTTP
应用层给TCP/IP
传输层的中间增加了TLS/SSL
层,统称为HTTPS
。
那如何通过Nginx
配置HTTPS
站点呢,下面就是default-ssl
配置文件的内容(详细解析):
server { # 默认情况下HTTPS监听443端口 listen 443 ssl; server_name localhost; root /var/www/; # 下面这些都是配置SSL需要的 ssl on; # 下面两个字段需要的crt利用openssl生成,具体可以看[这里](http://nginx.org/en/docs/http/configuring_https_servers.html) ssl_certificate ssl/localhost.crt; ssl_certificate_key ssl/localhost.key; ssl_session_timeout 10m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location = /info { allow 127.0.0.1; deny all; rewrite (.*) /info.php; } location /phpmyadmin/ { root /usr/local/share/phpmyadmin; index index.php index.html index.htm; } location / { include /usr/local/etc/nginx/conf.d/php-fpm; } error_page 403 /403.html; error_page 404 /404.html; } |
上面配置之后,就可以通过https://localhost访问我们的Nginx
首页了。
当然若要在对外网使用,必须购买第三方信任证书才行,有兴趣的童鞋可以谷歌了解,这里不细谈。
小结
写到这里,最基本的Nginx
配置就基本介绍完了,若按照我上面的配置一步步跟着改,基本上都可以跑起来Nginx
服务了吧,若想更加深入学习Nginx
的配置,强烈建议看官方文档,写得很清晰明了,还是那句老话:授之以鱼不如授之以渔
。
反向代理
提到反向代理
,必然先提到正向代理
,正向代理(forward)是一个位于客户端【用户A】和原始服务器(origin server)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。如下图(图来自网络,如有侵权请联系我删除~):
从上图可以看出,所谓的正向代理
就是代理服务器替代访问方【用户A】去访问目标服务器【服务器B】
,在现实中的例子就是fanqiang!但如果代理服务器Z被完全控制(或不完全控制),就变成了『肉鸡』了。
而反向代理
与正向代理相反,对客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
使用反向代理服务器主要核心作用如下:
- 保护和隐藏原始资源服务器
从上图可以看出,用户A始终认为它访问的是代理服务器Z而不是原始服务器B,但实际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。
- 负载均衡
当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问资源服务器B的时候,让不同的代理服务器Z(x)去应答不同的用户,然后发送不同用户需要的资源。
当然反向代理服务器
像正向代理服务器
一样拥有CACHE的作用,它可以缓存原始资源服务器B的资源,而不是每次都要向原始资源服务器B请求数据,特别是一些静态的数据,比如图片和文件,如果这些反向代理服务器能够做到和用户X来自同一个网络,那么用户X访问反向代理服务器X,就会得到很高质量的速度。这正是CDN技术
的核心。如下图:
相关推荐
内容概要:本文介绍了如何利用CST软件进行三维超材料的能带计算。首先概述了三维超材料的独特性质及其广泛应用前景,接着简要介绍了CST软件的功能特点。随后详细阐述了能带计算的具体步骤,包括模型建立、材料参数设置、网格划分与求解设置以及最终的计算与结果分析。最后给出了一段Python代码示例,展示了如何处理CST输出的数据并绘制能带图。文章强调了计算机模拟技术对于深入了解超材料电子结构和物理性质的重要性。 适合人群:从事材料科学研究的专业人士,尤其是对三维超材料和电磁场模拟感兴趣的科研工作者和技术人员。 使用场景及目标:适用于希望借助CST软件开展三维超材料能带计算的研究项目,旨在提高对超材料的理解,推动相关领域的技术创新和发展。 其他说明:文中提供的Python代码仅为示例,在实际操作时可根据具体情况进行调整优化。同时,掌握CST软件的基本操作和电磁理论基础知识有助于更好地理解和应用本文内容。
内容概要:本文详细介绍了基于FPGA的永磁同步伺服系统的矢量控制设计,涵盖了从电流环到速度环的关键模块实现。具体包括Clarke和Park变换、PI调节器、AD7606采样、正交编码器反馈以及SVPWM生成等部分。文中提供了详细的Verilog代码片段,展示了各个模块的具体实现方法和技术细节。特别强调了定点数处理、时序设计和跨时钟域处理等方面的技术挑战及其解决方案。 适合人群:具备一定FPGA开发经验和电机控制基础知识的研发人员。 使用场景及目标:适用于希望深入了解FPGA在电机控制应用中的具体实现方式,特别是矢量控制和电流环设计的专业人士。目标是掌握FPGA平台下高效、低延迟的电机控制系统设计方法。 阅读建议:由于涉及大量具体的Verilog代码和硬件设计细节,建议读者在阅读过程中结合实际项目进行实验和调试,以便更好地理解和掌握相关技术。
经典飞机大战游戏是理解实时交互系统设计的绝佳载体。本文将深入剖析现代空战游戏的核心模块,涵盖刚体运动学、弹道轨迹优化、碰撞检测算法等关键技术,揭示二维游戏背后复杂的三维数学建模过程。
scratch少儿编程逻辑思维游戏源码-冰塔.zip
scratch少儿编程逻辑思维游戏源码-弹跳(4).zip
内容概要:本文详细介绍了COMSOL软件中三种常见的焊接热源模型——双椭球热源、高斯旋转体热源和柱状体热源。双椭球热源适用于模拟移动热源(如激光焊、电弧焊),通过调整轴向系数a1和a2来控制热流分布;高斯旋转体热源适合小范围焊接,采用三维高斯函数描述热流密度;柱状体热源则用于深熔焊场景,特点是计算速度快。文中还提供了每种模型的具体代码实现,并强调了调试时需要注意的关键点,如时间步长、网格加密等。此外,作者分享了一些实用技巧,如将热源参数设置为全局变量并利用参数扫描功能提高调试效率。 适合人群:从事焊接工艺仿真、材料加工领域的研究人员和技术人员,以及对COMSOL建模感兴趣的工程技术人员。 使用场景及目标:帮助用户选择合适的热源模型进行焊接模拟,确保模拟结果的准确性;提供具体的代码实现和调试方法,使用户能够快速掌握并应用于实际项目中。 其他说明:文中提到的热源模型不仅限于理论介绍,还包括实际操作中的注意事项和优化建议,有助于提升模拟效果和工作效率。
内容概要:本文介绍了将基于RBF神经网络的PID控制器应用于永磁同步电机(PMSM)转速环控制的方法及其性能优势。传统的PID控制器在面对非线性和时变系统时存在参数整定困难的问题,而引入RBF神经网络可以实现实时在线调参,提高系统的灵活性和鲁棒性。文中详细描述了Simulink模型的设计,特别是Matlab s-function模块中RBF神经网络的具体实现,包括高斯函数激活和带惯性的权值更新机制。实验结果显示,在转速突变情况下,改进后的控制器能够迅速稳定系统,超调量控制在2%以内,调节时间较传统方法缩短约40%,并且在负载变化时表现出色,无需重新整定参数。 适合人群:从事电机控制系统研究和开发的技术人员,尤其是对PID控制器优化感兴趣的工程师。 使用场景及目标:适用于需要提升PMSM转速环控制精度和响应速度的应用场合,如工业自动化设备、机器人等领域。目标是通过引入智能算法解决传统PID控制器参数整定难题,提高系统性能。 阅读建议:关注RBF神经网络与PID控制器结合的具体实现细节,特别是在Matlab s-function模块中的编码技巧以及参数调整策略。同时,注意学习率的选择和动量项的作用,这对于实际应用至关重要。
scratch少儿编程逻辑思维游戏源码-GTA 6.zip
scratch少儿编程逻辑思维游戏源码-仓鼠跑酷.zip
scratch少儿编程逻辑思维游戏源码-超级麦克世界.zip
scratch少儿编程逻辑思维游戏源码-400年.zip
少儿编程scratch项目源代码文件案例素材-气球足球.zip
少儿编程scratch项目源代码文件案例素材-沙漠迷城.zip
scratch少儿编程逻辑思维游戏源码-比谁高.zip
少儿编程scratch项目源代码文件案例素材-乾坤大挪移.zip
scratch少儿编程逻辑思维游戏源码-菜鸟跳跃.zip
内容概要:本文档详细介绍了C++语言的基础知识、高级特性及其应用。首先,文档回顾了C++对C语言的扩展,包括面向对象编程的支持、增强的语法特性(如命名空间、引用、常量处理等)。接着,深入探讨了类和对象的使用,涵盖构造函数、析构函数、拷贝构造函数、深浅拷贝等重要概念。文档还讲解了单例模式的设计与实现、C++面向对象模型的核心要素(如this指针、静态成员、友元函数)、继承与派生的关系及其实现细节、多态性的原理与应用。此外,文档详细介绍了C++的模板机制、类型转换、异常处理机制、输入输出流操作、STL(标准模板库)的容器和算法等内容。每个部分都通过具体的代码示例和解释,帮助读者理解和掌握C++的关键特性和最佳实践。 适合人群:具备一定编程基础,尤其是熟悉C语言的开发者;希望深入了解C++语言特性和面向对象编程思想的程序员;从事C++开发工作的工程师和技术爱好者。 使用场景及目标:①掌握C++语言的核心概念和高级特性;②理解并能够应用面向对象编程的基本原则和模式;③学习如何使用STL容器和算法优化代码性能;④提升C++程序的健壮性和可维护性,特别是在处理复杂数据结构和算法时;⑤掌握异常处理和类型转换的最佳实践,确保程序的稳定性和安全性。 其他说明:本文档不仅提供了理论知识,还结合了大量实例代码,便于读者边学边练。对于每一个知识点,文档都力求做到详尽解释,确保读者能够透彻理解并灵活运用。文档内容全面覆盖了C++编程的各个方面,从基础语法到高级特性,适合不同层次的学习者逐步深入学习。
内容概要:本文详细探讨了电气铁路柔性过分相技术中的60°换相波形稳定问题。首先介绍了柔性过分相的基本概念及其重要性,接着重点讨论了60°换相波形稳定对系统运行效率和稳定性的影响。文中还阐述了实现换相波形稳定的多种方法,如先进控制算法、实时监测设备以及滤波器的应用。最后,通过引用相关文献和实例,进一步验证了换相波形稳定的重要性和可行性。 适合人群:从事电气铁路系统设计、维护的技术人员,以及对该领域感兴趣的科研人员。 使用场景及目标:适用于希望深入了解电气铁路柔性过分相技术的专业人士,旨在帮助他们掌握60°换相波形稳定的相关理论和技术手段,提升系统性能。 其他说明:文章结合了理论分析与实际案例,提供了丰富的参考资料,有助于读者全面理解并应用于实际工作中。
scratch少儿编程逻辑思维游戏源码-发动.zip