共计 7335 个字符,预计需要花费 19 分钟才能阅读完成。
nginx 简介(参考百度)
Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开发的,第一个公开版本 0.1.0 公布于 2004 年 10 月 4 日。
其将源代码以类 BSD 许可证的模式公布,因它的稳定性、丰盛的功能集、示例配置文件和低系统资源的耗费而闻名。2011 年 6 月 1 日,nginx 1.0.4 公布。
Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协定下发行。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力在同类型的网页服务器中体现较好,中国大陆应用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝
等。
nginx 装置
- 1. 装置编译工具及库文件
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
- 2. 装置 PCRE
cd /usr/local/src/
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
- 3. 装置 Nginx
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.6.2.tar.gz
参考(https://www.runoob.com/linux/…)
nginx 根本构造
高度模块化的设计是 Nginx 的架构根底。Nginx 服务器被合成为多个模块,每个模块就是一个功能模块,只负责本身的性能,模块之间严格遵循“高内聚,低耦合”的准则
- 外围模块
外围模块是 Nginx 服务器失常运行必不可少的模块,提供谬误日志记录、配置文件解析、事件驱动机制、过程治理等外围性能。
- 规范 HTTP 模块
规范 HTTP 模块提供 HTTP 协定解析相干的性能,如:端口配置、网页编码设置、HTTP 响应头设置等。
- 可选 HTTP 模块
可选 HTTP 模块次要用于扩大规范的 HTTP 性能,让 Nginx 能解决一些非凡的服务,如:Flash 多媒体传输、解析 GeoIP 申请、SSL 反对等。
- 邮件服务模块
邮件服务模块次要用于反对 Nginx 的邮件服务,包含对 POP3 协定、IMAP 协定和 SMTP 协定的反对。
- 第三方模块
第三方模块是为了扩大 Nginx 服务器利用,实现开发者自定义性能,如:Json 反对、Lua 反对等。
参考(https://www.sohu.com/a/230364…)
nginx 基本功能
- web 服务器、反向代理服务器
- 负载平衡
- 动静拆散
nginx 长处
- 1. 能够高并发连贯
官网测试 Nginx 可能撑持 5 万并发连贯,理论生产环境中能够撑持 2~4 万并发连接数。
起因,次要是 Nginx 应用了最新的 epoll(Linux2.6 内核)和 kqueue(freeBSD)网路 I / O 模型,而 Apache 应用的是传统的 Select 模型,其比较稳定的 Prefork 模式为多过程模式,须要常常派生子过程,所以耗费的 CPU 等服务器资源,要比 Nginx 高很多。
- 2. 内存耗费少
Nginx+PHP(FastCGI)服务器,在 3 万并发连贯下,开启 10 个 Nginx 过程耗费 150MB 内存,15MB*10=150MB,开启的 64 个 PHP-CGI 过程耗费 1280 内存,20MB*64=1280MB,加上零碎本身耗费的内存,总共耗费不到 2GB 的内存。
如果服务器的内存比拟小,齐全能够只开启 25 个 PHP-CGI 过程,这样 PHP-CGI 耗费的总内存数才 500MB。
+3. 老本低廉
购买 F5BIG-IP、NetScaler 等硬件负载平衡交换机,须要十多万到几十万人民币,而 Nginx 为开源软件,采纳的是 2 -clause BSD-like 协定,能够收费试用,并且可用于商业用途。
BSD 开源协定是一个给使用者很大自在的协定,协定指出能够自在应用、批改源代码、也能够将批改后的代码作为开源或专用软件再公布。
- 4. 配置文件非常简单
网络和程序一样通俗易懂,即便,非专用系统管理员也能看懂。
- 5. 反对 Rewrite 重写
可能依据域名、URL 的不同,将 http 申请分到不同的后端服务器群组。
- 6. 内置的健康检查性能
如果 NginxProxy 后端的某台 Web 服务器宕机了,不会影响前端的拜访。
- 7. 节俭带宽
反对 GZIP 压缩,能够增加浏览器本地缓存的 Header 头。
- 8. 稳定性高
用于反向代理,宕机的概率微不足道。
- 9. 反对热部署
Nginx 反对热部署,它的主动特地容易,并且,简直能够 7 天 *24 小时不间断的运行,即便,运行数个月也不须要重新启动,还可能在不间断服务的状况下,对软件版本进行降级。
nginx 毛病
- 1. 动静解决差:nginx 解决动态文件好, 消耗内存少,然而解决动静页面则很鸡肋,当初个别前端用 nginx 作为反向代理抗住压力,apache 作为后端解决动静申请。
- 2.rewrite 弱:尽管 nginx 反对 rewrite 性能,然而相比于 Apache 来说,Apache 比 nginx 的 rewrite 弱小。
- 3.Nginx 仅能反对 http、https 和 Email 协定,这样就在适用范围下面小些,这个是它的毛病
- 4. 对后端服务器的健康检查,只反对通过端口来检测,不反对通过 url 来检测不反对 Session 的间接放弃,但能通过 ip_hash 来解决
nginx 配置
- 全局
#Nginx 的 worker 过程运行用户以及用户组
#user nobody nobody;
#Nginx 开启的过程数
worker_processes 1;
#worker_processes auto;
#以下参数指定了哪个 cpu 调配给哪个过程,一般来说不必非凡指定。如果肯定要设的话,用 0 和 1 指定调配形式.
#这样设就是给 1 - 4 个过程调配独自的核来运行,呈现第 5 个过程是就是随机调配了。eg:
#worker_processes 4 #4 核 CPU
#worker_cpu_affinity 0001 0010 0100 1000;
nets
#定义全局谬误日志定义类型,[debug|info|notice|warn|crit]
#error_log logs/error.log info;
#指定过程 ID 存储文件地位
#pid logs/nginx.pid;
#一个 nginx 过程关上的最多文件描述符数目,理论值应该是最多关上文件数(ulimit -n)与 nginx 过程数相除,然而 nginx 调配申请并不是那么平均,所以最好与 ulimit - n 的值保持一致。#vim /etc/security/limits.conf
# * soft nproc 65535
# * hard nproc 65535
# * soft nofile 65535
# * hard nofile 65535
worker_rlimit_nofile 65535;
- events 事件配置
events {#use [ kqueue | rtsig | epoll | /dev/poll | select | poll]; epoll 模型是 Linux 2.6 以上版本内核中的高性能网络 I / O 模型,如果跑在 FreeBSD 下面,就用 kqueue 模型。use epoll;
#每个过程能够解决的最大连接数,实践上每台 nginx 服务器的最大连接数为 worker_processes*worker_connections。理论值:worker_rlimit_nofile/worker_processes
#留神:最大客户数也由零碎的可用 socket 连接数限度(~ 64K),所以设置不切实际的高没什么益处
worker_connections 65535;
#worker 工作形式:串行(肯定水平升高负载,但服务器吞吐量大时,敞开应用并行形式)#multi_accept on;
}
- http 参数
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型
default_type application/octet-stream;
#日志相干定义
#log_format main '$remote_addr - $remote_user [$time_local]"$request" '
# '$status $body_bytes_sent"$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#定义日志的格局。前面定义要输入的内容。#1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的 ip 地址;#2.$remote_user:用来记录客户端用户名称;#3.$time_local:用来记录拜访工夫与时区;#4.$request:用来记录申请的 url 与 http 协定;#5.$status:用来记录申请状态;#6.$body_bytes_sent:记录发送给客户端文件主体内容大小;#7.$http_referer:用来记录从那个页面链接拜访过去的;#8.$http_user_agent:记录客户端浏览器的相干信息
#连贯日志的门路,指定的日志格局放在最初。#access_log logs/access.log main;
#只记录更为严重的谬误日志,缩小 IO 压力
error_log logs/error.log crit;
#敞开日志
#access_log off;
#默认编码
#charset utf-8;
#服务器名字的 hash 表大小
server_names_hash_bucket_size 128;
#客户端申请单个文件的最大字节数
client_max_body_size 8m;
#指定来自客户端申请头的 hearerbuffer 大小
client_header_buffer_size 32k;
#指定客户端申请中较大的音讯头的缓存最大数量和大小。large_client_header_buffers 4 64k;
#开启高效传输模式。sendfile on;
#防止网络阻塞
tcp_nopush on;
tcp_nodelay on;
#客户端连贯超时工夫,单位是秒
keepalive_timeout 60;
#客户端申请头读取超时工夫
client_header_timeout 10;
#设置客户端申请主体读取超时工夫
client_body_timeout 10;
#响应客户端超时工夫
send_timeout 10;
#FastCGI 相干参数是为了改善网站的性能:缩小资源占用,进步访问速度。fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip 模块设置
#开启 gzip 压缩输入
gzip on;
#最小压缩文件大小
gzip_min_length 1k;
#压缩缓冲区
gzip_buffers 4 16k;
#压缩版本(默认 1.1,前端如果是 squid2.5 请应用 1.0)gzip_http_version 1.0;
#压缩等级 1-9 等级越高,压缩成果越好,节约宽带,但 CPU 耗费大
gzip_comp_level 2;
#压缩类型,默认就曾经蕴含 text/html,所以上面就不必再写了,写上去也不会有问题,然而会有一个 warn。gzip_types text/plain application/x-javascript text/css application/xml;
#前端缓存服务器缓存通过压缩的页面
gzip_vary on;
- server(虚拟主机根底设置)
# 虚拟主机定义
server {
#监听端口
listen 80;
#拜访域名
server_name localhost;
#编码格局,若网页格局与此不同,将被主动转码
#charset koi8-r;
#虚拟主机拜访日志定义
#access_log logs/host.access.log main;
#对 URL 进行匹配
location / {
#拜访门路,可绝对也可绝对路径
root html;
#首页文件。以下按程序匹配
index index.html index.htm;
}
- 负载平衡
# 负载平衡服务器池
upstream my_server_pool {
#调度算法
#1. 轮循(默认)(weight 轮循权值)#2.ip_hash:依据每个申请拜访 IP 的 hash 后果调配。(会话放弃)#3.fair: 依据后端服务器响应工夫最短申请。(upstream_fair 模块)#4.url_hash: 依据拜访的 url 的 hash 后果调配。(需 hash 软件包)#参数:#down:示意不参加负载平衡
#backup: 备份服务器
#max_fails: 容许最大申请谬误次数
#fail_timeout: 申请失败后暂停服务工夫。server 192.168.1.109:80 weight=1 max_fails=2 fail_timeout=30;
server 192.168.1.108:80 weight=2 max_fails=2 fail_timeout=30;
}
#负载平衡调用
server {
...
location / {proxy_pass http://my_server_pool;}
}
- location 定位
# 依据不同的浏览器 URL 重写
if($http_user_agent ~ Firefox){rewrite ^(.*)$ /firefox/$1 break;
}
if($http_user_agent ~ MSIE){rewrite ^(.*)$ /msie/$1 break;
}
#实现域名跳转
location / {rewrite ^/(.*)$ https://web8.example.com$1 permanent;
}
- IP 限度
# 限度 IP 拜访
location / {
deny 192.168.0.2;allow 192.168.0.0/24;
allow 192.168.1.1;
deny all;
}
nginx 内置变量
nginx 常用命令
- 启动进入 sbin ./nginx
- 查看 ngix 语法测试是否通过 ./nginx -t
- 重启 ./nginx -s reload
- 查看 nginx 是否启动 ps -ef | grep nginx
- 敞开 nginx ./nginx -s stop
- 关联配置 ./nginx -c xx.conf
nginx 注意事项
1.Nginx 在上传文件时呈现 413 Request Entity Too Large,怎么办?
因为 Nginx 默认反对上传 1MB 的文件,所以超过 1MB 则会报错。#nginx 上传文件大小限度配置语法
Syntax: client\_max\_body\_size size;
Default: client\_max\_body\_size 1m;
Context: http, server, location
容许该 server 能反对上传 200m 的文件,也能够其配置放入 http 层,所有 server 都失效。server {
...
client\_max\_body\_size 200m;
...
}
2.Nginx 指定门路时,root 与 alias 区别在哪?
root 与 alias 门路匹配次要区别在于 nginx 如何解释 location 前面的 uri,这会使两者别离以不同的形式将申请映射到服务器文件上,alias 是一个目录别名的定义,root 则是最上层目录的定义。
root 的处理结果是:root 门路+location 门路
alias 的处理结果是:应用 alias 门路替换 location 门路
1.root 门路配置实例: 用户拜访 www.xuliangwei.com/image/test.gif,实际上 Nginx 会上 /code/image/ 目录下找去找 test.gif 文件
server {
listen 80;
server\_name www.xuliangwei.com;
location /image/ {root /code;}
}
3.400 bad request
个别起因: 申请的 Header 过大。解决办法:配置 nginx.conf 相干设置
`client_header_buffer_size 16k;`
`large_client_header_buffers 4 64k;`
4.403 forbiden
个别是拜访文件权限不够5.413 Request Entity Too Large
个别起因: 个别呈现在上传文件。解决办法:配置 nginx.conf 相干设置,配置 php.ini 如下(必须和 nginx.conf 配置统一)
client_max_body_size 10m;
post_max_size=10M
upload_max_filesize=2M
499 Client Closed Request
个别起因: 客户端在为等到服务器相应返回前就敞开了客户端描述符。个别呈现在客户端设置超时后,被动敞开 socket.
解决办法:依据理论 Nginx 后端服务器的解决工夫批改客户端超时工夫。
> 6.500 Internal Server Rrror
个别起因:脚本谬误,(php 语法错误、lua 语法错误)
拜访量过大,系统资源限度,不能关上过多文件
磁盘空间有余。(access log 开启可能导致磁盘满溢 敞开)
> 7.502 Bad Gateway、503 Serveice Unavailable
个别起因: 后端服务无奈解决,业务中断。
解决办法:从后端日志获取谬误起因,解决后端服务器问题。
> 8.504 Gateway Timeout
个别起因: 后端服务器在超时工夫内,未响应 Nginx 代理申请
解决办法:依据后端服务器理论解决状况,调正后端申请超时工夫。
proxy_read_timeout 90;
proxy_send_timeout 90;
参考(https://www.cnblogs.com/johnn…)
参考(https://blog.csdn.net/lzghxjt…)