Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好.
官网:http://nginx.org
原因:主要是Nginx使用了最新的epoll(Linux2.6内核)和kqueue(freeBSD)网路I/O模型,而Apache使用的是传统的Select模型,其比较稳定的Prefork模式为多进程模式,需要经常派生子进程,所以消耗的CPU等服务器资源,要比Nginx高很多。
Nginx+PHP(FastCGI)服务器,在3万并发连接下,开启10个Nginx进程消耗150MB内存,15MB*10=150MB,开启的64个PHP-CGI进程消耗1280内存,20MB*64=1280MB,加上系统自身消耗的内存,总共消耗不到2GB的内存。
购买F5BIG-IP、NetScaler等硬件负载均衡交换机,需要十多万到几十万人民币,而Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费试用,并且可用于商业用途。
网络和程序一样通俗易懂,即使,非专用系统管理员也能看懂。
能够根据域名、URL的不同,将http请求分到不同的后端服务器群组。
如果NginxProxy后端的某台Web服务器宕机了,不会影响前端的访问。
支持GZIP压缩,可以添加浏览器本地缓存的Header头。
用于反向代理,宕机的概率微乎其微。
Nginx支持热部署,它的自动特别容易,并且,几乎可以7天*24小时不间断的运行,即使,运行数个月也不需要重新启动,还能够在不间断服务的情况下,对软件版本进行升级。
可以看出,Nginx在反向代理、Rewrite规则、稳定性、静态文件处理,内存消耗等方面,有很强的优势,使用Nginx取代传统的Apache服务器,会得到多方面的性能提升。
高并发
epoll:异步非阻塞
第一种方法
最传统的多进程并发模型 (每进来一个新的I/O流会分配一个新的进程管理。)
第二种方法
I/O多路复用 (单个线程,通过记录跟踪每个I/O流(sock)的状态,来同时管理多个I/O流 。)
发明它的原因,是尽量多的提高服务器的吞吐能力。
在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流
select(了解)
select是第一个实现 (1983 左右在BSD里面实现的)。
select 被实现以后,很快就暴露出了很多问题。
• select 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。
• select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是那个sock上有数
据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的sock每次都找一遍...
• select 只能监视1024个链接。
• select 不是线程安全的,如果你把一个sock加入到select, 然后突然另外一个线程发现,这个sock不用,要收回,这个select 不支持的,如果你丧心病狂的竟然关掉这个sock, select的标准行为是不可预测的
poll(了解)
于是14年以后(1997年)一帮人又实现了poll, poll 修复了select的很多问题,比如
• poll 去掉了1024个链接的限制,于是要多少链接呢, 主人你开心就好。
• poll 从设计上来说,不再修改传入数组,不过这个要看你的平台了,所以行走江湖,还是小心为妙。
其实拖14年那么久也不是效率问题, 而是那个时代的硬件实在太弱,一台服务器处理1千多个链接简直就是神一样的存在了,select很长段时间已经满足需求。 但是poll仍然不是线程安全的, 这就意味着,不管服务器有多强悍,你也只能在一个线程里面处理一组I/O流。
你当然可以那多进程来配合了,不过然后你就有了多进程的各种问题。
epoll(了解)
于是5年以后, 在2002, 大神 Davide Libenzi 实现了epoll.
epoll 可以说是I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝大部分问题, 比如:
• epoll 现在是线程安全的。
• epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了。
特点:异步,非阻塞
$ pstree |grep nginx
|-+= 81666 root nginx: master process nginx
| |--- 82500 nobody nginx: worker process
| \--- 82501 nobody nginx: worker process
1个master进程,2个work进程
每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么一直等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。这就是异步。此时,如果再有request 进来,他就可以很快再按这种方式处理。这就是非阻塞和IO多路复用。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。这就是异步回调。
Mainline version: 主线版,即开发版
Stable version: 最新稳定版,生产环境上建议使用的版本
Legacy versions: 遗留的老版本的稳定版
1.12
官方图示
操作示范
在yum.repos.d 目录下创建nginx.repo文件
1.15
RHEL/CentOS
Install the prerequisites:
sudo yum install yum-utils
To set up the yum repository, create the file named /etc/yum.repos.d/nginx.repo with the following contents:
[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
By default, the repository for stable nginx packages is used. If you would like to use mainline nginx packages, run the following command:
sudo yum-config-manager --enable nginx-mainline
To install nginx, run the following command:
sudo yum install nginx
When prompted to accept the GPG key, verify that the fingerprint matches 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62, and if so, accept it.
环境问题
getenforce //查看是否关闭selinux
systemctl status firewalld //查看是否关闭防火墙
yum -y install nginx
systemctl start nginx
systemctl enable nginx
nginx -V //查看安装附带的功能模块
测试
rpm -ql nginx //查看nginx所有文件
/etc/logrotate.d/nginx 日志轮转
/etc/nginx/nginx.conf 总配置文件
/etc/nginx/conf.d 子配置文件夹
/etc/nginx/conf.d/default.conf 默认的网站配置文件
/etc/nginx/fastcgi_params 动态网站模块文件-python,php所需的相关变量
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/koi-utf 字符集,文件编码
/etc/nginx/win-utf
/etc/nginx/koi-win
/etc/nginx/mime.types 文件关联程序(网站文件类型 和 相关处理程序)
/etc/nginx/modules 模块文件夹。第三方模
/etc/sysconfig/nginx
# Configuration file for the nginx service.
NGINX=/usr/sbin/nginx
CONFFILE=/etc/nginx/nginx.conf
/etc/sysconfig/nginx-debug
# Configuration file for the nginx-debug service.
NGINX=/usr/sbin/nginx-debug
CONFFILE=/etc/nginx/nginx.conf
LOCKFILE=/var/lock/subsys/nginx-debug
/usr/lib/systemd/system/nginx-debug.service nginx调试程序启动脚本
/usr/lib/systemd/system/nginx.service systemctl 服务脚本。
/usr/sbin/nginx 主程序
/usr/sbin/nginx-debug nginx调试程序
/usr/share/doc/nginx-1.12.1 文档
/usr/share/doc/nginx-1.12.1/COPYRIGHT
/usr/share/man/man8/nginx.8.gz man 手册
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html 默认主页
/var/cache/nginx 缓存各种
ls /var/cache/nginx/
client_temp fastcgi_temp proxy_temp scgi_temp uwsgi_temp
/var/log/nginx 日志文件夹
ls /var/log/nginx/
access.log error.log
/usr/lib64/nginx Nginx模块目录
nginx -V //查看nginx参数
nginx version: nginx/1.14.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: 配置参数./configure --help查询帮助
--prefix=/etc/nginx 安装路径
--sbin-path=/usr/sbin/nginx 程序文件
--modules-path=/usr/lib64/nginx/modules 模块路径
--conf-path=/etc/nginx/nginx.conf 主配置文件
--error-log-path=/var/log/nginx/error.log 错误日志
--http-log-path=/var/log/nginx/access.log 访问日志
--pid-path=/var/run/nginx.pid 程序ID
--lock-path=/var/run/nginx.lock 锁路径,防止重复启动nginx
--http-client-body-temp-path=/var/cache/nginx/client_temp 缓存
--http-proxy-temp-path=/var/cache/nginx/proxy_temp 代理缓存
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp php缓存
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp python缓存
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
--with-compat 启用动态模块兼容性
--user=nginx 用户
--group=nginx 组
--with-file-aio
使用nginx的aio特性会大大提高性能,比如图片站的特点是大量的读io操作,nginx aio不用等待每次io的结果,有助于并发处理大量io和提高nginx处理效率。
aio的优点就是能够同时提交多个io请求给内核,然后直接由内核的io调度算法去处理这些请求(directio),这样的话,内核就有可能执行一些合并,节约了读取文件的处理时间。 就是异步非阻塞
--with-threads 多线程模块
--with-http_addition_module
响应之前或者之后追加文本内容,比如想在站点底部追加一个js广告或者新增的css样式
--with-http_auth_request_module 认证模块
--with-http_dav_module
增加上传PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)默认情况下为关闭
--with-http_flv_module NGINX 添加MP4、FLV视频支持模块
--with-http_gunzip_module 压缩模块
--with-http_gzip_static_module
--with-http_mp4_module 多媒体模块
--with-http_random_index_module nginx显示随机首页模块
--with-http_realip_module Nginx获取真实IP模块
--with-http_secure_link_module nginx安全下载模块
--with-http_slice_module nginx中文文档
--with-http_ssl_module 安全模块
--with-http_stub_status_module 访问状态
--with-http_sub_module nginx替换网站响应内容
--with-http_v2_module
--with-mail 邮件客户端
--with-mail_ssl_module
--with-stream
负载均衡模块。nginx从1.9.0开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等。
--with-stream_realip_module
--with-stream_ssl_module
--with-stream_ssl_preread_module
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --
param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC'
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
分类
CoreModule 核心模块 (进程数等)
EventsModule 事件驱动模块(工作模式等)
HttpCoreModule http内核模块(文档程序类型,配置文件等)
vim /etc/nginx/nginx.conf
user nginx;
worker_processes 1; 启动的worker进程数量(CPU数量一致或auto)
error_log /var/log/nginx/error.log warn; 错误日志存放位置
pid /var/run/nginx.pid;
events { 事件
use epoll; 事件驱动模型epoll【默认】
worker_connections 1024; //每个worker进程允许处理的最大连接数,例如10240,65535
}
http {
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; 优化参数高效传输文件的模式
Nginx高级篇sendfile配置
sendfile: 设置为on表示启动高效传输文件的模式。sendfile可以让Nginx在传输文件时直接在磁盘和tcp socket之间传输数据。如果这个参数不开启,会先在用户空间(Nginx进程空间)申请一个buffer,用read函数把数据从磁盘读到cache,再从cache读取到用户空间的buffer,再用write函数把数据从用户空间的buffer写入到内核的buffer,最后到tcp socket。开启这个参数后可以让数据不用经过用户buffer。
#tcp_nopush on; 优化参数
也就是说tcp_nopush = on 会设置调用tcp_cork方法,这个也是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。
keepalive_timeout 65; 优化参数 长连接
#gzip on; 压缩参数
include /etc/nginx/conf.d/*.conf; 包含子配置文件夹
default_type application/octet-stream; 字节流处理方式
include /etc/nginx/mime.types; 文档和程序的关联记录
vim /etc/nginx/conf.d/default.conf (新创建的)
server { 默认网站配置文件
listen 80; 监听端口
server_name localhost;
FQDN
#charset koi8-r; 网页字符类型
#access_log /var/log/nginx/host.access.log main; 日志
location / {
root /usr/share/nginx/html; 主目录
index index.html index.htm; 默认主页名
}
#error_page 404 /404.html; 错误页面
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html; 错误页面
location = /50x.html { 错误页面
root /usr/share/nginx/html; 错误页面主目录
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80 代理设置
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 动态网站设置
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root 访问控制部分
# concurs with nginx's one
#location ~ /\.ht {
# deny all;
#}
}
vim /etc/nginx/conf.d/xuleilinux.conf
server{ listen 80; server_name xuleilinux.com; location /{ root /xuleilinux; index index.html ; } }
|
server 虚拟主机 listen 监听端口 server_name 服务器名称 location 网站目录设置 root 网站主目录在本地的路径 index 主页文件名 http{} 是整个服务器,所有虚拟主机的设置。 server{}是某一个虚拟主机的设置 location{} 是某一个页面的设置。
|
mkdir /xuleilinux
echo 美男子 > /xuleilinux/index.html
重启服务
域名解析和访问