前言

nginx 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMYP服务器(准确的说,nginx是一个实现上面功能的技术,他是技术,不是服务器,但是官网定义为server还是一个实打实的服务器,广义的吧)。再次求证,百度百科上定义服务器特指为可以提供计算服务的设备。我们常说的web服务器,一般是指网络服务器,是指驻留在因特网上某种类似计算机的程序,可以向浏览器等web客户端提供文档,也可以放置网站文件,让全时间浏览或者下载等。定义的解释如下:

  1. 代理服务器proxy server,其功能就是代理网络用户去取得网络信息。形象地说,它是网络信息的中转站。代理服务器是介于浏览器(客户端)和web服务器之间的一台服务器,浏览器的请求到达代理服务器,由代理服务器来取回浏览器所需要的信息,并传送给浏览器。而且,大部分代理服务器具有缓冲功能,cache,有很大的存储空间,不断的将服务器的信息储存在本机的存储器上。供客户端使用,可以提高浏览速度和效率。
  2. 代理(英语:Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。提供代理服务的电脑系统或其它类型的网络终端称为代理服务器
  3. 代理服务器的作用:
  1. 增加缓冲器cache,提高访问速度
  2. 连接内网与internet,充当防火墙firewall,因为所有内部网的用户通过代理服务器访问外界时,只映射为要给IP地址,所以外界不能直接访问到内部网。同时可以设计IP地址过滤,限制内部网对外部的访问权限。
  1. 代理分类,从上面可以看出,代理是一种技术,代理服务器就是实现这种技术的硬件。说到底,代理技术还是和通信打交道,产生了代理使用的协议。按照协议,我们分为HTTP代理、socks代理、POP3代理和SMTP代理等。根据技术,又新增了VPN代理和反向代理等。
  1. 反向代理服务器,普通的代理服务器被设计为,在接受客户端请求后,在internet上搜寻多个不确定的服务器,而不是针对某一个固定的服务器。这样,普通的代理服务器不支持外部对内部网络的访问请求。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式就叫做反向代理服务。链接反向代理
  1. 服务器,nginx作为服务器,怎么去理解?
  1. 服务器,server,服务器可以划分多种,但是他们的作用是相似的,而且硬件几乎一样的,不同的就是程序/技术了,所以我们常常直接说nginx作为服务器了,这个特指是技术而已。我们这里主要指的是web服务器,我们常用的是用个人电脑作为服务器,接收浏览器的请求访问,仅此而已! 个人电脑,硬件和服务器相似度很高,为什么我们在电脑上运行了niginx程序,便可以在浏览器中访问对应的文件呢?
  1. 个人电脑可以作为服务器,是因为二者的硬件几乎一样,都是可以计算的设备。安装了nginx之后,就可以在前面的基础上实现服务器功能了。
  2. 我们在.conf文件中设置各种选项,如server_name, listen等,都是为了设置服务器。服务器的作用就是监听某些端口,为其提供对应的服务/数据,而计算机/电脑本身的端口是多种的,能实现多种功能,我们这里借助nginx软件及设置来管理使用其他一部分端口。这就是nginx的作用。
  1. nginx反向代理、负载均衡和初步了解等等,链接强烈推荐 --五颗星。

nginx

nignx功能强大,我们仅仅是学习使用它建立web服务器,还有代理服务器。

基本原理学习

  1. 官方解释,nginx启动后生成master,master会启动conf数量的worker进程,当用户的请求进来,由不同的worker调起执行线程,非阻塞的执行要求。一句话以避之,master-worker多进程模式进行,单线程/非阻塞执行
  2. 进程管理-如何管理master启动,更换配置 conf文件后,master会生成新的worker,直到原有的worker全部任务结束kill之后。就是不更新,直接替换。
  3. 处理流程和模块。启动进程之后,请求在nginx内部是如何流转,nginx包含哪些模块
  1. worker处理过程,请求分配过来后,分析头部信息,再尽心一系列处理后,【log】日志产生,最后是【重定向】对应的请求重定向链接。其中处理过于复杂,以后再深入。
  1. 请求管理,通过自身的管理,线程池,异步事件驱动等来完成任务调度。
  2. 详细解释,见链接nginx原理 和nginx平台初始
  3. Kqueue与epoll机制 见链接Kqueue与epoll机制

基本操作

  1. window下,基本的操作。此系统下,下载官方安装包直接解压免安装使用,注意路径为非中文。
  1. start nginx在nginx.exe目录中个,打开CMD,键入start nginx即可(直接双击nginx.exe不提倡)。这个时候查看任务管理器,可以看到有两个nginx图标显示活动状态。多次执行start nginx就会启动多个进程
  2. nginx -s stop快速停止nginx;nginx -s quit保存信息后停止nginx
  3. nginx -s reload重新载入nginx
  4. nginx -s reopen 打开日志
  5. nginx -v查看version版本
  6. 见链接初识nginx 和nginx配置
  1. 配置文件,nginx配置的核心是定义要处理的URL以及如何响应这些URL请求, 即定义一些列的虚拟服务器(VS)来控制来自特定域名后者IP的请求的处理。每一台虚拟服务器定义了一些列的location控制处理特定的URI集合。每一个location定义了对映射到自己的请求的处理场景,可以返回一个文件或者代理此请求。config配置文件详解
  2. nginx由不同的模块组成,不同的模块实现不同的功能,这些模块由配置文件中指定的指令控制,指分为简单指令和块指令
  1. 一个简单指令包含指令名称和指令参数,以空格分隔,以分号结尾。
  2. 块指令,和简单指令类似,但是由大括号包围。若块指令大括号中包含其他指令,则称该指令为上下文。
  1. location 块指令。其作用定义了匹配原则,再去匹配请求的url,从而分配与请求URI对应的服务器路径文件。如果URI匹配多个location块(location块的先后顺序不代表执行的先后顺序),那么nginx采用的是最长前缀匹配原则。若是匹配不了,最后返回的就是404。代理服务器,proxy server,

配置文件详解

在nginx中,使用者的活动就是模块安装和配置文件的书写,配置文件是软件按照要求运行的保证。其中的指令是基本构成部分。

  1. server{ ... }指令中,包含:
  1. 其中的listen、server_name等简单指令为设置虚拟服务器参数
  1. listen命令监听本机(该服务器)IP和端口,支持IPv4、IPv6.标准格式如listen localhost:8080;常见的用listen 80;#监听本机所有IPlisten 127.0.0.1:800;#该IP地址叫做回送地址/本地机,localhost为其域名
  1. location{}块指令就是定义匹配规则,用来匹配URL请求
  2. root指令,定义了静态文件的根目录。我们在浏览器键入URL后,nginx会将其和我们location的规则进行匹配,匹配成功后,将在root指示的路径中查找需要的数据。也就是说,root命令就是指明了我们匹配location规则后,从哪里返回文件。
  3. windows路径问题,尽量都是以斜线/,转义符\.可能会出现问题。统一使用斜线。
...
 location /path/  {
     root /nginx-1.13.8/;
 }   
 ... 

 浏览器键入http://localhost:8000/path/path.jpg,nginx将uri和前缀字符进行比较(location /path/可以匹配任何以path开头的uti,
 找到上面的/path/,这时候,root指令/nignx-1.13.8/+/pah/组合了最终我们的路径了,于是,就在path文件夹中,返回我们需要的path.jpg数据。
 root配置错误后,将会出现两种错误。
 1.路径正确,但是没有相应具体数据文件,将返回404错误了。
 2.路径错误,出现forbidden错误。
 简单的说,root配置和location规则能定义出很多url(如/nginx-1.13.8/path/path.jpg,/nginx-1.13.8/path/example.html等等),
 nginx将浏览器的url将与之进行对比,匹配正确就返回数据,否则返回相应的错误。

学习的基本思路是:

  1. 了解主线程和多个工作线程的工作模式各自的作用
  2. 配置文件的设置和意义,重点就是配置URI以及如何相应请求
  3. 命令行操作服务器了
  4. 观察安装包中各个文件夹的内容和作用

ubuntu下安装配置nginx

windows下nginx的安装配置十分简单,主要问题就是模块安装和.conf文件的书写。ubuntu系统下,nginx安装配置比较麻烦。不单单是nginx的操作,其中linux操作也相当多。要充分了解linux系统文件的组成、权限赋予和基本命令操作。网上教程大多是先依赖包再安装nginx如链接1,因ubuntu版本为最新,自身已安装此类模块。

  1. apt-get install build-essential #安装编译依赖 为了能够编译ubuntu内核,提供一个build-essential软件包,其中安装有g++, gcc, make, dpkg-dev等依赖。是安装nginx的准备工作。亲测,可执行sudo apt-get update来更新所需要的模块等(使用的是ubuntu16,自带这些基本模块)
  2. sudo apt-get install nginx #即可 即可安装nginx,此时浏览器访问localhost即可看到相应的欢迎界面,表明安装成功并在本地运行。 ps -ef|grep nginx可以查看当年nginx进程情况。此时看到的是一个master process和两个worker process。
  3. sudo nginx #为正常启动nginx服务器。随后的sudo nginx -s stop/quit/reload同windows一样。(最好一开始就取得root权限)
  4. 修改配置文件,要注意的是,相比windows下的nginx.conf,ubuntu中的配置文件比较复杂。
  1. /etc/nginx/sites-available/default是默认配置文件,default文件定义了基本的参数,结合/var/www/html/index.nginx-debian.html就可以访问我们的欢迎界面了。修改端口及html文件,都会得到相应的结果。 查看本文最后的问题汇总,这里配置文件的选择还是挺麻烦的,涉及到linux软件文件多个位置问题。
  2. /etc/nginx/nginx.conf该文件看起来和windows中的nginx.conf很相似,其实有很多不同,个gedit打开,可以看出,其中并没有定义端口等信息。还是以default为准。
  3. 在实际操作中,权限问题比较麻烦,su root #接着输入密码取得在terminal的root权限,再chmod -R 777 var(文件夹)即可取得编辑、新增等权限。对于文件的临时编辑保存,可sudo gedit /var/www/html/index.html自行用gedit打开该文件,对其进行编辑等操作时,terminal会及时反馈信息。最后保存即可。
  4. 关于配置文件位置选择和如何配置

nginx, WSGI和Flask三者的关系?

  1. Flask,是一个用python语言编写的轻量级web应用框架,其有两个主要依赖-1.路由、web服务器网关接口子系统由werkug提供,2.jinja2提供模板系统。作为web应用框架,其作用就是方便开发者简单有效的开发web应用,而不用去关系底层实现代码,这些底层代码,比如请求的监听、响应的等等,都是框架实现了。回想学习flask时,我们也可以测试应用,类似服务器,这是因为flask自身有wsgi模块,仅仅做测试使用。生产模式下,还是需要借助服务器。
  2. WSGI,网络服务器网关接口,不是一个API,应该叫做一个协议。作用就是实现了web应用和web服务器之间的通信。从上面的flask我们可以看出,flask框架集中了WSGI,所以我们在flask编辑的web应用可以直接作为服务器访问使用。
  3. nginx,作为三大web服务器第二名,其作用就是接受请求,将请求传递给web应用处理,最后返回数据,这是最基本的作用。nginx有其独特之处,高并发、稳定、节省内存等等。
  4. 形象比如一下,从客户端发送一个http请求过来,分别经过web服务器层、WSGI层、web框架层。
  5. 扩展,uwsgi也是一种协议,uWSGI则是一个服务器(使用WSGI和uwsgi协议的服务器)。
  6. 详细的解释可以查看链接
最后以 Nginx,WSGI,Flask 之间的对话结束本文。 
 Nginx:Hey,WSGI,我刚收到了一个请求,我需要你作些准备,然后由Flask来处理这个请求。 
 WSGI:OK,Nginx。我会设置好环境变量,然后将这个请求传递给Flask处理。 #最简单的WSGI就是一个函数,为web应用做好准备工作。 
 Flask:Thanks WSGI!给我一些时间,我将会把请求的响应返回给你。 
 WSGI:Alright,那我等你。 
 Flask:Okay,我完成了,这里是请求的响应结果,请求把结果传递给Nginx。 
 WSGI:Good job!Nginx,这里是响应结果,已经按照要求给你传递回来了。 
 Nginx:Cool,我收到了,我把响应结果返回给客户端。大家合作愉快~

问题汇总

  1. 欢迎界面文件的来源,相似的有两个,默认为/var/www/html/index.nginx-debian.html,第二选择是/usr/share/nginx/html/index.html,亲测,修改配置文件,当前面文件不可使用时,会自动选择第二文件展现欢迎界面。
  2. 在windows中配置文件/config/nginx.conf,唯一且明确,但是ubuntu中有两个相似的配置文件,/etc/nginx/nginx.conf和/etc/nginx/sites-available/default。二者的作用不同。对于问题1,2可以查看链接,其中有如下说明。
  1. 这里说一下nginx的配置文件的读写顺序问题:nginx的配置文件是/etc/nginx/nginx.conf,这个配置文件中又引用了/etc/nginx/conf.d/和/etc/nginx/sites-enabled/这两个文件夹的配置文件,通过include来实现。所以,无论是直接在nginx.conf或者在conf.d、sites-enabled中配置都是可以的。
  1. nginx作为服务器,也是仅仅作为服务器,经过学习,大致知道其nginx的操作,就是用linux和nginx进行项目的部署等。其操作不是主要问题,目前告一段落。2/3/2018 10:24:59 PM