这篇手册简单介绍了nginx,并提供了一些可以操作的简单的工作。前提是nginx已经被安装到你的服务器上。如果没有安装,请阅读上篇:nginx 学习笔记(1) nginx安装。这篇手册主要内容:1. 如何启动和停止nginx,如何加载nginx配置;

2.配置文件的结构;3.如何安装nginx来做静态内容的服务器;4,如何配置nginx作为代理服务器;5:如何连接FastCGI应用。

nginx有一个主进程和多个工作进程。主进程的作用是读和验证配置文件,启动工作进程。工作进程正在处理请求。nginx应用事件驱动模型和os依赖机制来在工作进程之间有效的分发请求(负载均衡)。工作进程的数目定义在配置文件中,在一个特定的配置中一般是固定的或者可以根据可用的cpu 内核来动态修改这个数量。工作进程参考:http://nginx.org/en/docs/ngx_core_module.html#worker_processes

nginx及其模块如何工作取决于配置文件的定义。默认情况下,配置文件为:nginx.confand 目录为/usr/local/nginx/conf/etc/nginx, 或者/usr/local/etc/nginx.

启动、停止、重新加载ngnix配置文件

启动nginx,直接执行可运行文件即可。一旦nginx启动完成,可以通过可运行参数s来控制nginx的运行。

语法如下:

nginx -s signal

signal可选项

  • stop — 快速停止
  • quit — 完整停止
  • reload —重新加载
  • reopen — 重新打开日志文件

例如,停止nginx但等待工作进程处理完成当前的请求,可以使用下面的命令:

nginx -s quit

注意:这个命令的执行者必须是和启动nginx的是同一个用户。

直接修改配置文件将不会立即生效,需要重启nginx或者向nginx发送reload配置文件命令:

nginx -s reload

当主进程收到重新加载配置的信号后,它先检测新配置的语法是否规范,然后开始尝试加载新的配置。如果上面的步骤成功,主进程开始启动新的工作进程并且发停止信号给旧的工作进程;否则,主进程回滚到改变前的配置,并继续使用旧的配置工作。旧的工作进程接受到停止工作信号,它停止接受新的连接请求,但继续处理当前的请求知道这些请求被处理完成。最后,旧的工作进程退出。

nginx进程也可以通过unix工具进行处理,例如kill命令。unix工具可以通过进程ID作为参数来进行处理。默认情况下,nginx主进程的id写入/usr/local/nginx/logs或者/var/run文件中。例如,如果主进程的id是1628,发送quit信号将会使nginx完整退出,命令如下;

kill -s Quit 1628

同样,也可以功过ps命令来获取nginx运行的所有进程列表,例如下面的方法:

ps -ax | grep nginx

想获取更多nginx信号的信息,请参考下一篇:nginx控制。

配置文件的结构

ngnix的配置包含了许多模块,每个模块使用指令来运行。指令包含简单指令和块指令。简单指令通过空格来分离名称和参数,使用分号(;)作为结尾;块指令和简单指令有相同的结构,但不是以分号结尾而是以大括号({})包含指令。如果一个块指令中大括号内含有其它指令,那么括号内的叫做上下文(例如:事件、http、服务器、位置)。

在配置文件中,不在任何上下文的指令被认为存在于主上下文。事件和http指令就存在于主上下文中,server在http上下文中,位置在server上下文中。

配置文件使用#号作为注释符号。

为静态文件提供服务

一个web服务器的重要工作就是为静态文件服务。例如,你想根据请求的不同,去不同目录去请求服务:/data/www存放html文件,/data/images存放图片信息。这就需要修改配置文件,建立一个服务器块,在这个http块中建立服务器块,服务器块内再建立两个不同的位置块。

首先,创建/data/www目录并把一个包含任意内容的index.html文件放入该目录;创建/data/images目录,放置一些图片。

然后,打开配置文件。默认配置文件中已经包含了一些server块的实例,大部分被注释掉了。现在注释掉所有的类似块,新写一个server块:

http {
server {
}
}

通常,配置文件可能会包含几个server块,server通常指定名称和监控端口。当nginx决定哪个server进程处理请求时,它测试uri请求报文头而不是定义在server块中的位置指令的参数。

增加下面的位置块到服务器块中:

location / {
root /data/www;
}

位置包括中定义的“/”前缀和请求uri进行比较。如果和uri中请求匹配,uri将增加root指令的路径到uri中,亦即到本地文件系统的路径/data/www下去响应请求。如果有多个位置块匹配,nginx选择最长后缀的那个。以上的位置块提供了最短的前缀(长度为1),因此当只有所有别的位置块都不能提供匹配时,这个模块才能使用到。

