by Janden.Ma at 2019-01
本教程使用Linux(CentOS 7)作为操作系统,建议配置Linux虚拟机,或购买Linux云服务器;
如果没使用过Linux或对于Linux命令行不熟悉的小伙伴,请先学习Linux入门。
去粗取精,去伪存真,稳扎稳打,实事求是。
一、什么是Nginx
如果你不是一个前端开发人员或是入门级的前端开发,也许你没听过Nginx,但如果你是一个初级往上的前端开发,就一定听说过Nginx。如果你用过它,那么你应该不会是一个「切图仔」...
Nginx作为一个轻量级的HTTP服务器,它具有极好的IO性能,这得力于它采用事件驱动的异步非阻塞处理方式框架。这使得它时常用于服务端的反向代理和负载均衡。
事件驱动:即当前时间点发出事件请求的时候,立即调动可用资源,完成事件请求,以保证事务及时高效地解决,避免滞缓堆积。
异步:也被称为并发,与同步(也叫串行)对立,属于消息通信机制。同步机制在发出请求后,在没有得到结果之前,会一直等待,可能会「占线」。而异步机制在发起请求后,就去干别的事情了,然后通过「轮询」或「回调」的方式,来试探结果。
轮询和回调:所谓的轮询,就是在间断的时间周期里「打电话」向被请求者要结果,效率相对会比较低。而回调则属于订阅模式,在被请求者得到结果后,第一时间通知请求者。
负载均衡:即调度者把原本由一个服务器(或一个执行单元)的压力(我们成为「负载」),分摊给多个服务器(或多个执行单元)来执行,由单一服务变为集群服务,从而保持整体性能达到最优。
反向代理:服务端将客户端的请求,经过解析后,从其关系的一组或多组服务器(簇)上获取资源,并返回给客户端。换句话说,就好比你在商城买东西,这东西不一定是该商城直接生产提供的,可能是从多个供应商那里采购来的,你只知道这个商城有卖,但不一定知道供应商是谁。
优点
1.消耗内存较小
2.支持海量高并发
3.开源免费试用
4.可商业化
5.配置简单
版本
1.Mainline version:即开发版本,主要是供开发者或爱好者研究、学习、测试用,也就是折腾用的,不建议用在生产环境。
2.Stable version:即稳定版本,也就是传说中的长期更新版本,比较稳定、成熟。
3.Legacy version:即历史版本。
二、环境配置
环境准备
我们建议使用Linux虚拟机或购买Linux云服务器,鉴于虚拟机或服务器的内存一般都不大,推荐使用无桌面环境的CentOS 7,如果家里有矿,那么装个有桌面环境的deepin或者Ubuntu都是可以的。
采用虚拟机的小伙伴,这里提供下载镜像(想下载其他的也行,我下面提供的是CentOS 7.5的minimal版本)
阿里开源镜像:https://mirrors.aliyun.com/centos/7.5.1804/isos/x86_64/
网易开源镜像:http://mirrors.163.com/centos/7.5.1804/isos/x86_64/
采用虚拟机的话,安装成功后要进行网卡配置以及vim,自行搜索,或等后续Linux教程。
环境配置
1.安装编译器等必要程序
yum -y install gcc gcc-c++ autoconf pcre-devel makeautomake
2.配置yum的Nginx源
(1)创建nginx.repo文件
vim /etc/yum.repos.d/nginx.repo
(2)写入内容,里边的/centos/7根据你的操作系统和版本进行变换
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
3.安装Nginx
yum install nginx -y
4.查看版本,如果正常就说明安装成功
nginx -v
5.查看文件安装路径
rpm -q -l nginx
三、配置文件解读
1.nginx.conf,这是Nginx的总配置文件,位于/etc/nginx下
(1)进入配置文件
cd/etc/nginx
vim nginx.conf
(2)配置文件注释
#用户,一般为Nginx
user nginx;
#Nginx进程,一般设置为和CPU核数一样
worker_processes1;
#错误日志存放目录
error_log /var/log/nginx/error.log warn;
#进程pid存放位置
pid /var/run/nginx.pid;
events {
# 单个后台进程的最大并发数
worker_connections1024;
}
http {
#文件扩展名与类型映射表
include /etc/nginx/mime.types;
#默认文件类型
default_type application/octet-stream;
#nginx日志模式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#nginx访问日志存放位置
access_log /var/log/nginx/access.log main;
#开启高效传输模式
sendfile on;
#减少网络报文段的数量
#tcp_nopush on;
#超时时间
keepalive_timeout 65;
#开启gzip压缩
#gzip on;
#包含的子配置项位置和文件
include /etc/nginx/conf.d/*.conf;
}
2.default.conf,服务器默认配置,位于/etc/nginx/conf.d下
(1)进入配置文件
cd/etc/nginx/conf.d
vim default.conf
(2)配置文件注释
server {
#配置监听端口
listen 80;
#配置域名
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
#服务默认启动目录
root /usr/share/nginx/html;
#默认访问文件
index index.html index.htm;
}
#配置404页面
#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;
#}
四、Nginx的启动、停止、重启
启动
nginx命令启动
nginx
Linux的系统控制命令启动(推荐,好管理)
systemctl start nginx.service
一般启动成功不会有任何提示,反之会有报错,一般是端口被占用
停止
nginx命令停止(必须之前是通过nginx命令启动)
1.强制停止,不等待
nginx -s stop
2.逐步关闭退出(推荐)
nginx -s quit
Linux的系统控制命令停止(必须之前是通过此命令启动)
systemctl stop nginx.service
Linux进程命令停止
kill all nginx
重启
nginx命令重启(必须之前是通过nginx命令启动)
nginx -s reopen
Linux的系统控制命令重启(必须之前是通过此命令启动)
systemctl restart nginx.service
重新加载配置项,需先停止服务
nginx -s reload
五、访问权限控制
在default.conf中,可以通过allow或者deny来控制访问权限。
1.简单的控制
location / {
#deny all; #如果此句在前,则所有都不能访问
allow127.0.0.1;#允许127.0.0.1访问
deny all;
}
2.复杂的控制,“=”代表精确匹配
location=/guest{
deny all;#如果匹配到guest,拒绝所有
}
3.正则表达式控制
location ~\.jsp$ {
allow all;#如果访问的是.jsp文件,全部放行
}
六、配置虚拟主机
配置虚拟主机,可以虚拟的将一个服务主机划分成多个虚拟服务器,每台主机都能独立的对外提供服务,互不干扰。Nginx提供基于端口号、IP和域名三种方式来配置虚拟主机。
基于端口号
在default.conf同级目录新建conf配置,监听其他端口即可
#8080.conf
server{
listen8080;
server_name localhost;
root /usr/app/xxx/www;
index index.html;
}
基于IP
一般来说,服务器不会有多个IP,所以很少用到
#default.conf
server{
listen80;
server_name111.111.111.111;
}
基于域名
相对来说,这种比较常用
#default.conf
server{
listen80;
server_name default.xxx.com;
}
#new.conf
server{
listen80;
server_name new.xxx.com;
root /usr/app/xxx/www;
index new.html;
}
七、配置反向代理
延续上面的例子,如果我访问new.xxx.com的时候,服务器让他方向代理到default.xxx.com,那么需要做一个配置
#new.conf
server{
listen80;
server_name new.xxx.com;
location / {
proxy_pass http://default.xxx.com;
}
}
其它反向代理指令
proxy_set_header :在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息。
proxy_connect_timeout:配置Nginx与后端代理服务器尝试建立连接的超时时间。
proxy_read_timeout : 配置Nginx向后端服务器组发出read请求后,等待相应的超时时间。
proxy_send_timeout:配置Nginx向后端服务器组发出write请求后,等待相应的超时时间。
proxy_redirect :用于修改后端服务器返回的响应头中的Location和Refresh。
八、适配PC和移动端
其实在web领域,关于适配PC和移动端的方法一直颇有争论,有人说用自适应,有人说前端用js判断做出不同渲染,有人说做两套...其实各有利弊,nginx其实也提供了判断客户端类型的方法,来判断用户处于PC还是移动端,从而读取不同的页面给用户。
#default.conf
server{
listen80;
server_name xxx.com;
location / {
root /usr/share/nginx/pc;
if($http_user_agent~*'(Android|webOS|iPhone|iPod|BlackBerry)') {
root /usr/share/nginx/mobile;
}
index index.html;
}
}
九、配置GZip压缩
Gzip是网页的一种网页压缩技术,经过gzip压缩后,页面体积变小,渲染速度更快。
Nginx提供了专门的gzip模块,并且模块中的指令非常丰富。
gzip:该指令用于开启或 关闭gzip模块。
gzip_buffers:设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。
gzip_comp_level:gzip压缩比,压缩级别是1-9,1的压缩级别最低,9的压缩级别最高。压缩级别越高压缩率越大,压缩时间越长。
gzip_disable:可以通过该指令对一些特定的User-Agent不使用压缩功能。
gzip_min_length:设置允许压缩的页面最小字节数,页面字节数从相应消息头的Content-length中进行获取。
gzip_http_version:识别HTTP协议版本,其值可以是1.1.或1.0.
gzip_proxied:用于设置启用或禁用从代理服务器上收到相应内容gzip压缩。
gzip_vary:用于在响应消息头中添加Vary:Accept-Encoding,使代理服务器根据请求头中的Accept-Encoding识别是否启用gzip压缩。
gzip_types:用于设置压缩文件类型。
在nginx.conf文件中配置
http{
#gzip on;
#gzip_comp_level 5;
#gzip_types application/javascript text/css;#压缩js和css文件
}