Nginx的概述和配置
目录- Nginx的概述和配置
一、Nginx概述
1、Nginx是什么
nginx是一种轻量级/高性能的反向代理web服务器,用于HTTP、HTTPS、SMTP、POP3和IMAP协议,他实现非常高效的反向代理、负载均衡,可以支持处理2-3万的并发连接数,官方检测能支持5万并发,目前在中国为主流的web服务器。
2、Nginx的特点:
优点:
-
一款高性能、轻量级web服务
-
稳定性高
-
系统资源消耗低高
-
对HTTP并发连接的处理能力
-
单台物理服务器可支持30000~50000个并发请求
缺点:
nginx有个不太友好的地方是,nginx不方便处理动态资源,可以进行动静分离,将动态请求交给后端程序去进行处理。
3、Nginx和Apache的区别
3.1 nginx相对于apache的优点∶
轻量级,同样起web服务,比apache占用更少的内存及资源
抗并发,nginx处理请求是异步非阻塞的,而apache是阻塞型的,在高并发下,nginx能保持低资源低消耗高性能
高度模块化的设计,编写模块相对简单
3.2 apache相对于nginx的优点∶
Rewrite比nginx的rewrite强大 (rewrite的主要功能就是实现统一资源定位符URL的跳转)
模块多,基本想到的都可以找到
少bug, nginx的bug相对较多
超稳定
总结:一般来说,需要性能的web服务,用nginx。 若不需要性能只求稳定,就选用apache
4、nginx的两种进程分别有什么作用
nginx有两种进程,master进程和worker进程
master进程:用于管理worker进程,读取nginx的配置文件信息
worker进程:处理连接请求
二、编译安装nginx
1、关闭防火墙
2、将所需的安装包放到/data下,并解压
3、安装依赖包
4、创建运行用户
5、编译安装nginx
6、修改权限以及其他设置
7、创建nginx自启动文件
8、重新加载配置
三、nginx的命令
命令 | 作用 |
---|---|
nginx -t | 检查语法 |
nginx -T | 检查语法并打印所有配置 |
nginx -v | 显示版本 |
nginx -V | 显示详细信息,包括编译的信息 |
nginx -c | 指定配置文件启动 |
nginx -s =kill | 发送信号 |
nginx -s reload =kill -1(HUP) | 重新加载配置文件 |
nginx -s stop =kill -9(KILL) | 立即停止 |
nginx -s quit =kill -3(QUIT) | 优雅的退出 |
nginx -s reopen =kill -USR1 | 重新生成日志文件 |
nginx -s USR2 | 飞行中升级 |
1 实验
1.1 nginx -t、nginx -T
1.2 nginx -v、nginx -V
1.3 nginx -s stop
四、nginx版本编译安装平滑升级的方式
五、配置详细解释
主配置文件:nginx.conf
子配置文件:include conf.d/*.conf
1 全局配置
1.1关闭版本
server_tokens on|off
1.2 修改启动的进程数
1.3 cpu与work进程绑定
CPU MASK: 00000001:0号CPU
00000010:1号CPU
................
10000000:7号CPU
worker_cpu_affinity 00000001 00000010 00000100 00001000;第0号---第3号CPU
#序号绑定cpu 亲缘性
worker_cpu_affinity 00000101 00001010;
#同一个work 可以绑定 两个cpu可以这么写 但是不建议,本来就是 不希望飘动,这样也是飘动
验证cpu乱跑可以刷新网页即可
while true ;do ab -c 1000 -n 1000 http://192.168.91.100/;done
1.4 nginx进程的优先级
进程优先级是越小优先级越高
1.5 调试work进程打开的文件的个数
2、http设置
http {
...
... #各server的公共配置
server { #每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器
...
}
server {
...
server_name #虚拟主机名
root #主目录
alias #路径别名
location [OPERATOR] URL { #指定URL的特性
...
if CONDITION {
...
}
}
}
}
2.1 mime
此项为支持的 文件格式,如果不支持的格式 会自动帮你下载,如果支持 就会显示在网页上
2.2 server下的root
2.3 alias别名
2.4 location匹配
location
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,按一定的优化级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求
2.4.1 语法规则
符号 | 规则匹配 |
---|---|
= | 精确匹配 |
^~ | 表示包含正则表达式,并且匹配以指定的正则表达式开头 |
~ | 包含正则表达式,并且区分大小写 |
~* | 表示包含正则表达式,并且不区分大写 |
不带符号 | 匹配起始于此uri的所有的uri |
2.4.2 优先级
2.4.3 实例
2.4.3.1 精确匹配=
2.4.3.2 匹配以指定的正则表达式开头^~
2.4.3.3 表示包含正则表达式,并且不区分大写
2.4.3.4 不带符号
2.5 验证模块
需要安装httpd-tools服务包
3、高级配置
3.1 网页的状态页
Active connections:
#当前处于活动状态的客户端连接数,包括连接等待空闲连接数=reading+writing+waiting
accepts:
#统计总值,Nginx自启动后已经接受的客户端请求的总数。
handled:
#统计总值,Nginx自启动后已经处理完成的客户端请求总数,通常等于accepts,除非有因worker_connections限制等被拒绝的连接
requests:
#统计总值,Nginx自启动后客户端发来的总的请求数。
Reading:
#当前状态,正在读取客户端请求报文首部的连接的连接数,数值越大,说明排队现象严重,性能不足
Writing:
#当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大
Waiting:
#当前状态,正在等待客户端发出请求的空闲连接数,开启 keep-alive的情况下,这个值等于active – (reading+writing)
3.2 echo模块
3.3 变量
3.3.1 常用的内置变量
内置变量 | 作用 |
---|---|
$remote_addr | 存放了客户端的地址,客户端的公网IP |
$proxy_add_x_forwarded_for | 此变量表示将客户端IP追加请求报文中X-Forwarded-For首部字段,多个IP之间用逗号分隔,如果请求中没有X-Forwarded-For,就使用$remote_addrthe |
$args | 变量中存放了URL中的参数,例如:http://www.lisi.org/main/index.do?id=2012222&partner=search 返回结果为: id=20190221&partner=search 存放的就是这个 |
$document_root | 保存了针对当前资源的请求的系统根目录,例如:/apps/nginx/html |
$document_uri; | 保存了当前请求中不包含参数的URI,注意是不包含请求的指令,比 如:http://www.kgc.org/main/index.do?id=20190221&partner=search会被定义为/main/index.do #返回结果为:/main/index.do |
$host | 存放了请求的host名称 |
$http_user_agent | 客户端浏览器的详细信息 |
$http_cookie; | 客户端的cookie信息 |
$request_filename; | 当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,如:/apps/nginx/html/main/index.html |
$scheme; | 请求的协议,例如:http,https,ftp等 |
范例:
3.3.2 自定义变量
语法格式:
Syntax: set $variable value;
Default: —
Context: server, location, if
范例:
3.4 https功能
Web网站的登录页面都是使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
nginx 的https 功能基于模块ngx_http_ssl_module实现,因此如果是编译安装的nginx要使用参数ngx_http_ssl_module开启ssl功能,但是作为nginx的核心功能,yum安装的nginx默认就是开启的,编译安装的nginx需要指定编译参数--with-http_ssl_module开启
https参数
ssl on | off;
#为指定的虚拟主机配置是否启用ssl功能,此功能在1.15.0废弃,使用listen [ssl]替代
listen 443 ssl;
ssl_certificate /path/to/file;
#指向包含当前虚拟主机和CA的两个证书信息的文件,一般是crt文件
ssl_certificate_key /path/to/file;
#当前虚拟主机使用的私钥文件,一般是key文件
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
#支持ssl协议版本,早期为ssl现在是TLS,默认为后三个
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
#配置ssl缓存
off: #关闭缓存
none: #通知客户端支持ssl session cache,但实际不支持
builtin[:size]:#使用OpenSSL内建缓存,为每worker进程私有
[shared:name:size]:#在各worker之间使用一个共享的缓存,需要定义一个缓存名称和缓存空间大小,一兆可以存储4000个会话信息,多个虚拟主机可以使用相同的缓存名称
ssl_session_timeout time;
#客户端连接可以复用ssl session cache中缓存的有效时长,默认5m
实例:
生成自证书
3.5 自定义图标
avicon.ico 文件是浏览器收藏网址时显示的图标,当客户端使用浏览器问页面时,浏览器会自己主动发起请求获取页面的favicon.ico文件,但是当浏览器请求的favicon.ico文件不存在时,服务器会记录404日志,而且浏览器也会显示404报错
【定制小图标】
wget www.baidu.com/favicon.ico
放到主目录就可以了
不生效可以重新打开浏览器
4、重写功能 rewrite
4.1 if指令
语法:
if (条件匹配) {
action
}
使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下符号链接:
= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false
实例:
4.2 return
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置
语法格式:
return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号
return code url; #返回给客户端的URL地址
实例
4.3 set指令
指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key value,value可以是text, variables和两者的组合。
请看上面的自定义变量
4.4 break指令
用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的 ngx_http_rewrite_module 模块中指令就不再执行,Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和locationif块中使用
注意: 如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module 模块的指令,其它指令还会执行
4.5 rewrite
语法格式:
rewrite可以配置在 server、location、if
语法格式 :
rewrite regex replacement(www.baidu.com) [flag];
正则匹配原始访问url 替代你想让客户访问的 标志()premanent301 redirect302 break last
正则表达格式:
. #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字 [0-9]
\b #匹配单词的开始或结束
^ #匹配字付串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
(n) #匹配重复n次
{n,} #匹配重复n次或更多次
{n,m} #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
{n,m}? #匹配重复n到m次,但尽可能少重复
{n,}? #匹配重复n次以上,但尽可能少重复
\W #匹配任意不是字母,数字,下划线,汉字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非数字的字符
\B #匹配不是单词开头或结束的位置
[^x] #匹配除了x以外的任意字符
[^kgc] #匹配除了kgc 这几个字母以外的任意字符
flag说明
redirect;302
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
permanent;301 www.bj.com www.beijing.com
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301
break; www.bj.com
#重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用
#适用于一个URL一次重写
last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户301
5、防盗链
5.1在7-2上配置
5.2 在7-1上配置
5.3 结果展示
6、反向代理
6.1、反向代理原理
6.2 反向代理的概念
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。
反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。
6.3 反向代理的优势
- 隐藏真实服务器;
- 负载均衡便于横向扩充后端动态服务;
- 动静分离,提升系统健壮性;
6.4 Nginx四层反向代理和七层反向代理
四层反向代理:是基于IP+PORT(TCP/UDP端口)转发
七层反向代理:基于http,https,mail代理转发
6.5 反向代理配置参数
参数 | 作用 |
---|---|
proxy_pass | 用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式 也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持 |
proxy_hide_header on | off; | 用于nginx作为反向代理的时候,在返回给客户端http响应时,隐藏后端服务器相应头部的信息,可以设置在http,server或location块 |
proxy_pass_request_body on |off; | 是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块,默认即为开启 |
proxy_pass_request_headers on | off; | 是否将客户端的请求头部转发给后端服务器,可以设置在http,server或location块,默认即为开启 |
6.6 反向代理单台web服务器
6.6.1 7-1上的配置
6.6.2 7-2上的配置
6.6.3 结果
6.6.4 加/和不加/的区别
6.6.4.1 不加/
7-1的配置
7-2的配置
6.6.4.2 加了/
另一案例
6.7 502和504错误
502
当后台服务器死掉或者停掉就会出现此错误
504
默认在1分钟内后端服务器无法响应(比如:iptables -AINPUT -s nginx_ip -j DROP),会显示下面的504超时提示
7、LNMP架构
7.1、编译安装nginx
7.2、yum安装mysql
7.3 php
1、安装环境依赖包
yum -y install gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel
2、编译安装
cd /opt
tar jxvf php-7.1.10.tar.bz2
cd php-7.1.10
./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip
make && make install