Nginx简单入门教学,包学包会,让你不再依赖伪大神!
这篇教程简单介绍了 nginx 并且讲解了一些 nginx 可以解决的简单任务。这里,我们假设 nginx 已经安装在读者的机器上。如果没有,可以看一下如何安装 nginx。这篇教程主要讲解的是如果启用和停止ngixn,和重新加载配置,描述配置文件的基本结构和怎样搭建一个 nginx 静态辅助器,怎样配置 nginx 作为一个代理服务器来。
nginx 有一个主进程和其他子进程。主进程的主要工作是加载和执行配置文件,并且驻留子进程。子进程用来作为实际的请求处理。nginx 采取基于事件的模型和 OS 依赖的机制,在多个子进程之间高效的分配请求。子进程的个数会直接写在配置文件中并且,对于给定的配置可以是固定的,或者根据可用的 CPU 核数自动的进行调整(参考 子进程)。
nginx 和它模块的工作方式是在配置文件中写好的。默认情况下,这个配置文件通常命名为 nginx.conf
并且会放置在 /usr/local/nginx/conf
,/etc/nginx
,或者 /usr/local/etc/nginx
。
启用,停止和重载配置
运行可执行文件就可以开启 nginx,比如:
// -c 为 nginx 的配置文件
nginx -c /usr/local/nginx/conf/nginx.conf
如果,nginx 已经开启,那么它就可以通过使用 -s
参数的可执行命令控制。使用下列格式:
nginx -s signal
signal 可以为下列命令之一:
- stop — 直接关闭 nginx
- quit — 会在处理完当前正在的请求后退出,也叫优雅关闭
- reload — 重新加载配置文件,相当于重启
- reopen — 重新打开日志文件
比如,等待当前子进程处理完正在执行的请求后,结束 nginx 进程,可以使用下列命令:nginx -s quit
执行该命令的用户需要和启动的 nginx 的用户一致。
如果重载配置文件的命令没有传递给 nginx 或者 nginx 没有重启,那么配置文件的改动是不会被使用的。重载配置文件的命令可以使用:nginx -s reload
一旦主进程接收到重载配置文件的命令后,它会先检查配置文件语法的合法性,如果没有错误,则会重新加载配置文件。如果成功,则主进程会重新创建一个子进程并且发送关闭请求给以前的子进程。如果没有成功,主进程会回滚改动并且继续使用以前的配置。老的子进程在接受关闭的命令后,会停止接受新的请求并且继续处理当前的请求,直到处理完毕。之后,该子进程就直接退出了。
在 Unix 工具的帮助下,比如使用 kill 工具,该信号会被发送给 nginx 进程。在这种情况下,信号会被直接发送给带有进程 ID 的进程。nginx 的主进程的进程 ID 是写死在 nginx.pid 文件中的。该文件通常放在/usr/local/nginx/logs
或者/var/run
目录下。比如,如果主进程的 ID 是 1628,为了发送QUIT
信号来使 nginx 优雅退出,可以执行:
kill -s QUIT 1628
为了得到所有正在运行的 nginx 进程,我们可能会使用到 ps 工具,比如,像下列的方式:
$ ps -ax | grep nginx
// 结果为:(下面是单核 CPU 的情况)
516 pts/0 D+ 0:00 grep --color=auto nginx
1156 ? S 1:22 nginx: worker process
27999 ? Ss 0:00 nginx: master process ./nginx
更多关于发送信号给 nginx,可以参考 nginx 控制。
配置文件结构
nginx 是由一些模块组成,我们一般在配置文件中使用一些具体的指令来控制它们。指令被分为简单指令和块级命令。一个简单的指令是由名字和参数组成,中间用空格分开,并以分号结尾。例如:
// 简单指令
root /data/www;
块级指令和简单指令一样有着类似的结构,但是末尾不是分号而是用 {
和 }
大括号包裹的额外指令集。如果一个块级指令的大括号里有其他指令,则它被叫做一个上下文(比如:events,http,server,和 location)。
在配置文件中,没有放在任何上下文中的指令都是处在主上下文中。events
和 http
的指令是放在主上下文中,server
放在 http
中, location
放在 server
中。
以 #
开头的行,会被当做注释。
# this is a comment
events {
worker_connections 4096; ## Default: 1024
}
http {
server {
listen 80;
server_name domain1.com www.domain1.com;
access_log logs/domain1.access.log main;
root html;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:1025;
}
}
}
静态服务器
一个重要的网络服务器的任务是处理文件(比如图片或者静态 HTML 文件)。这里,你会实践一个例子,文件会从不同的目录中映射(取决于请求):/data/www
(放置 HTML 文件)和 /data/images
(放置图片)。这需要配置一下文件,将带有两个 location
的指令的 server
的块级命令放在 server
指令中。
首先,创建一个 /data/www
目录,然后放置一个事先写好内容的 index.html 文件。接着,创建一个 /data/images
目录,然后放置一些图片。
下一步,打开配置文件。默认的配置文件已经包含了一些关于 server
指令的样式,大多数情况下直接把他们给注释掉。现在,注释掉其他的区块,然后写一个新的 server
区块:
http {
server {
}
}
通常,该配置文件可能会包含多个 server
指令。这些 server
指令监听不同的端口和服务器名。一旦 nginx 决定哪个服务进程处理请求,它会根据在 server 块级指令中定义好的 location
指令的参数,来匹配请求头中指定的 URI。
将下列 location 指令添加到 server 指令中:
location / {
root /data/www;
}
该 location
指令相对于请求中的 URI 执行了 “/” 的前缀。为了匹配请求,URI 会被添加到 root
命令指定的路径后,即 /data/www
,得到本地文件系统中请求文件的路径。如果,有几个 location
匹配到,那么 nginx 会选择最长的前缀。上面的 location
提供了长度为 1 的前缀,所以,仅当其他的 location
匹配失败后,该指令才会使用。
接着,添加第二个 location
区块:
location /images/ {
root /data;
}
它会匹配到以 /images/
开头的请求(location /
也会匹配到该请求,只是前缀更短)server
块级命令的配置结果如下:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
这已经是一个可用的服务器配置,它监听标准的 80 端口并且可以在本地上通过 http://localhost/
访问。对于 URI 以 /images/
开头的请求,服务器会从 /data/images
目录中,返回对应的文件。例如,nginx 会返回 /data/images/example.png
文件,当接收到 http://localhost/images/example.png
的请求响应时。如果该文件不存在,nginx 会返回一个 404 错误的响应。没有以 /images/
开头的 URI 的请求,将会直接映射到 /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 实例中。
首先,通过在 nginx 配置文件中添加另一个 server
区块,来定义一个被代理的服务器,像下面的配置:
server {
listen 8080;
root /data/up1;
location / {
}
}
上面就是一个简单的服务器,它监听在 8080 端口(之前,listen
并没被定义,是因为默认监听的 80 端口)并且会映射所有的请求给 本地文件目录 /data/up1
。创建该目录,然后添加 index.html
文件。注意,root
指令是放在 server
上下文中。当响应请求的 location
区块中,没有自己的 root
指令,上述的 root
指令才会被使用。
接着,使用前面章节中的 server
配置,然后将它改为一个代理服务配置。在第一个 location
区块中,放置已经添加被代理服务器的协议,名字和端口等参数的 proxy_pass 指令(在这里,就是 http://localhost:8080
):
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我们将修改第二个 location
区块,使他返回一些典型后缀的图片文件请求,现在它只会映射带有 /images/
前缀的请求到 /data/images
目录下。修改后的 location
指令如下:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
该参数是一个正则表达式,它会匹配所有以 .gif
,.jpg
或者 .png
结尾的 URIs。一个正则表达式需要以 ~
开头。匹配到的请求会被映射到 /data/images
目录下。
当 nginx 在选择 location
去响应一个请求时,它会先检测带有前缀的 location
指令,记住先是检测带有最长前缀的 location
,然后检测正则表达式。如果有一个正则的匹配的规则,nginx 会选择该 location
,否则,会选择之前缓存的规则。
最终,一个代理服务器的配置结果如下:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
该服务器会选择以 .gif
,.jpg
,或者 .png
结束的请求并且映射到 /data/images
目录(通过添加 URI 给 root 指令的参数),接着将其他所有的请求映射到上述被代理的服务器。
为了使用新的配置,像前几个章节描述的一样,需要向 nginx 发送重载信号。
这还有很多其他的指令,可以用于进一步配置代理连接。
本文转载自腾云阁,已获得作者授权。
Nginx简单入门教学,包学包会,让你不再依赖伪大神!的更多相关文章
- 一篇文章带你了解轻量级Web服务器——Nginx简单入门
一篇文章带你了解轻量级Web服务器--Nginx简单入门 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件代理服务器 在本篇中我们会简单介绍Nginx的特点,安装,相关指令使用以及配置信 ...
- maven 简单入门教学实战手册
Maven那点事儿(Eclipse版) 前言: 由于最近工作学习,总是能碰到Maven的源码.虽然平时工作并不使用Maven,但是为了学习一些源码,还是必须要了解下.这篇文章不是一个全面的Mave ...
- 小白老凯,初出茅庐!请多关照!简单分享一些 mysql 数据库的安装操作!请给为大神雅正!
在我们写代码,存储数据时常常会用到各种数据库,如:mysql.access.sql.server.Oracle等等,在这里就说一下mysql数据库的的操作指令! 首先我们了解下如何安装mysql数据库 ...
- 简单利用jQuery加tomcat,让前端开发不再依赖于后端的接口
前端开发的过程中,我们免不了和后端进行联调,这时候就会出现以下的尴尬场景: 接口没写好,没法做接下来的功能 功能写好了,接口没写好,没法测这个功能 联调了,除了BUG,不知道锅在谁身上,只得陪后端耗时 ...
- Wireshark入门与进阶---数据包捕获与保存的最基本流程
Wireshark入门与进阶系列(一) "君子生非异也.善假于物也"---荀子 本文由CSDN-蚍蜉撼青松 [主页:http://blog.csdn.net/howeverpf]原 ...
- SSIS实践入门2:批量包的调度和SQLServer代理作业配置
趁着上一篇文章的余温,我们继续研究一下SSIS中多个包如何调度,难道需要一个包一个包的配置调度程序吗?显然不是的,接下来我们就说一说在SSIS应用中如何批量的调度所有的作业,本文只讲述一个基本的逻辑过 ...
- 基于 electron 实现简单易用的抓包、mock 工具
背景 经常我们要去看一些页面所发出的请求时,经常会用到 Charles 做为抓包工具来进行接口抓取,但一方面市面是很多抓包工具都是收费或者无法二次开发的.当前我们团队大多数用的也都是 Charles, ...
- Nginx 小入门记录 之 初识Nginx和环境准备(一)
前置知识准备: 如果还不知道服务器是干什么的,只是刚踏入程序员之路的,大家还是先学习基础,虽然以下文档很简单,但至少知道为什么要学: 一般服务器环境现在基本上都是放在Linux系统上了,如果对Linu ...
- Nginx快速入门菜鸟笔记
Nginx快速入门-菜鸟笔记 1.编译安装nginx 编译安装nginx 必须先安装pcre库. (1)uname -a 确定环境 Linux localhost.localdomain 2.6. ...
随机推荐
- 循环插入一条数据的sql写法
DECLARE @i INTSET @i = 1WHILE @i > 0 BEGIN DECLARE @TransportFormMstID BIGINT; DECLARE @TradeOrde ...
- Flume-NG启动过程源码分析(三)(原创)
上一篇文章分析了Flume如何加载配置文件的,动态加载也只是重复运行getConfiguration(). 本篇分析加载配置文件后各个组件是如何运行的? 加载完配置文件订阅者Application类会 ...
- Centos 查看版本
# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)
- 实时监测contenteditable(可编辑文档)的内容发生改变
如果是文本框用onchange,oninput,onpropertychange都可以实时监控值发生变化,但是div设置了属性contenteditable(可编辑文档)就不管用了. 最简单的方法用o ...
- js的深拷贝特别注意this的深拷贝
原生的,jquery的extend,和angular的copy 我们深拷贝的根本原因是为了不改变原来对象的值. <script type="text/javascript"& ...
- Lucene.Net 优化索引生成,即搜索显示优化
最近发现站内搜索引擎响应速度很慢,因为刚来公司之前技术员跑了源码什么的都没留下.只好自己手动破解源代码dll查找问题所在! 这个问题代码就暂时不贴了这里只写思路 原逻辑:经过整体分析后发现之前是使用 ...
- 常用的CDN 链接 http://cdn.code.baidu.com/ http://www.bootcdn.cn/
http://cdn.code.baidu.com/ http://developer.baidu.com/wiki/index.php?title=docs/cplat/libs ★新浪CDN,感觉 ...
- c++中对齐方式
使用cout<<setiosflags(ios::right)以后, 再调用 cout<<setiosflags(ios::left);无效的, 你可以在调用之前加上一句 co ...
- this license has been cancelled
是因为IDEA注册码的问题, 解决方案: 修改此路径的hosts文件:C:\Windows\System32\drivers\etc\hosts 在其最后一行加入:“0.0.0.0 account.j ...
- Git_学习_01_ git 安装与配置
参考:windows下Git BASH安装 二.参考资料 1. windows下Git BASH安装