接下来,增加第二个位置块:

location /images/ {
root /data;
}

它将匹配以/images/开头的请求(位置“/”也匹配这些request,但它的前缀更短)。

上述完整的配置如下:

server {
location / {
root /data/www;
} location /images/ {
root /data;
}
}

上述已经是一个可以运行的服务器的配置了,该服务器监听http标准端口80,可以通过htt://localhost/来访问本地机器。如果请求以/images/开头,那么该服务器将从目录/data/images/下获取文件来应答请求。例如:请求http://localhost/images/example.png发送后,nginx将发送/data/images/example.png文件应答请求。如果该文件不存在,nginx将发送404返回。不是以/images/开头的请求将会被映射到/data/www目录下。例如:对于请求http://localhost/some/example.html请求,nginx将会发送/data/www/some/example.html文件来应答。

为使新的配置生效,如果nginx没有启动,则启动,如果启动则发送重新加载信号到nginx主进程,执行:

nginx -s reload

若配置没有生效或者没有达到期望效果,可以通过目录/usr/local/nginx/logs或者/var/log/nginx下的access.log和error.log来查找原因。

建一个简单的代理服务器

nginx另一个频繁使用的特性是作为一个简单的代理服务器,代理服务器意思就是接受请求,并发送这些请求到被代理的服务器,从代理的服务器得到响应信息,然后发送给客户端。

下面介绍配置一个简单的代理服务器的例子,这个代理服务器提供从本地机器获取图片请求,然后发送到别的其它的被代理服务器。在这个例子中,所有的服务器都定义在一个单独nginx实例。

首先,定义被代理服务器,这可以通过在配置文件中增加一个或者多个服务器块,具体内容如下:

server {
listen 8080;
root /data/up1; location / {
}
}

这个简单的服务器监听端口8080(上个例子中没有使用listen是因为使用http标准端口80),映射所有的请求到本地文件系统的/data/up1目录,创建此目录并放置index.html文件到该目录。注意root指令被放置到服务器上下文。当选择提供服务的位置块不包含自己的root指令时该root指令将被使用。

