ngnix详解以及LNMP的搭建
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ngnix详解以及LNMP的搭建相关的知识,希望对你有一定的参考价值。
一、nginx 介绍
1.1 特性:
低内存消耗:10000 个keep-alive 连接模式下的非活动连接,仅需要2.5M 内存
event-driven,aio,mmap,sendfile
FastCGI(lnmp),uWSGI(python) 等协议
1.2 nginx 架构
1.3 nginx 高度模块化
但其模块早期不支持DSO 机制;1.9.11版本支持动态装载和卸载
1.4 nginx 的功用
html,图片,js ,css ,txt 等静态资源
结合FastCGI/uWSGI/SCGI 等协议反向代理动态资源请求
二、nginx 目录结构和命令
2.1 nginx 命令
-c filename 指定配置文件(default: /etc/nginx/nginx.conf)
-s signal 发送信号给master 进程,signal 可为:
stop, quit,reopen, reload 示例:-s stop 停止nginx -s reload 加载配置文件
2.2 配置文件的组成部分:
fastcgi,uwsgi ,scgi 等协议相关的配置文件
三、nginx 主配置文件的介绍和设置
3.1 Main 全局配置段常见的配置指令分类
3.1.1 介绍
3.1.2 一些设置
user nginx; //nginx运行时是以谁的身份开启的子进程
worker_processes auto; //进程数,auto是自动和CPU核数相对应
worker_priority number; //指定worker 进程的nice 值,设定worker 进程优先级:[-19,19]
error_log /var/log/nginx/error.log info; //错误日志的路径和级别
pid /var/run/nginx.pid; //指定存储nginx 主进程PID 的文件路径
include file //指明包含进来的其它配置文件片断
worker_connections 30000; //每个worker 进程所能够打开的最大并发连接数数量,默认是1024,一般都不够,调大
use epoll; //指明并发连接请求的处理方法, 默认自动选择最优方法
accept_mutex on/off; //前台|后台运行
3.2 http 协议段的相关配置
3.3 与套接字相关的配置
(2)listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
backlog=number 超过并发连接数后,新请求进入后援队列的长度
server_name *.magedu.com www.magedu.*
server_name ~^www\\d+\\.magedu\\.com$
④ 正则表达式 : 如: ~^.*\\.magedu\\.com$ ,因为消耗cpu运算
(4)tcp_nodelay on | off; 在长连接的情况下,是否延迟
在keepalived 模式下的连接是否启用TCP_NODELAY 选项
是否启用sendfile 功能,在内核中封装报文直接发送,默认Off
(6)server_tokens on | off | build | string
3.4 定义路径相关的配置
设置web 资源的路径映射;用于指明请求的URL 所对应的文档的主目录路径,可用于http, server, location, if in location
http://www.magedu.com/images/logo.jpg --> /data/www/vhosts/images/logo.jpg
注意:root 不仅可以用在server段,还可用于http、server、location、if in locatin
(8)location [ = | ~ | ~* | ^~ ] uri { ... } 主要控制URL路径
在一个server 中location 配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix 会根据用户请求的URI 来检查定义的所有location ,并找出一个最佳匹配,而后应用其配置
http://www.magedu.com/images/logo.jpg --> /data/imgs/images/logo.jpg
http://www.magedu.com/index.html 不匹配
^~ :对URI 的最左边部分做匹配检查,不区分字符大 小写
路径别名,文档映射的另一种机制;仅能用于location 上下文
http://www.magedu.com/bbs/index.php
} --> /web/forum/bbs/index.html
注意:location 中使用root 指令和alias 指令的意义不同
(a) root ,给定的路径对应于location 中的/uri/左 侧的/
(b) alias ,给定的路径对应于location 中的/uri/右 侧的/,完全置换
指定默认网页资源,注意:ngx_http_index_module 模块
(11)error_page code ... [=[response]] uri; 错误页面
可用位置:http, server, location, if in location
error_page 404 =200 /404.html 错误状态码改为200,还是原来的错误页面
按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI 的指向。最后一个参数是回退URI 且必须存在,否则会出现内部500 错误
try_files $uri /images/default.gif;
try_files $uri $uri/index.html $uri.html =404;
3.5 定义客户端请求的相关配置
(13)keepalive_timeout timeout [header_timeout];
(14)keepalive_requests number;
(15)keepalive_disable none | browser ... 略,没有那么老版本的浏览器
向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长,而非整个响应过程的传输时长
(17)client_body_buffer_size size; 缓存,hash值,取32位的后1位,2位,2位做几级目录
用于接收每个客户端请求报文、上传的body 部分的缓冲区大小;默认为16k ;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置
(18)client_body_temp_path path [level1 [level2 [level3]]];
client_body_temp_path /var/tmp/client_body 1 2 2
1 1 级目录占1 位16进 进 制,即2^4=16录 个目录 0-f
2 2 级目录占2 位16 进制 ,即2^8=256录 个目录 00-ff
2 3级 级 目录占2 位16进 进 制,即 即2^8=256个 个录 目录 00-ff
3.6 对客户端进行限制的相关配置
限制响应给客户端的传输速率,单位是bytes/second,默认值0表示不限速
(20)limit_except method ... { ... } ,仅用于location,限制客户端使用除了指定的请求方法之外的其它方法
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND, PROPPATCH, LOCK, UNLOCK, PATCH
} 除了GET 和HEAD 之外 其它方法 仅允许192.168.1.0/24网段主机
3.7文件操作优化的配置
(21)aio on | off | threads[=pool]; 是否启用aio 异步io功能,异步写磁盘
(22)directio size | off; 是否同步(直接)写磁盘,而非写缓存,在Linux 主机启用O_DIRECT 标记, 则文件大于等于给定大小时使用,例如directio 4m
open_file_cache max=N [inactive=time];
max=N :可缓存的缓存项上限;达到上限后会使用LRU (最近最少使用)算法实现管理
inactive=time :缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses 指令所指定的次数的缓存项,即为非活动项 , 将被删除
(24)open_file_cache_errors on | off;
(25)open_file_cache_min_uses number;
open_file_cache 指令的inactive 参数指定的时长内,至少被命中此处指定的次数方可被归类为活动 项,默认值为1
(26)open_file_cache_valid time;
四、重要常用的配置
4.1 权限控制
ngx_http_access_module 模块 ,实现基于ip 的访问控制功能
① allow address | CIDR | unix: | all;
② deny address | CIDR | unix: | all;
http, server, location, limit_except 段,都能使用
4.2 身份验证
ngx_http_auth_basic_module 模块,实现基于用户的访问控制,使用basic 机制进行用户认证
auth_basic "Admin Area"; "提示字"
auth_basic_user_file /etc/nginx/.ngxpasswd;
① 明文文本:格式name:password:comment
② 加密文本:由htpasswd 命令实现,httpd-tools 包所提供
4.3 状态信息页面
ngx_http_stub_status_module 模块,用于输出nginx 的基本状态信息
server accepts handled requests
16630948 16630948 31070465 三个数字分别对应accepts,handled,requests 三个值
Reading: 6 Writing: 179 Waiting: 106
Active connections: 当前状态,活动状态的连接数
Reading :当前状态,正在读取客户端请求报文首部的连接的连接数
Writing :当前状态,正在向客户端发送响应报文过程中的连接数
Waiting:当前状态,正在等待客户端发出请求的空闲连接数
4.4 日志的设置
ngx_http_log_module 模块,指定日志格式记录请求
① log_format name string ...; 定义日志格式
string 可以使用nginx 核心模块及其它模块内嵌的变量
② access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; 调用日志
log_format compression ‘$remote_addr-$remote_user [$time_local] ‘
‘"$request" $status $bytes_sent ‘
‘"$http_referer" "$http_user_agent" "$gzip_ratio"‘;
access_log /spool/logs/nginx-access.log compression buffer=32k;
③ 略:open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
min_uses :在inactive 指定的时长内访问大于等于此值方
4.5 压缩
ngx_http_gzip_module 用gzip 方法压缩响应数据,节约带宽,默认没有设置开启
⑤ gzip_http_version 1.0 | 1.1;
支持实现压缩功能时缓冲区数量及每个缓存区的大小,默认:324k 或 168k
查看nginx的mime类型:cat /etc/nginx/mime.types
如果启用压缩,是否在响应报文首部插入"Vary: Accept-Encoding"
⑨ gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
nginx:对于代理服务器请求的响应报文,在何种条件下启用压缩功能
expired,no-cache, no-store ,private :对代理服务器请求的响应报文首部Cache-Control 值任何一个,启用压缩功能
gzip_types text/xml text/css application/javascript;
4.6 ssl 加密的实现
为指定虚拟机启用HTTPS protocol,建议用listen 指令代替
4 、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
5 、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
builtin[:size] :使用OpenSSL 内建缓存,为每worker 进程私有
[shared:name:size] :在各worker 之间使用一个共享的缓存
客户端连接可以复用ssl session cache 中缓存的ssl 参数的有效时长,默认5m
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:sslcache:20m;
4.7 地址重写
The ngx_http_rewrite_module module is used to change request URI using PCRE regular expressions,return redirects, and conditionally select configurations.
将用户请求的URI 基于PCRE regex 所描述的模式进行检查,而后完成重定向替换
http://www.magedu.com/hn --> http://www.magedu.com/henan
http://www.magedu.com --> https://www.magedu.com/
(1)rewrite regex replacement [flag]
将用户请求的URI 基于regex 所描述的模式进行检查,匹配到时将其替换为replacement 指定的新的URI
注意:如果在同一级配置块中存在多个rewrite 规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查
隐含有循环机制, 但不超过10 次;如果超过,提示500响应码,[flag] 所表示的标志位用于控制此循环机制
如果replacement 是以http:// 或https:// 开头,则替换结果会直接以重向返回给客户端
分析:目录跳转,正则匹配到zz开头的,都永久重定向到zhengzhou,且后边的uri不变,如:index.html,
① last :重写完成后停止对当前URI 在当前location 中后续的其它重写操作,而后对新的URI 启动新一轮重写检查;提前重启新一轮循环,不建议在lation 中使用
② break :重写完成后停止对当前URI 在当前location 中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location 中使用
③ redirect :临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI 给客户端,由客户端重新发起请求;不能以http:// 或https:// 开头,使用相对路径,状态码:302
④ permanent: 重写完成后以永久重定向方式直接返回重写后生成的新URI 给客户端,由客户端重新发起请求,状态码 :301
?
return code [text]; 例:return 403 "error";
return code URL; 例:return 302 http://www.baidu.com/;
return URL; 例:return http://www.baidu.com/;
例:连续跳转,image永久重定向到img,img又跳到www.baidu.com
rewrite ^/image/(.*)$ /img/$1 permanent;
return http://www.baidu.com/ ;
(3)rewrite_log on | off; 把跳转的信息写到日志中
是否开启重写日志, 发送至error_log (notice level)
引入新的上下文, 条件满足时,执行配置块中的配置指令;server, location
实验一:搭建lnmp及类小米等商业网站的实现
1、安装包,开启服务
yum -y install nginx mariadb-server php-fpm php-mysql
2、修改nginx的配置文件
cp /etc/nginx/nginx.conf.default /etc/nginx/nginx.conf 有个模板例子覆盖了配置文件
vim /etc/nginx/nginx.conf 修改下面几类
error_log /var/log/nginx/error.log info; 错误日志
server_name xiaomi.along.com; 根据自己顺便写
index index.php index.html index.htm;
⑤ location ~ \\.php$ { 开启.php,配置文件有例子,只需去掉注释,修改一行即可
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
systemctl restart nginx 重启服务,发现有warn
ulimit -n 查看linux系统里打开文件描述符的最大值,一般缺省值是1024,对一台繁忙的服务器来说,这个值偏小,所以有必要重新设置linux系统里打开文件描述符的最大值
3、修改php-fpm的配置文件
date.timezone = Asia/Shanghai 时区
vim /etc/php-fpm.d/www.conf 改两行
4、运行mysql ,创建一会网页需要的库
mkdir /data/web -p 创建一个目录专门放小米的网页配置
unzip -d /data/web/ xiaomi.zip 解压到目录
chown -R nobody.nobody * 为了安全,递归把所有文件的所属人和所属组改为权限有限的nobody
6、网页登录
7、实验成功,登录查看
8、ab 可以压力测试
实验二:实现ssl 加密
(1)一个物理服务器设置一个https
1、创建存放证书的目录
2、自签名证书
openssl rsa -in nginx.key -out nginx2.key 因为刚私钥被加密了,为了后边方便,解密
3、把证书和私钥cp 到nginx存放证书目录
cp nginx.crt nginx2.key /etc/nginx/ssl/
mv nginx2.key nginx.key 把名字改回来
4、修改配置文件,加一段server
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:sslcache:20m;
5、测试,网页打开 https://192.168.30.7/
(2)一个物理服务器设置多个https
因为nginx 强大,可以实现多个虚拟主机基于不同的FQDN 实现ssl加密,httpd不能实现
1、生成3个证书和私钥
2、把证书和私钥cp 到nginx存放证书目录,并解开私钥的加密
cp nginx{1,2,3}* /etc/nginx/ssl/
openssl rsa -in nginx.key -out nginx.key
openssl rsa -in nginx2.key -out nginx2.key
openssl rsa -in nginx3.key -out nginx3.key
3、创建各自对应的访问网页
echo website1 > /app/website1/index.html
echo website1 > /app/website2/index.html
echo website1 > /app/website3/index.html
4、测试访问,成功
以上是关于ngnix详解以及LNMP的搭建的主要内容,如果未能解决你的问题,请参考以下文章
你真的了解LAMP/LNMP架构吗?(详解PHP和Apache和MariaDB之间的工作联系)以及安装php7,8版本。