Nginx 入门教程
Last updated
Last updated
Nginx 是一款面向性能设计的 HTTP 服务器,能反向代理 HTTP,HTTPS 和邮件相关(SMTP,POP3,IMAP)的协议链接。并且提供了负载均衡以及 HTTP 缓存。它的设计充分使用异步事件模型,削减上下文调度的开销,提高服务器并发能力。采用了模块化设计,提供了丰富模块的第三方模块。
所以关于 Nginx,有这些标签:「异步」「事件」「模块化」「高性能」「高并发」「反向代理」「负载均衡」
Linux系统:Centos 7 x64
Nginx版本:1.11.5
prce(重定向支持)和openssl(https支持,如果不需要https可以不安装。)
CentOS 6.5 我安装的时候是选择的“基本服务器”,默认这两个包都没安装全,所以这两个都运行安装即可。
然后进入目录编译安装,configure参数说明
安装报错误的话比如:“C compiler cc is not found”,这个就是缺少编译环境,安装一下就可以了 yum -y install gcc make gcc-c++ openssl-devel
如果没有error信息,就可以执行下边的安装了:
运行下面命令会出现两个结果,一般情况nginx会安装在/usr/local/nginx
目录中
将下面内容添加到 ~/.bash_profile
文件中
运行命令 source ~/.bash_profile
让配置立即生效。你就可以全局运行 nginx
命令了。
Mac OSX 安装特别简单,首先你需要安装 Brew, 通过 brew
快速安装 nginx
。
注意默认端口不是 8080
查看确认端口是否被占用。
开机自启动方法一:
编辑 vi /lib/systemd/system/nginx.service 文件,没有创建一个 touch nginx.service 然后将如下内容根据具体情况进行修改后,添加到nginx.service文件中:
[Unit]
:服务的说明
Description
:描述服务
After
:描述服务类别
[Service]
服务运行参数的设置
Type=forking
是后台运行的形式
ExecStart
为服务的具体运行命令
ExecReload
为重启命令
ExecStop
为停止命令
PrivateTmp=True
表示给服务分配独立的临时空间
注意:[Service]
的启动、重启、停止命令全部要求使用绝对路径。
[Install]
运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
。
保存退出。
设置开机启动,使配置生效:
注:*代表某个服务的名字,如http的服务名为httpd
开机自启动方法二:
如果开机后发现自启动脚本没有执行,你要去确认一下rc.local这个文件的访问权限是否是可执行的,因为rc.local默认是不可执行的。修改rc.local访问权限,增加可执行权限:
官方脚本 ed Hat NGINX Init Script。
关闭防火墙,或者添加防火墙规则就可以测试了
或者编辑配置文件:
添加这样一条开放80端口的规则后保存:
重启服务即可:
在CentOS 7或RHEL 7或Fedora中防火墙由 firewalld 来管理,当然你可以还原传统的管理方式。或则使用新的命令进行管理。 假如采用传统请执行一下命令:
如果通过yum安装,使用下面命令安装。
编译安装,删除/usr/local/nginx目录即可 如果配置了自启动脚本,也需要删除。
在Centos 默认配置文件在 /usr/local/nginx-1.5.1/conf/nginx.conf 我们要在这里配置一些文件。nginx.conf是主配置文件,由若干个部分组成,每个大括号{}
表示一个部分。每一行指令都由分号结束;
,标志着一行的结束。
例如请求:http://localhost:3000/test1/test2/test.php
$host:localhost $server_port:3000 $request_uri:/test1/test2/test.php $document_uri:/test1/test2/test.php $document_root:/var/www/html $request_filename:/var/www/html/test1/test2/test.php
例如,"8k","1m" 代表字节数计量。 例如,"1h 30m","1y 6M"。代表 "1小时 30分","1年零6个月"。
nginx 的配置系统由一个主配置文件和其他一些辅助的配置文件构成。这些配置文件均是纯文本文件,全部位于 nginx 安装目录下的 conf 目录下。
指令由 nginx 的各个模块提供,不同的模块会提供不同的指令来实现配置。 指令除了 Key-Value 的形式,还有作用域指令。
nginx.conf 中的配置信息,根据其逻辑上的意义,对它们进行了分类,也就是分成了多个作用域,或者称之为配置指令上下文。不同的作用域含有一个或者多个配置项。
下面的这些上下文指令是用的比较多:
例如我们再 nginx.conf 里面引用两个配置 vhost/example.com.conf 和 vhost/gitlab.com.conf 它们都被放在一个我自己新建的目录 vhost 下面。nginx.conf 配置如下:
简单的配置: example.com.conf
Nginx提供了许多预定义的变量,也可以通过使用set来设置变量。你可以在if中使用预定义变量,也可以将它们传递给代理服务器。以下是一些常见的预定义变量,更多详见
反向代理是一个Web服务器,它接受客户端的连接请求,然后将请求转发给上游服务器,并将从服务器得到的结果返回给连接的客户端。下面简单的反向代理的例子:
复杂的配置: gitlab.com.conf。
代理到上游服务器的配置中,最重要的是proxy_pass指令。以下是代理模块中的一些常用指令:
upstream指令启用一个新的配置区段,在该区段定义一组上游服务器。这些服务器可能被设置不同的权重,也可能出于对服务器进行维护,标记为down。
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
负载均衡:
upstream模块能够使用3种负载均衡算法:轮询、IP哈希、最少连接数。
轮询: 默认情况下使用轮询算法,不需要配置指令来激活它,它是基于在队列中谁是下一个的原理确保访问均匀地分布到每个上游服务器; IP哈希: 通过ip_hash指令来激活,Nginx通过IPv4地址的前3个字节或者整个IPv6地址作为哈希键来实现,同一个IP地址总是能被映射到同一个上游服务器; 最少连接数: 通过least_conn指令来激活,该算法通过选择一个活跃数最少的上游服务器进行连接。如果上游服务器处理能力不同,可以通过给server配置weight权重来说明,该算法将考虑到不同服务器的加权最少连接数。
RR
简单配置 ,这里我配置了2台服务器,当然实际上是一台,只是端口不一样而已,而8081的服务器是不存在的,也就是说访问不到,但是我们访问 http://localhost
的时候,也不会有问题,会默认跳转到http://localhost:8080
具体是因为Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,由于Nginx默认是RR策略,所以我们不需要其他更多的设置
负载均衡的核心代码为
权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如
那么10次一般只会有1次会访问到8081,而有9次会访问到8080
ip_hash
上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
fair
这是个第三方模块,按后端服务器的响应时间来分配请求,响应时间短的优先分配。
url_hash
这是个第三方模块,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用
server指令可选参数:
weight:设置一个服务器的访问权重,数值越高,收到的请求也越多;
fail_timeout:在这个指定的时间内服务器必须提供响应,如果在这个时间内没有收到响应,那么服务器将会被标记为down状态;
max_fails:设置在fail_timeout时间之内尝试对一个服务器连接的最大次数,如果超过这个次数,那么服务器将会被标记为down;
down:标记一个服务器不再接受任何请求;
backup:一旦其他服务器宕机,那么有该标记的机器将会接收请求。
keepalive指令:
Nginx服务器将会为每一个worker进行保持同上游服务器的连接。
在nginx的配置文件nginx.conf
中加入如下配置,可以放到http, server, location, limit_except语句块,需要注意相对路径,本例当中nginx.conf
,blocksip.conf
在同一个目录中。
在blockip.conf里面输入内容,如:
permanent
永久性重定向。请求日志中的状态码为301
redirect
临时重定向。请求日志中的状态码为302
允许浏览器基本上永久地缓存静态内容。 Nginx将为您设置Expires和Cache-Control头信息。
如果要求浏览器永远不会缓存响应(例如用于跟踪请求),请使用-1。
使用ngxtop
实时解析nginx访问日志,并且将处理结果输出到终端,功能类似于系统命令top。所有示例都读取nginx配置文件的访问日志位置和格式。如果要指定访问日志文件和/或日志格式,请使用-f和-a选项。
注意:在nginx配置中/usr/local/nginx/conf/nginx.conf
日志文件必须是绝对路径。
在工作中,有时候会遇到一些接口不支持跨域,这时候可以简单的添加add_headers来支持cors跨域。配置如下:
上面更改头信息,还有一种,使用 rewrite 指令重定向URI来解决跨域问题。
通过 nginx -V
来查看是否有 with-http_stub_status_module
该模块。
nginx -V
这里V
是大写的,如果是小写的v
即nginx -v
,则不会出现有哪些模块,只会出现nginx
的版本
通过 http://127.0.0.1/nginx_status 访问出现下面结果。
主动连接(第 1 行)
当前与http建立的连接数,包括等待的客户端连接:3
服务器接受处理的请求(第 2~3 行)
接受的客户端连接总数目:7 处理的客户端连接总数目:7 客户端总的请求数目:5
读取其它信(第 4 行)
当前,nginx读请求连接 当前,nginx写响应返回给客户端 目前有多少空闲客户端请求连接
超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定。HTTPS连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输。HTTPS不应与在RFC 2660中定义的安全超文本传输协议(S-HTTP)相混。HTTPS 目前已经是所有注重隐私和安全的网站的首选,随着技术的不断发展,HTTPS 网站已不再是大型网站的专利,所有普通的个人站长和博客均可以自己动手搭建一个安全的加密的网站。
创建SSL证书,如果你购买的证书,就可以直接下载
创建自签证书
查看目前nginx编译选项
输出下面内容
如果依赖的模块不存在,可以进入安装目录,输入下面命令重新编译安装。
运行完成之后还需要make
(不用make install)
HTTPS server
纯静态-html 支持
根据 User-Agent
过滤请求,通过一个简单的正则表达式,就可以过滤不符合要求的爬虫请求(初级爬虫)。
~*
表示不区分大小写的正则匹配
alias指定的目录是准确的,root是指定目录的上级目录,并且该上级目录要含有location指定名称的同名目录。
nginx rewrite规则如下:
解决办法,fastcgi_param HTTPS $https if_not_empty
添加这条规则,
Nginx Office Hours 一个 nginx 模块,允许您仅在办公时间内提供访问访问网站。
参数
说明
--prefix=<path>
Nginx安装路径。如果没有指定,默认为 /usr/local/nginx。
--sbin-path=<path>
Nginx可执行文件安装路径。只能安装时指定,如果没有指定,默认为<prefix>
/sbin/nginx。
--conf-path=<path>
在没有给定-c选项下默认的nginx.conf的路径。如果没有指定,默认为<prefix>
/conf/nginx.conf。
--pid-path=<path>
在nginx.conf中没有指定pid指令的情况下,默认的nginx.pid的路径。如果没有指定,默认为 <prefix>
/logs/nginx.pid。
--lock-path=<path>
nginx.lock文件的路径。
--error-log-path=<path>
在nginx.conf中没有指定error_log指令的情况下,默认的错误日志的路径。如果没有指定,默认为 <prefix>
/- logs/error.log。
--http-log-path=<path>
在nginx.conf中没有指定access_log指令的情况下,默认的访问日志的路径。如果没有指定,默认为 <prefix>
/- logs/access.log。
--user=<user>
在nginx.conf中没有指定user指令的情况下,默认的nginx使用的用户。如果没有指定,默认为 nobody。
--group=<group>
在nginx.conf中没有指定user指令的情况下,默认的nginx使用的组。如果没有指定,默认为 nobody。
--builddir=DIR
指定编译的目录
--with-rtsig_module
启用 rtsig 模块
--with-select_module --without-select_module
允许或不允许开启SELECT模式,如果 configure 没有找到更合适的模式,比如:kqueue(sun os),epoll (linux kenel 2.6+), rtsig(- 实时信号)或者/dev/poll(一种类似select的模式,底层实现与SELECT基本相 同,都是采用轮训方法) SELECT模式将是默认安装模式
--with-poll_module --without-poll_module
Whether or not to enable the poll module. This module is enabled by, default if a more suitable method such as kqueue, epoll, rtsig or /dev/poll is not discovered by configure.
--with-http_ssl_module
Enable ngx_http_ssl_module. Enables SSL support and the ability to handle HTTPS requests. Requires OpenSSL. On Debian, this is libssl-dev. 开启HTTP SSL模块,使NGINX可以支持HTTPS请求。这个模块需要已经安装了OPENSSL,在DEBIAN上是libssl
--with-http_realip_module
启用 ngx_http_realip_module
--with-http_addition_module
启用 ngx_http_addition_module
--with-http_sub_module
启用 ngx_http_sub_module
--with-http_dav_module
启用 ngx_http_dav_module
--with-http_flv_module
启用 ngx_http_flv_module
--with-http_stub_status_module
启用 "server status" 页
--without-http_charset_module
禁用 ngx_http_charset_module
--without-http_gzip_module
禁用 ngx_http_gzip_module. 如果启用,需要 zlib 。
--without-http_ssi_module
禁用 ngx_http_ssi_module
--without-http_userid_module
禁用 ngx_http_userid_module
--without-http_access_module
禁用 ngx_http_access_module
--without-http_auth_basic_module
禁用 ngx_http_auth_basic_module
--without-http_autoindex_module
禁用 ngx_http_autoindex_module
--without-http_geo_module
禁用 ngx_http_geo_module
--without-http_map_module
禁用 ngx_http_map_module
--without-http_referer_module
禁用 ngx_http_referer_module
--without-http_rewrite_module
禁用 ngx_http_rewrite_module. 如果启用需要 PCRE 。
--without-http_proxy_module
禁用 ngx_http_proxy_module
--without-http_fastcgi_module
禁用 ngx_http_fastcgi_module
--without-http_memcached_module
禁用 ngx_http_memcached_module
--without-http_limit_zone_module
禁用 ngx_http_limit_zone_module
--without-http_empty_gif_module
禁用 ngx_http_empty_gif_module
--without-http_browser_module
禁用 ngx_http_browser_module
--without-http_upstream_ip_hash_module
禁用 ngx_http_upstream_ip_hash_module
--with-http_perl_module
启用 ngx_http_perl_module
--with-perl_modules_path=PATH
指定 perl 模块的路径
--with-perl=PATH
指定 perl 执行文件的路径
--http-log-path=PATH
Set path to the http access log
--http-client-body-temp-path=PATH
Set path to the http client request body temporary files
--http-proxy-temp-path=PATH
Set path to the http proxy temporary files
--http-fastcgi-temp-path=PATH
Set path to the http fastcgi temporary files
--without-http
禁用 HTTP server
--with-mail
启用 IMAP4/POP3/SMTP 代理模块
--with-mail_ssl_module
启用 ngx_mail_ssl_module
--with-cc=PATH
指定 C 编译器的路径
--with-cpp=PATH
指定 C 预处理器的路径
--with-cc-opt=OPTIONS
Additional parameters which will be added to the variable CFLAGS. With the use of the system library PCRE in FreeBSD, it is necessary to indicate --with-cc-opt="-I /usr/local/include". If we are using select() and it is necessary to increase the number of file descriptors, then this also can be assigned here: --with-cc-opt="-D FD_SETSIZE=2048".
--with-ld-opt=OPTIONS
Additional parameters passed to the linker. With the use of the system library PCRE in - FreeBSD, it is necessary to indicate --with-ld-opt="-L /usr/local/lib".
--with-cpu-opt=CPU
为特定的 CPU 编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
--without-pcre
禁止 PCRE 库的使用。同时也会禁止 HTTP rewrite 模块。在 "location" 配置指令中的正则表达式也需要 PCRE 。
--with-pcre=DIR
指定 PCRE 库的源代码的路径。
--with-pcre-opt=OPTIONS
Set additional options for PCRE building.
--with-md5=DIR
Set path to md5 library sources.
--with-md5-opt=OPTIONS
Set additional options for md5 building.
--with-md5-asm
Use md5 assembler sources.
--with-sha1=DIR
Set path to sha1 library sources.
--with-sha1-opt=OPTIONS
Set additional options for sha1 building.
--with-sha1-asm
Use sha1 assembler sources.
--with-zlib=DIR
Set path to zlib library sources.
--with-zlib-opt=OPTIONS
Set additional options for zlib building.
--with-zlib-asm=CPU
Use zlib assembler sources optimized for specified CPU, valid values are: pentium, pentiumpro
--with-openssl=DIR
Set path to OpenSSL library sources
--with-openssl-opt=OPTIONS
Set additional options for OpenSSL building
--with-debug
启用调试日志
--add-module=PATH
Add in a third-party module found in directory PATH
正则
说明
正则
说明
.
匹配除换行符以外的任意字符
$
匹配字符串的结束
?
重复0次或1次
{n}
重复n次
+
重复1次或更多次
{n,}
重复n次或更多次
*
重复0次或更多次
[c]
匹配单个字符c
\d
匹配数字
[a-z]
匹配a-z小写字母的任意一个
^
匹配字符串的开始
-
-
变量
说明
变量
说明
$args
这个变量等于请求行中的参数,同$query_string
$remote_port
客户端的端口。
$content_length
请求头中的Content-length字段。
$remote_user
已经经过Auth Basic Module验证的用户名。
$content_type
请求头中的Content-Type字段。
$request_filename
当前请求的文件路径,由root或alias指令与URI请求生成。
$document_root
当前请求在root指令中指定的值。
$scheme
HTTP方法(如http,https)。
$host
请求主机头字段,否则为服务器名称。
$server_protocol
请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$http_user_agent
客户端agent信息
$server_addr
服务器地址,在完成一次系统调用后可以确定这个值。
$http_cookie
客户端cookie信息
$server_name
服务器名称。
$limit_rate
这个变量可以限制连接速率。
$server_port
请求到达服务器的端口号。
$request_method
客户端请求的动作,通常为GET或POST。
$request_uri
包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz。
$remote_addr
客户端的IP地址。
$uri
不带请求参数的当前URI,$uri不包含主机名,如/foo/bar.html。
$document_uri
与$uri相同。
-
-
符号
说明
符号
说明
符号
说明
k,K
千字节
m,M
兆字节
ms
毫秒
s
秒
m
分钟
h
小时
d
日
w
周
M
一个月, 30天
Directive
Description
Contains Directive
main
nginx 在运行时与具体业务功能(比如 http 服务或者 email 服务代理)无关的一些参数,比如工作进程数,运行的身份等。
user, worker_processes, error_log, events, http, mail
http
与提供 http 服务相关的一些配置参数。例如:是否使用 keepalive 啊,是否使用 gzip 进行压缩等。
server
server
http 服务上支持若干虚拟主机。每个虚拟主机一个对应的 server 配置项,配置项里面包含该虚拟主机相关的配置。在提供 mail 服务的代理时,也可以建立若干 server. 每个 server 通过监听的地址来区分。
listen, server_name, access_log, location, protocol, proxy, smtp_auth, xclient
location
http 服务中,某些特定的 URL 对应的一系列配置项。
index, root
实现 email 相关的 SMTP/IMAP/POP3 代理时,共享的一些配置项(因为可能实现多个代理,工作在多个监听地址上)。
server, http, imap_capabilities
include
以便增强配置文件的可读性,使得部分配置文件可以重新使用。
-
valid_referers
用来校验Http请求头Referer是否有效。
-
try_files
用在server部分,不过最常见的还是用在location部分,它会按照给定的参数顺序进行尝试,第一个被匹配到的将会被使用。
-
if
当在location块中使用if指令,在某些情况下它并不按照预期运行,一般来说避免使用if指令。
-
变量名称
值
$args_name
在请求中的name参数
$args
所有请求参数
$query_string
$args的别名
$content_length
请求头Content-Length的值
$content_type
请求头Content-Type的值
$host
如果当前有Host,则为请求头Host的值;如果没有这个头,那么该值等于匹配该请求的server_name的值
$remote_addr
客户端的IP地址
$request
完整的请求,从客户端收到,包括Http请求方法、URI、Http协议、头、请求体
$request_uri
完整请求的URI,从客户端来的请求,包括参数
$scheme
当前请求的协议
$uri
当前请求的标准化URI
指令
说明
proxy_connect_timeout
Nginx从接受请求至连接到上游服务器的最长等待时间
proxy_send_timeout
后端服务器数据回传时间(代理发送超时)
proxy_read_timeout
连接成功后,后端服务器响应时间(代理接收超时)
proxy_cookie_domain
替代从上游服务器来的Set-Cookie头的domain属性
proxy_cookie_path
替代从上游服务器来的Set-Cookie头的path属性
proxy_buffer_size
设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers
proxy_buffers缓冲区,网页平均在多少k以下
proxy_set_header
重写发送到上游服务器头的内容,也可以通过将某个头部的值设置为空字符串,而不发送某个头部的方法实现
proxy_ignore_headers
这个指令禁止处理来自代理服务器的应答。
proxy_intercept_errors
使nginx阻止HTTP应答代码为400或者更高的应答。