接下来,使用上篇服务器的配置并修改,使之成为一个代理服务器的配置。在第一个位置块中,在第一行的参数中添加proxy_pass指令加代理服务器的协议、名称、端口。(在我们的例子中是http://localhost:8080):

server {
location / {
proxy_pass http://localhost:8080;
} location /images/ {
root /data;
}
}

我们将修改第二个位置块的配置,以前是映射/image/前缀的请求到/data/images/目录下的文件,为了和典型图片的文件扩展名相匹配,修改的位置块配置文件如下:

location ~ \.(gif|jpg|png)$ {
root /data/images;
}

这个参数是一个正则表达式,它匹配以.gif,.jpg或者.png结尾的url。一个正则表达式应该以~开头。响应的请求将被映射到/data/images目录。

当nginx选择一个位置块为请求提供服务时,它首先检测指定带前缀的位置指令,别忘记优先选择最长前缀的,再检测正则表达式。如果和一个正则表达式匹配,nginx选择这个位置块,否则选择最初的那个。

完整的代理服务器配置如下:

server {
location / {
proxy_pass http://localhost:8080/;
} location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}

这个服务器将过滤以以.gif,.jpg或者.png结尾的请求,然后映射到目录/data/images 下(通过增加url到root指令参数),转发其它请求到配置的被代理服务器中。

更多用来配置代理连接的指令可以参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html

建立FashCGI代理

nginx可以用来追踪到FastCGI 服务器上的请求,FastCGI服务器可以运行不同框架不同编程语言(例如php)构建的应用程序。

适用FastCGI服务器运行的nginx最基本配置包括:使用fastcgi_pass指令而非proxy_pass;fastcgi_param指令设置发送参数到Fastcgi服务器。假定可以通过http://localhost:9000来访问FastCGI服务器。使用上章的代理服务器配置,替换proxy_pass指令为fastcgi_pass指令并改变参数到localhost:9000.对于PHP,SCRIPT_FILENAME参数用来决定脚本名称,QUERY_STRING参数用来传送请求参数,完整配置如下:

server {
location / {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
} location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}

这将建立一个服务器,该服务器追踪到被代理的服务器的所有请求(静态图片除外),这个服务器使用FastCGI协议通过localhost:9000来操作。

nginx 学习笔记(2) nginx新手入门的更多相关文章

  1. nginx 学习笔记(1) nginx安装

    1.nginx安装 根据操作系统的不同,nginx的安装方式也不相同. 1.1 对linux系统来说,nginx.org提供了nginx安装包.http://nginx.org/en/linux_pa ...

  2. Nginx学习笔记六Nginx的模块开发

    1.Nginx配置文件主要组成:main(全局配置)这部分的指令将影响其他所有部分.server(虚拟主机配置)这部分指令主要用于指定虚拟主机域名,IP和端口.upstream(主要为反向代理,负载均 ...

  3. 七、Nginx学习笔记七Nginx的Web缓存服务

    user www; worker_processes 1; error_log /usr/local/nginx/logs/error.log crit; pid /usr/local/nginx/l ...

  4. nginx学习笔记(7)Nginx如何处理一个请求---转载

    如何防止处理未定义主机名的请求基于域名和IP混合的虚拟主机一个简单PHP站点配置 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口 ...

  5. nginx 学习笔记(5) nginx调试日志

    为启动一个调试日志,nginx需要在构建时配置城支持调试模式. ./configure --with-debug ... 而且调试级别应该使用err_log指令来设置: err_log /path/t ...

  6. nginx 学习笔记(3) nginx管理

    nginx可以通过向其发送信号来进行管理.默认情况下主进程的进程ID写到文件/usr/local/nginx/logs/nginx.pid中.当然也可以在配置文件中自定义该pid文件,自定义使用pid ...

  7. nginx 学习笔记(6) nginx配置文件中的度量单位

    容量大小可以用比特(byte),千比特(kilobyte,后缀k或者K)或者兆(megabytes,后缀m或者M),例如:“1024”,“8k”,“1m”. 时间间隔可以用毫秒(millisecond ...

  8. Nginx学习笔记4 源码分析

    Nginx学习笔记(四) 源码分析 源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_ ...

  9. Nginx学习笔记~目录索引

    回到占占推荐博客索引 前几天整理了<Docker的学习笔记索引>,受到了很多朋友的关注,今天把Nginx的文章也整理一下,以后将永久更新,像大叔之前的<EF文章系列>,< ...

随机推荐

  1. qt中多线程用法总结

    1.多线程的理解 在操作系统中线程和进程划分. 操作系统可以同时执行多个任务,每个任务就是进程:进程可以同时执行多个任务,每个任务就是线程. 线程之间相互独立,抢占式执行.对于单核CPU来说同一时刻只 ...

  2. C#treeView控件单击事件选中节点滞后问题解决方法

    问题描述:在treeView的Click事件中,选中的节点SelectedNode并不是您刚才点击的节点,总是上一次选中的节点,节点选中滞后的问题. 解决方案:在treeView的MouseDown事 ...

  3. NetCore入门篇:(七)Net Core项目使用Controller之二

    一.简介 1.说明Post,Get定义的区别. 2.说明如何路由定义. 二.Get.Post定义 1.api不定义访问方式时,同时支持get 和 post.如果定义某种方式,则仅支持某种方式.具体看代 ...

  4. winform NPOI excel 导出并选择保存文件路径

    public void ExcelOp(DataGridView gdv,ArrayList selHead) { if (selHead.Count==0) { MessageBox.Show(&q ...

  5. 程序媛计划——SQLite初级

    数据库简介 数据库定义: 指的是以一定方式储存在一起.能为多个用户共享.具有尽可能小的冗余度.与应用程序彼此独立的数据集合.是带有相关数据的表的集合. 数据库是由行和列组成的二维表. 字段: 数据库表 ...

  6. TCP BBR - 一键安装最新内核并开启 TCP BBR

    原文地址: https://teddysun.com/489.html 最近,Google 开源了其 TCP BBR 拥塞控制算法,并提交到了 Linux 内核,从 4.9 开始,Linux 内核已经 ...

  7. Redux其实很简单(原理篇)

    在这一篇文章中,笔者将带大家编写一个完整的Redux,深度剖析Redux的方方面面,读完本篇文章后,大家对Redux会有一个深刻的认识. 核心API 这套代码是笔者阅读完Redux源码,理解其设计思路 ...

  8. 914. X of a Kind in a Deck of Cards

    In a deck of cards, each card has an integer written on it. Return true if and only if you can choos ...

  9. Django 项目 实现重定向并进行反向解析

    一.项目路由配置urls.py中 from django.conf.urls import include, url from django.contrib import admin # 匹配应用 u ...

  10. Python网络通信

    day26 网络通信 参考: http://www.cnblogs.com/yuanchenqi/articles/5692716.html 男生是client端,字条是socket(sk),通过sk ...