Nginx 安装 配置及常见问题及一些常见报错。
Nginx简介:
与Apache(httpd)类似,是一个开源的,支持高性能、高并发的www服务和代理服务软件,由俄罗斯人IgorSyoer开发的,最初被应用在俄罗斯的大型网站www.rambler.ru上,后来作者将源代码以类BSD许可的形式开源出来供全球使用
在功能应用方面,Nginx不但是一个优秀的Web服务软件,还是具有反向代理,负载均衡功能和缓存功能。在反向代理负载均衡功能方面,它类似于大名鼎鼎的LVS、HAproxy等专业代理软件,但Ngix部署起来更为简单、方便;在缓存服务功能方面,它又类似于Squid等专业的缓存服务软件
Nginx软件使用排名参见:https://news.netcraft.com/
Nginx的重要特性及应用场合:
- 可针对静态资源高速高并发访问和缓存
- 可使用反向代理加速,并且健康检查和容错功能
- 支持FastCGI、Uwsgi、SCGI、Memcached加速和缓存
- 支持SSL、TLS、SNI
- 具有模块化的架构:过滤器包括gzip压缩、ranges支持、chunked 响应、XSLT、SSI及图像缩放等功能,在SSI过滤器中,一个包含多个SSI的页面,如果经过由FastCGI或反向代理处理,可被并行处理
它所具备的其它WWW服务软件特性:
- 支持基于域名、端口、IP的多虚拟主机站点
- 支持keepalived和pipelined连接
- 可进行简单、方便、灵活的配置和管理
- 支持修改Nginx配置,并且在代码上线时,可平滑重启,不中断业务访问
- 可自定义日志格式、临时缓冲写日志操作,快速日志轮询及通过rsyslog处理日志
- 可以利用信号控制Nginx进程
- 支持3xxx-5xxxHTTP状态码重定向
- 支持rewrite模块,支持URI重写及正则表达式匹配
- 支持基于客户端IP地址和HTTP基本认证的访问控制
- 支付PUT、DELETE、MKCOL、COP、及MOVE等特殊的HTTP请求方法
- 支付FLV流和MP4流技术产品应用
- 支持HTTP响应速率限制
- 支持同一IP地址的并发连接或请求数限制
- 支付邮件服务代理
Nginx在企业的功能应用:
- 作为web服务软件:Nginx是一个支持高性能、高并发的Web服务软件,它具体有很多优秀的特性,与Apache相比,Nginx占资源更少,效果更高,功能更强
- 作为反向代理或负载均衡,充当LVS或HA-proxy
- 前端业务数据缓存服务:在web缓存方面,Nginx可通过自身的proxy_cache模块实现类Squid等专业前端缓存功能
为什么Nginx比Apache性能高:
Nginx使用最新的epoll(Linux2.6内核)和kqueue(FeeBSD)异步网络I/O模型,而Apache使用的是传统的select模型,目前Linux下能够承受高并发访问的Squid、Memcached软件都采用的是epool模型
apache select和Nginx epoll的技术对比:
指标 |
select |
epoll |
随着连接数增加性能下降 |
随着连接数增加,性能基本上没下降 |
|
连接数 |
连接数有限,最大数不能超过1024,超过1024,则需要修改FD_SETSIZE宏,重新编译 |
连接数无限制 |
内存处理机制 |
线性轮询 |
回调callback |
开发复杂性 |
低 |
高 |
下载安装:
Nginx软件有三种版本:稳定版、开发版和历史稳定版
下载: wgethttp://nginx.org/download/nginx-1.12.1.tar.gz
检查环境:
cat /etc/redhat-release 查看系统版本
uname -r 查看内核版本
关闭firewall、selinux
安装依赖包:
检查是否已安装pcre、pcre-devel包:
rpm -qa pcre-devel pcre
如果没有刚安装:
yum install -y pcre pcre-devel
检查是否已安装openssl、openssl-devel包 :
rpm -qa openssl-devel openssl
如果没有刚安装:
yum install -y openssl openssl-devel
创建nginx用户:
useradd nginx -s /sbin/nologin -M
编译和安装:
- 解压:tar -zxvf nginx-1.12.2.tar.gz
- 一般将tar包放在/usr/local下 解压完成后 cd至nginx-1.12.2目录下进行编译
- 配置编译参数:./configure --prefix=/usr/local/nginx-1.12.2 --conf-path=/usr/local/nginx-1.12.2/nginx.conf --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --http-client-body-temp-path=/var/temp/nginx/client --http-proxy-temp-path=/var/temp/nginx/proxy --http-fastcgi-temp-path=/var/temp/nginx/fastcgi --http-uwsgi-temp-path=/var/temp/nginx/uwsgi --http-scgi-temp-path=/var/temp/nginx/scgi --without-http_rewrite_module --without-http_gzip_module(要开启gzip就不要加这一条) --with-pcre(前后端或者动静分离加这条) (改掉版本号 1.12.2改成对应的)
- 编译:make
- 安装:make install
- 启动nginx: /usr/local/nginx-1.12.2/sbin/nginx
- 检察进程和端口是否监听:ps -ef | grep nginx netstat -tunlp | grep 80 或 ss -tunlp | grep 80
- 访问测试:curl http://localhost:80 或 wget http://localhost:80
nginx命令其它用法:
- 启动nginx服务: ./nginx
- 检查配置文件是否正确 ./nginx -t
- 停止服务 ./nginx -s stop
- 重启服务 ./nginx -s restart
- 重新加载配置文件 ./nginx -s reload
Nignx启动的疑难杂症:
- 编译安装pcre软件包时,gcc未安装完整报错
- Nginx用户没创建导致报错:"nginx:[emerg] getpwnam("nginx") failed"
- 防火墙和selinux未关闭导致访问不到nginx页面
部署一个站点:
Nginx的默认站点目录是Nginx安装目录上的html目录,如果要部署一个网站,把开发好的程序放全部到html目录下即可
Nginx技术深入剖析:
Nginx模块说明:
Nginx之所以功能强大,是因为它有众多功能模块,以下是常用的模块
Nginx http功能相关模块 |
模块说明 |
ngx_http_core_module |
包括一些核心的http参数配置,对应Nginxr的配置为http区块部分 |
ngx_http_access_module |
访问控制模块,用来控制网站用户对Nginx的访问 |
在生产环境中,配置、调整及优化Nginx软件,主要就是根据这些模块的功能修改应用的参数来实现
nginx负载均衡的5种策略
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}
2、加权轮询
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver {
server 192.168.0.14 weight=5;
server 192.168.0.15 weight=10;
}
3、IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
在需要使用负载均衡的server中增加
proxy_pass http://backserver/;
upstream backserver{
ip_hash;
server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载)
server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)
}
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义
location块:
如果要精确查找:
location /XXXXXXX {
root /home/qmkx/html;
index XXXXXX.html;
}
直接将XXX改一个别的名字 然后 将后面目录 及html 改为另外一个即可
根据参数优化Nginx服务性能
配置worker进行个数:
worker_processes: 默认值为1, 官方建议设置为CPU核数。其实在一些高流量高并发场合可以将其设置为 CPU核数*2,我一般使用4
上传文件大小的限制:
client_max_body_size参数设置最大允许的客户端请求主体大小,在请求头中有"Content-Length"决定,如果超过了此配置值,服务器端会给浏览器返回413错误,意思就请求条目过大
使用Nginx zip压缩实现性能优化:
用户请求的内容在服务端发送给浏览器时,Nginx服务器会根据一些具体策略实施压缩。以节约带宽,同时加快响应速度来提升用户体验
Nginx的压缩与Apache的压缩功能很相似,Nginx的gzip压缩功能依赖于ngx_http_gzip_module模块,默认已安装
允许重新定义或者添加发往后端服务器的请求头:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
一些不对劲的东西(报错):
···在根据生产环境改完nginx.conf后,先使用nginx -t检查 如果出现以下报错:
nginx: the configuration file /usr/local/nginx-1.12.2/nginx.conf syntax is ok
nginx: [emerg] mkdir() "/var/temp/nginx/client" failed (2: No such file or directory)
nginx: configuration file /usr/local/nginx-1.12.2/nginx.conf test failed
如果在nginx -t 时遇见这个 直接用root权限的角色创建文件夹即可。
root:mkdir -p /var/temp/nginx/client
如果生产环境不允许使用root那么增加sudo即可
biubiubiu: sudo mkdir -p /var/temp/nginx/client·····如果在配置反向代理proxy_pass及upstream的时候 遇见[emerg] "proxy_pass" directive is not allowed here in /etc/nginx/nginx.conf第一先查看是不是编译的时候没将模块加入 如果加入模块 那就是位置的问题 proxy_pass必须要放在http{}中 我一般将它放在location / {的下一行 upstram我一般将它放在http{的下一行 然后重启即可
<未完待续,持续更新>