Nginx总结之基础概念
Nginx (engine x) 是一个高性能的 HTTP 和 反向代理 服务,也是一个IMAP/POP3/SMTP服务,Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
Nginx功能特点
1.作为 Web 服务器
2.作为负载均衡服务器
3.作为邮件代理服务器
4.Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器
Nginx处理高并发两种方法
1.当一个新的I/O流进来就会分配一个新的进程进行管理
2.I/O多路复用,就是单线程追踪单个sock流来管理多个I/O流,在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流
image.png
image.png
Nginx处理请求的过程
- select, poll, epoll 都是I/O多路复用的具体的实现,其实是他们出现是有先后顺序的。
I/O多路复用这个概念被提出来以后, 相继出现了多个方案
select是第一个实现 (1983 左右在BSD里面实现的)。
select 被实现以后,很快就暴露出了很多问题。
• select 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。
• select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是那个sock上有数据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的sock每次都找一遍...
• select 只能监视1024个链接。
• select 不是线程安全的,如果你把一个sock加入到select, 然后突然另外一个线程发现,这个sock不用,要收回,这个select 不支持的,如果你丧心病狂的竟然关掉这个sock, select的标准行为是不可预测的
于是14年以后(1997年)一帮人又实现了poll, poll 修复了select的很多问题,比如
• poll 去掉了1024个链接的限制,于是要多少链接呢, 主人你开心就好。
• poll 从设计上来说,不再修改传入数组,不过这个要看你的平台了,所以行走江湖,还是小心为妙。
其实拖14年那么久也不是效率问题, 而是那个时代的硬件实在太弱,一台服务器处理1千多个链接简直就是神一样的存在了,select很长段时间已经满足需求。
但是poll仍然不是线程安全的, 这就意味着,不管服务器有多强悍,你也只能在一个线程里面处理一组I/O流。
epoll 可以说是I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝大部分问题, 比如:
• epoll 现在是线程安全的。
• epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了。
Nginx内部结构
image.png1个master主进程,2个work工作进程,处理方式为异步,非阻塞 原理(即一个request请求过来,当一个线程不能立即处理完成时,并不会阻止其他request的访问,而是让未完成的request在旁边等待,让线程继续在后台处理,直到完成才会离去)
Nginx部署
nginx官方网站:http://www.nginx.org
方式一,yum安装
1.yum install yum-utils
2.vim /etc/yum.repos.d/nginx.repo 写入:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
3.yum-config-manager --enable nginx-mainline
4.yum install nginx
5.查看防火墙状态 getenforce,关闭防火墙 systemctl stop firewalld,
或者 vim /etc/selinux/config 设置SELINUX=disabled
6.nginx -v 查看版本
nginx -V 查看nginx安装的模块
方式二,编译安装
1、安装编译环境
yum -y install gcc gcc-c++
2、安装pcre软件包(使nginx支持http rewrite模块)
yum install -y pcre pcre-devel
3、安装openssl-devel(使nginx支持ssl)
yum install -y openssl openssl-devel
4、安装zlib
yum install -y zlib zlib-devel
5.安装包下载
wget http://120.52.51.15/nginx.org/download/nginx-1.14.2.tar.gz
tar -vzxf nginx-1.14.2.tar.gz -C /usr/local
cd nginx-1.14.2/
./configure \
make &&make install
6.了解安装中需要指定的参数
--prefix=/usr/share/nginx # 指向安装目录
--conf-path=/etc/nginx/nginx.conf # 指定配置文件
--http-log-path=/var/log/nginx/access.log # 指定访问日志
--error-log-path=/var/log/nginx/error.log # 指定错误日志
--lock-path=/var/lock/nginx.lock # 指定lock文件
--pid-path=/run/nginx.pid # 指定pid文件
--http-client-body-temp-path=/var/lib/nginx/body # 设定http客户端请求临时文件路径
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi # 设定http fastcgi临时文件路径
--http-proxy-temp-path=/var/lib/nginx/proxy # 设定http代理临时文件路径
--http-scgi-temp-path=/var/lib/nginx/scgi # 设定http scgi临时文件路径
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi # 设定http uwsgi临时文件路径
--with-debug # 启用debug日志
--with-pcre-jit # 编译PCRE包含“just-in-time compilation”
--with-ipv6 # 启用ipv6支持
--with-http_ssl_module # 启用ssl支持
--with-http_stub_status_module # 获取nginx自上次启动以来的状态
--with-http_realip_module # 允许从请求标头更改客户端的IP地址值,默认为关
--with-http_auth_request_module # 实现基于一个子请求的结果的客户端授权。如果该子请求返回的2xx响应代码,所述接入是允许的。如果它返回401或403中,访问被拒绝与相应的错误代码。由子请求返回的任何其他响应代码被认为是一个错误。
--with-http_addition_module # 作为一个输出过滤器,支持不完全缓冲,分部分响应请求
--with-http_dav_module # 增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法 默认关闭,需编译开启
--with-http_geoip_module # 使用预编译的MaxMind数据库解析客户端IP地址,得到变量值
--with-http_gunzip_module # 它为不支持“gzip”编码方法的客户端解压具有“Content-Encoding: gzip”头的响应。
--with-http_gzip_static_module # 在线实时压缩输出数据流
--with-http_image_filter_module # 传输JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。gd库要用到)
--with-http_spdy_module # SPDY可以缩短网页的加载时间
--with-http_sub_module # 允许用一些其他文本替换nginx响应中的一些文本
--with-http_xslt_module # 过滤转换XML请求
--with-mail # 启用POP3/IMAP4/SMTP代理模块支持
--with-mail_ssl_module # 启用ngx_mail_ssl_module支持启用外部模块支持
7.修改配置文件 /etc/nginx/nginx.conf
# 全局参数设置
worker_processes 1; # 设置nginx启动进程的数量,一般设置成与逻辑cpu数量相同
error_log logs/error.log; # 指定错误日志
worker_rlimit_nofile 102400; # 设置一个nginx进程能打开的最大文件数
pid /var/run/nginx.pid;
events { # 事件配置
worker_connections 1024; # 设置一个进程的最大并发连接数
use epoll; # 事件驱动类型
}
# http 服务相关设置
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"';
access_log /var/log/nginx/access.log main; #设置访问日志的位置和格式
sendfile on; # 用于开启文件高效传输模式,一般设置为on,若nginx是用来进行磁盘IO负载应用时,可以设置为off,降低系统负载
tcp_nopush on; # 减少网络报文段数量,当有数据时,先别着急发送, 确保数据包已经装满数据, 避免了网络拥塞
tcp_nodelay on; # 提高I/O性能,确保数据尽快发送, 提高可数据传输效率
gzip on; # 是否开启gzip压缩
keepalive_timeout 65; # 设置长连接的超时时间,请求完成之后还要保持连接多久,不是请求时间多久,目的是保持长连接,减少创建连接过程给系统带来的性能损 耗,类似于线程池,数据库连接池
types_hash_max_size 2048; # 影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。 types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升
include /etc/nginx/mime.types; # 关联mime类型,关联资源的媒体类型(不同的媒体类型的打开方式)
default_type application/octet-stream; # 根据文件的后缀来匹配相应的MIME类型,并写入Response header,导致浏览器播放文件而不是下载
# 虚拟服务器的相关设置
server {
listen 80; # 设置监听的端口
server_name localhost; # 设置绑定的主机名、域名或ip地址
charset koi8-r; # 设置编码字符
location / {
root /var/www/nginx; # 设置服务器默认网站的根目录位置
index index.html index.htm; # 设置默认打开的文档
}
error_page 500 502 503 504 /50x.html; # 设置错误信息返回页面
location = /50x.html {
root html; # 这里的绝对位置是/var/www/nginx/html
}
}
}
8.启动检查Nginx
/usr/local/nginx/sbin/nginx || systemctl start nginx
usr/local/nginx/sbin/nginx -t || nginx -t 检查配置文件是否有错
9.了解nginx日志
nginx 日志文件分为 log_format 和 access_log 两部分, log_format 定义记录的格式,access_log记录访问日志
Nginx一些高级应用
编辑 /etc/nginx/nginx.conf 配置文件
#添加以下内容~~
location /nginx-status {
stub_status on;
access_log /var/log/nginx/nginxstatus.log; #设置日志文件的位置
auth_basic "nginx-status"; #指定认证机制(与location后面的内容相同即可)
auth_basic_user_file /etc/nginx/htpasswd; #指定认证的密码文件
}
创建认证口令文件并添加用户 lys 和 admin,密码用md5加密
htpasswd -c -m /etc/nginx/htpasswd lys
htpasswd -m /etc/nginx/htpasswd admin
重启服务,客户端访问 http:// 启动服务的ip / nginx-status 即可
了解虚拟主机
虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响。
image.png
nginx可以实现虚拟主机的配置,nginx支持三种类型的虚拟主机配置。
1、基于域名的虚拟主机 (server_name来区分虚拟主机——应用:外部网站)
2、基于ip的虚拟主机, (一块主机绑定多个ip地址)
3、基于端口的虚拟主机 (端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台)
1基于域名的虚拟主机配置
1.cd /etc/nginx/conf.d/
vim web.conf
server {
listen 80;
server_name www.1000phone01.com;
root /usr/share/nginx/web1;
access_log /var/log/www.1000phone01.com.log main;
error_log /var/log/www.1000phone01.com.error.log;
location / {
index index.html;
}
}
2.为 域名为 www.1000phone01.com 的虚拟机,创建 index 文件
mkdir /var/share/nginx/web
echo " 这是web的测试" > web/index.html
3.systemctl reload nginx.service 或者 systemctl restart nginx.service
4.vim /etc/hosts
10.0.122.57 www.1000phone01.com
5.浏览器输入www.1000phone01.com就能看到
这是web的测试
6.如果不能正常运行,一定要记得去查看报错日志 cat logs/error.log
2.基于IP的虚拟主机
其实就是一块网卡绑定多个ip
1.建立多个虚拟ip
ifconfig enp0s25:1 10.0.122.101
ifconfig enp0s25:2 10.0.122.102
ifconfig 查看
2.类似与前面的方法,在/etc/nginx/conf.d的目录下创建两个app1.conf,app2.conf,并写入
app1.conf:
server {
listen 10.0.122.101:80;
server_name www.app1.com;
root /usr/share/nginx/app1;
access_log /var/log/www.app1.com.log main;
error_log /var/log/www.app1.com.error.log;
location / {
index index.html;
}
}
--------------------------------
app2.conf:
server {
listen 10.0.122.102:80;
server_name www.app2.com;
root /usr/share/nginx/app2;
access_log /var/log/www.app2.com.log main;
error_log /var/log/www.app2.com.error.log;
location / {
index index.html;
}
}
3.再进入到 /var/share/nginx/下创建两个目录app1,app2,写入
echo " app1 test html" > app1/index.html
echo " app2 test html" > app2/index.html
4.重新载入nginx,浏览器输入10.0.122.101/102即可得到内容
3.基于端口的虚拟主机
(端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台)
同上步骤,在port.conf写入
server {
listen 8080;
server_name www.port1.com;
root /usr/share/nginx/port1;
access_log /var/log/www.port1.com.log main;
error_log /var/log/www.port1.com.error.log;
location / {
index index.html;
}
}
输入www.port1.com:8080 即可得到内容