Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供IMAP/POP3/SMTP服务 --引用百度百科css
主要功能:反向代理,经过配置文件能够实现集群和负载均衡,静态资源虚拟化html
客户端请求目标服务器之间的一个代理服务器
请求会先通过代理服务器,而后在请求转发到目标服务器,得到内容后在返回给相应到客户端
举例:去网吧上网,网吧就是一个正向代理服务器,咱们开机上网后访问的网站都是经过网吧的服务器,而后请求到目标服务器linux
用户请求目标服务器,由代理服务器决定访问哪一个ip
举例:去学校报到,提交报名表,由教务处决定分到哪一个班级,教务处就至关于反向代理服务器nginx
windows版本比较简单,直接下载启动就行了c++
我这边linux版本是CentOS7版本
安装步骤:web
安装Nginx
去官网http://nginx.org/下载对应的nginx包,
推荐使用稳定版本上传nginx到linux系统
面试
安装依赖环境
(1)安装gcc环境
yum install gcc-c++
(2)安装PCRE库,用于解析正则表达式
yum install -y pcre pcre-devel
(3)zlib压缩和解压缩依赖,
yum install -y zlib zlib-devel
(4)SSL 安全的加密的套接字协议层,用于HTTP安全传输,也就是https
yum install -y openssl openssl-devel
3.解压,须要注意,解压后获得的是源码,源码须要编译后才能安装
tar -zxvf nginx-1.16.1.tar.gz
4.编译以前,先建立nginx临时目录,若是不建立,在启动nginx的过程当中会报错
mkdir /var/temp/nginx -p
在nginx目录,输入以下命令进行配置,目的是为了建立makefile文件ajax
./configure \ --prefix=/usr/local/nginx \ --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 \ --with-http_ssl_module
注:\ 表明在命令行中换行,用于提升可读性配置命令:命令解释正则表达式
命令 | 解释 |
---|---|
–prefix | 指定nginx安装目录 |
–pid-path | 指向nginx的pid |
–lock-path | 锁定安装文件,防止被恶意篡改或误操做 |
–error-log | 错误日志 |
–http-log-path | http日志 |
–with-http_gzip_static_module | 启用gzip模块,在线实时压缩输出数据流 |
–http-client-body-temp-path | 设定客户端请求的临时目录 |
–http-proxy-temp-path | 设定http代理临时目录 |
–http-fastcgi-temp-path | 设定fastcgi临时目录 |
–http-uwsgi-temp-path | 设定uwsgi临时目录 |
–http-scgi-temp-path | 设定scgi临时目录 |
make编译
make
安装
make install
进入sbin目录启动
nginx./nginx
中止:
./nginx -s stop
从新加载:
./nginx -s reload
打开浏览器,访问虚拟机所处内网ip便可打开nginx默认页面,显示以下便表示安装成功:
注意事项:
1.若是在云服务器安装,须要开启默认的nginx端口:80
2.若是在虚拟机安装,须要关闭防火墙
3.本地win或mac须要关闭防火墙windows
查看防火墙状态
firewall-cmd --state
中止firewall
systemctl stop firewalld.service
禁止firewall开机启动
systemctl disable firewalld.service
./nginx -s stop 强制关闭,不管有没有客户在使用
./nginx -s quit 关闭,若是有客户在使用,等客户使用完在关闭
./nginx -t 校验配置文件
./nginx -v 查看版本号
./nginx -V 详细信息
./nginx -h 帮助文档
./nginx -c 指定特定的配置文件
Nginx有两个进程:
一个是master进程,是Nginx的主进程,只有一个
一个是work进程,是Nginx的工做进程,能够有多个,能够在配置文件里面配置多个
Nginx进程之间的关系:
由master下发指令给worker,由worker去连接客户端处理,二者的管理相似于老板于员工之间的关系
要了解worker抢占机制就要先明白一个名词‘惊群问题’
惊群问题是指在多线程(或多进程)场景下,有多个线程在等待某一资源可用,一旦这个资源可用,那么全部等待这个资源的线程都会被唤醒,可是资源只有一份,那么只有一个线程得到这个资源,其它线程都获取失败
惊群问题致使了没必要要的线程唤醒,实际上只有一个线程能获取这份资源,那么理想状况下只唤醒一个线程就好了。而唤醒多个线程致使了没必要要的线程调度,形成系统开销
而Nginx为了不惊群问题,就有了accept_mutex这个锁,在Nginx默认下是开启的,当accept_mutex开启后,任意时刻只有一个进程能得到accept_mutex锁,得到accept_mutex锁的进程能监听web端口;没法得到accept_mutex锁的进程会把监听套接字从其epoll中删除
也就是锁master会fork出多个worker,当一个请求过来以后,多个worker会抢占的accept_mutex这个锁,只有有这个锁的worker才有资格处理这个请求
在Linux环境下用的是epoll模型,当一个请求进入到worker中若是他阻塞了,那么worker会去处理其余的请求,这样一个worker就能够‘同时’处理一百上千个请求。
这四个概念两两组合,会造成4个新的概念,以下:
设置worker进程的用户,指的linux中的用户,会涉及到nginx操做目录或文件的一些权限,默认为nobody
user root;
worker进程工做数设置,通常来讲CPU有几个,就设置几个,或者设置为N-1也行
worker_processes 1;
nginx 日志级别debug | info | notice | warn | error | crit | alert | emerg,错误级别从左到右愈来愈大
设置nginx进程
pidpid logs/nginx.pid;
设置工做模式
events { # 默认使用epoll use epoll; # 每一个worker容许链接的客户端最大链接数 worker_connections 10240; }
http 是指令块,针对http网络传输的一些指令配置
http { }
include 引入外部配置,提升可读性,避免单个配置文件过大
include mime.types;
设定日志格式,main为定义的格式名称,如此 access_log 就能够直接使用这个变量了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ufp2OnC5-1586509226566)(en-resource://database/1286:1)]
参数名 | 参数意义 |
---|---|
$remote_addr | 客户端ip |
$remote_user | 远程客户端用户名,通常为:’-’ |
$time_local | 时间和时区 |
$request | 请求的url以及method |
$status | 响应状态码 |
$body_bytes_send | 响应客户端内容字节数 |
$http_referer | 记录用户从哪一个连接跳转过来的 |
$http_user_agent | 用户所使用的代理,通常来时都是浏览器 |
$http_x_forwarded_for | 经过代理服务器来记录客户端的ip |
sendfile
使用高效文件传输,提高传输性能。启用后才能使用tcp_nopush
,是指当数据表累积必定大小后才发送,提升了效率。
sendfile on; tcp_nopush on;
keepalive_timeout
设置客户端与服务端请求的超时时间,保证客户端屡次请求的时候不会重复创建新的链接,节约资源损耗。
#keepalive_timeout 0; keepalive_timeout 65;
gzip启用压缩,html/js/css压缩后传输会更快
gzip on;
server能够在http指令块中设置多个虚拟主机
server { listen 88; server_name localhost; location / { root html; index index.html index.htm; } }
server { # 访问的端口 listen 90; # 访问的路径 server_name localhost; # 路由的配置 location / { # 资源的存放路径 root /home/software/foodie-shop; # 默认打开界面 index index.html index.htm; } }
server { # 访问的端口 listen 90; # 访问的路径 server_name localhost; # 路由的配置 location /test { root /home; } }
文件存放路径
网站访问路径
#正则表达式。*表明不区分大小写 location ~* \.(GIF|png|bmp|jpg|jpeg){ root /home; } #精确匹配 location = /{ root /home; } #^~ 以某个字符路径开头请求 location ^~ /imooc/img{ root /home; } #^~ 以某个字符路径开头请求 location ^~ /imooc/img{ root /home; } #默认匹配规则 location / { root /home; }
注:本篇文章一些图片来自于网络