Nginx是一个高性能WEB服务器,除它以外Apache、Tomcat、Jetty、IIS,它们都是Web服务器,或者叫作WWW(World Wide Web)服务器,相应地也都具有Web服务器的基本功能。Nginx 相对基它WEB服务有什么优点呢?css
(1)Tomcat、Jetty 面向java语言,先天就是重量级的WEB服务器,其性能与Nginx没有可比性。html
(2)IIS只能在Windows操做系统上运行。Windows做为服务器在稳定性与其余一些性能上都不如类UNIX操做系统,所以,在须要高性能Web服务器的场合下IIS并不占优。java
(3)Apache的发展时期很长,并且是目前毫无争议的世界第一大Web服务器,其有许多优势,如稳定、开源、跨平台等,但它出现的时间太长了,在它兴起的年代,互联网的产业规模远远比不上今天,因此它被设计成了一个重量级的、不支持高并发的Web服务器。在Apache服务器上,若是有数以万计的并发HTTP请求同时访问,就会致使服务器上消耗大量内存,操做系统内核对成百上千的Apache进程作进程间切换也会消耗大量CPU资源,并致使HTTP请求的平均响应速度下降,这些都决定了Apache不可能成为高性能Web服务器,这也促使了Lighttpd和Nginx的出现。 下图能够看出07年到18 年强劲增加势头。linux
安装环境准备nginx
(1)Liunx 内核 2.6 及以上版本 : 只有 2.6 以后才支持了 epoll,在此以前使用 select 或 poll 多路复用的 IO 模型,没法解决高并发压力的问题。经过命令 uname -a 便可查看。c++
#查看 linux 内核
uname -a
复制代码
(2)GCC编译器 GCC(GNU Compiler Collection)可用来编译C语言程序。Nginx不会直接提供二进制可执行程序,只能下载源码进行编译。web
(3)PCRE库 PCRE(Perl Compatible Regular Expressions,Perl兼容正则表达式)是由Philip Hazel开发的函数库,目前为不少软件所使用,该库支持正则表达式。正则表达式
(4)zlib库 zlib库用于对HTTP包的内容作gzip格式的压缩,若是咱们在nginx.conf里配置了gzip on,并指定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减小网络传输量。windows
(5)OpenSSL开发库 若是咱们的服务器不仅是要支持HTTP,还须要在更安全的SSL协议上传输HTTP,那么就须要拥有OpenSSL了。另外,若是咱们想使用MD五、SHA1等散列函数,那么也须要安装它。安全
上面几个库都是Nginx 基础功能所必需的,为简单起见咱们能够经过yum 命令统一安装。
#yum 安装nginx 环境
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel
源码获取:
nginx 下载页:http://nginx.org/en/download.html 。
** # 下载nginx 最新稳定版本
wget http://nginx.org/download/nginx-1.15.9.tar.gz
#解压
tar -zxvf nginx-1.15.9.tar.gz
最简单的安装:
# 所有采用默认安装
./configure
make && make install
执行完成以后 nginx 运行文件 就会被安装在 /usr/local/nginx 下。
基于参数构建
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-debug
控制命令:
#默认方式启动:
./sbin/nginx
#指定配置文件启动
./sbing/nginx -c /tmp/nginx.conf
#指定nginx程序目录启动
./sbin/nginx -p /usr/local/nginx/
#快速中止
./sbin/nginx -s stop
#优雅中止
./sbin/nginx -s quit
# 热装载配置文件
./sbin/nginx -s reload
# 从新打开日志文件
./sbin/nginx -s reopen
复制代码
架构说明:
(1)nginx启动时,会生成两种类型的进程,一个是主进程(Master),一个(windows版本的目前只有一个)和多个工做进程(Worker)。主进程并不处理网络请求,主要负责调度工做进程,也就是图示的三项:加载配置、启动工做进程及非停升级。因此,nginx启动之后,查看操做系统的进程列表,咱们就能看到至少有两个nginx进程。
(2)服务器实际处理网络请求及响应的是工做进程(worker),在类unix系统上,nginx能够配置多个worker,而每一个worker进程均可以同时处理数以千计的网络请求。
(3)模块化设计。nginx的worker,包括核心和功能性模块,核心模块负责维持一个运行循环(run-loop),执行网络请求处理的不一样阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。而其代码的模块化设计,也使得咱们能够根据须要对功能模块进行适当的选择和修改,编译成具备特定功能的服务器。
(4)事件驱动、异步及非阻塞,能够说是nginx得以得到高并发、高性能的关键因素,同时也得益于对Linux、Solaris及类BSD等操做系统内核中事件通知及I/O性能加强功能的采用,如kqueue、epoll及event ports。
(1)配置文件语法格式
(2)配置第一个静态WEB服务
(3)配置案例
a. 动静分离实现
b. 防盗链
c. 多域名站点
d. 下载限速
e. IP 黑名单
f. 基于user-agent分流
复制代码
(4)日志配置
一、配置文件的语法格式: 先来看一个简单的nginx 配置
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /nginx_status {
stub_status on;
access_log off;
}
}
}
复制代码
上述配置中的events、http、server、location、upstream等属于配置项块。而worker_processes 、worker_connections、include、listen 属于配置项块中的属性。 /nginx_status 属于配置块的特定参数参数。其中server块嵌套于http块,其能够直接继承访问Http块当中的参数。
配置块 | 名称开头用大口号包裹其对应属性 |
属性 | 基于空格切分属性名与属性值,属性值可能有多个项 都以空格进行切分 如:access_log logs/host.access.log main |
参数 | 其配置在 块名称与大括号间,其值若是有多个也是经过空格进行拆 |
注意 若是配置项值中包括语法符号,好比空格符,那么须要使用单引号或双引号括住配置项值,不然Nginx会报语法错误。例如:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
复制代码
二、配置第一个静态WEB服务
基础站点演示:
基本配置介绍说明:
(1)监听端口 语法:listen address
: 默认:listen 80
; 配置块:server
(2)主机名称 语法:server_name name[……]
; 默认:server_name ""
; 配置块:server
server_name
后能够跟多个主机名称,如server_name
www.testweb.com
、download.testweb.com
;。 支持通配符与正则
(3)location 语法:location[=|~|~*|^~|@]/uri/{……}
配置块:server
动静分离演示:
location /static
~* \.(gif|png|css|js)$
基于目录动静分离 server {
listen 80;
server_name *.luban.com;
root /usr/www/luban;
location / {
index luban.html;
}
location /static {
alias /usr/www/static;
}
}
复制代码
基于正则动静分离
location ~* \.(gif|jpg|png|css|js)$ {
root /usr/www/static;
}
复制代码
防盗链配置演示: 加入至指定location 便可实现
valid_referers none blocked *.luban.com;
if ($invalid_referer) {
return 403;
}
复制代码
下载限速:
location /download {
limit_rate 1m;
limit_rate_after 30m;
}
复制代码
建立IP黑名单 建立黑名单文件
echo 'deny 192.168.0.132;' >> balck.ip
#http 配置块中引入 黑名单文件
include black.ip;
复制代码
三、日志配置: 日志格式:
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 logs/access.log main;
复制代码
基于域名打印日志
access_log logs/$host.access.log main;
复制代码
error
日志的设置
语法:error_log /path/file level
;
默认:error_log logs/error.log error
;
level
是日志的输出级别,取值范围是debug、info、notice、warn、error、crit、alert、emerg
,针对指定的客户端输出debug级别的日志
语法:debug_connection[IP|CIDR]
events {
debug_connection 192.168.0.147;
debug_connection 10.224.57.0/200;
}
复制代码