nginx初涉

最近研究python,发现ES6的很多“新特性”在python上都能找到参照:iterable的概念、generator函数、解构赋值等,但部分地方ES又没实现得很彻底。。按照目前趋势,在处理业务这个角度上,JS这门语言以后使用起来会变得越发方便。

python的学习告一段落,回到前端。

作为一个高性能的http和反向代理服务器,nginx还是要了解下。

优势:稳定,丰富的功能集(得益于其模块化设计),占用内存少,配置简单。并发量大的时候其性能优势才得以体现。

处理:错误页、缓存、反向代理、负载均衡等。

架构:nginx有一个主进程(main proccess)管理着若干个工作进程(worker proccess)。启动nginx的进程作为主进程,也即监控进程,它可以fork()出子进程充当工作进程。主进程自己充当进程组与用户交互的接口,不负责业务处理、网络事件等,只通过管理工作进程实现配置文件的实时生效、代理服务的重启、替换工作日志等。实际处理各种请求和事务的是工作进程,而工作进程的数目可在配置文件中设置,一般为服务器CPU核数。另外,nginx采用事件驱动模型和依赖于操作系统的机制以提高工作效率:比如在linux上nginx采用epoll事件模型,而在OpenBSD或FreeBSD上采用类似的kqueue事件模型。

在生产实践中,除了几个常用命令,我们只需要设置nginx.conf配置文件即可。  

一:安装

由于自己用的是苹果电脑,下面是在mac上的安装,Linux安装参考这里

用homebrew安装即可:

brew install nginx

安装完后:配置文件在:

/usr/local/etc/nginx/nginx.conf

启动niginx:

sudo nginx

停止服务:

sudo nginx -s stop

二:配置文件的结构

    nginx的配置文件实际上就是一组指令(Directives)的集合。这里所谓指令:就是键值对,如果值由多个对象构成,则这些对象间用空格隔开。

   指令分简单指令(simple direactives)和块指令(block direactive):块指令的值是一组指令,由{}括起来。

#user  nobody;        //#开头的是注释
worker_processes  1;   //这是简单指令(simple direactive),以";"结尾

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {             //这是块指令(block direactives),以"{}"括起来
    worker_connections  1024;
}

http {              //这是块指令(block direactives)
    include       mime.types;
    default_type  application/octet-stream;
}

nginx使用哪些功能模块、这些模块怎么设置,都在这个配置文件的指令里设置。
 

使用最基本的功能时,配置文件要修改的是两个地方:端口号及我们web项目的路径。

1.将nginx.conf配置文件里,listen  8080 改为我们常用的80。

 server {
listen       8080;
server_name  localhost;

#access_log  logs/host.access.log  main;

location / {
    root   html;
    index  index.html index.htm;
}

2.用homebrew安装nginx时,html folder默认位置为:

/usr/local/Cellar/nginx/1.2.3/html    //1.2.3为nginx版本号

这个html文件夹即nginx.conf里location/{root html} 的html。此时我们要将root的值改为我们项目的路径,比如:

location / {
    root   /Users/vicky/Documents/Web;
    index  index.html index.htm;
}

三:基础命令

nginx及其模块的运行取决于其配置文件,nginx启动后,我们可以通过下边的基础命令对其进行操纵:

nginx -s signal

signal的值可以为:

stop:快速关闭

quit:平滑关闭,让工作进程完成现有任务后再关闭

reload:修改后重载配置文件,这个命令估计是最常用的。。。。

reopen:重新打开日志文件

四:如何架设静态资源服务器?

nginx设置静态资源非常简单,假设我们的web项目打包后放在/data/www,另有图片资源文件夹/data/images。现在修改nginx.conf文件,将http:{server:{}}部分的指令修改:

http:{
  server:{              //这里server的语义就是一个静态资源服务器
    location / {
        root /data/www;
    }
    location /images/ {
        root /data;
    }
  }
}

nginx启动后,当一个请求过来时,nginx会根据请求的url与location字段后的路径前缀(这里是"/"或"/images/")进行匹配,先和"/images/"匹配,如果没有"/images/",再和"/"匹配。

比如请求的url为"http://localhost/images/example.png",url的文件路径有"/images/",就以/data为根目录,寻找/data下的images文件夹的example.png文件发送给客户端,没有的话默认返回404。

而如果请求的url路径没有"/images/",即不匹配第二个location,就会匹配第一个location。比如"http://localhost/some/example.html",nginx会以/data/www为根目录,寻找/data/www/some/example.html文件。

五.如何架设反向代理服务器?

nginx另一个最常用的功能是作为代理服务器,将请求传给本地某个服务器,接收服务器的响应并返回给客户端。

在nginx官方的Beginner's Guide中举了个案例,建立一个代理服务器,将所有非图片资源的请求转发给8080端口。

第一步,给http块指令里添加一个新的server:

server {    //这个server的语义是一个本地服务器,所有请求以/data/up1为查询根目录
    listen 8080;
    root /data/up1;   //如果locaton里没有指定root指令,一律以/data/up1为根目录
    location / {
    }
}

此时共有两个sever,现在我们对静态资源server块指令作出修改如下:

server {    //这个server的语义是一个反向代理服务器,非图片资源的请求都转发给http://localhost,端口号为8080
    location / {
        proxy_pass http://localhost:8080/;
    }
    location ~ \.(gif|jpg|png)$ {        //这里用正则作为location的匹配依据,注意正则前要加~符号及空格
        root /data/images;
    }
}

可见,无论作为静态资源服务器还是反向代理,nginx的做法是对uri字符串进行模式匹配从而决定接下来的操作。

六.配合nodejs

  其实无论配合什么服务器使用,nginx这边只要在nginx.conf中添加代理服务器的server指令就好了。比如我们已经在本地开启了两个服务器,一个是用的3000端口:

server{
  listen 80;
  server_name www.vainus.xyz;
  location / {
    proxy_pass http://localhost:3000/;
  }
  location ~ \.(jpg|png|gif)$ {
    root /data/images;
  }
}

另一个是3001端口:

server{
  listen 80;
  server_name blog.vainus.xyz;
  location / {
    proxy_pass http://localhost:3001/;
  }
  location ~ \.(jpg|png|gif)$ {
    root /data/images;
  }
}

当我们输入这两个网址的uri时,nginx会将非图片资源的请求送到localhost3000或3001。注意,此时需要在host文件中将域名映射为本地IP,即127.0.0.1。在生产中,则往往是在路由器设置DNS,最终是一个公网ip的80端口映射到企业内部的多个程序接口。

nginx的配置文件可以弄的很复杂,今天先到这里。

PS:慕课网上有个教程提到centOS上安装nginx:

由于centos自带软件源是没有nginx的,可以:

yum install  epel-release
#弹出提醒时敲y

yum install nginx
#弹出提醒时再敲y即可

#默认配置文件目录:
cd /etc/nginx
vim nginx.conf

参考:

Installing Nginx in Mac OS X Maverick With Homebrew

nginx源码分析--master和worker进程模型

Beginner’s Guide

nginx中修改server_name无效,修改为www.test.com无法访问,通过localhost可以访问

猜你喜欢

转载自blog.csdn.net/weixin_36094484/article/details/80909222