文章目录
- Nginx介绍
- Nginx环境准备
- 配置文件
- Nginx启动、停止
- 自定义错误页
- 访问控制
- 虚拟主机设置
- 基于端口号
- 基于域名
- 基于ip
- 反向代理设置
- 适配PC或移动设备
- Gzip压缩配置
也入门前端挺久的了,但一直对Nginx的理解比较模糊,每次需要的时候就去百度如何配置,学习比较零散,本周末终于奋起看了一个非常系统的教程
Nginx介绍
“Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其有极好的IO性能,时常用于服务端的反向代理和负载均衡。”
Nginx环境准备
这里我是使用公司的内部的虚拟机,操作系统是centos7.2。 安装必要程序:
yum -y install gcc gcc-c++ autoconf pcre-devel make automake
yum -y install wget httpd-tools vim
一般系统会默认有个目录:/usr/share/nginx/html 用来存放项目代码,也可以自己自定义,不过要与nginx的配置文件root配置项匹配,后面会介绍到。
安装Nginx:
yum install nginx
查看Nginx:
nginx -v
如果能输出nginx的版本号,则安装成功,如下图:
配置文件
nginx配置文件一般默认放在 /etc/nginx 下,核心配置是nginx.conf、和conf.d目录下。
conf.d目录下的配置文件可以在nginx.conf中按需引入。
// Nginx.conf
user nginx; #运行用户,默认是nginx
worker_processes auto;
error_log /var/log/nginx/error.log; # 错误日志存放目录
events {
worker_connections 1024; #单个后台进程最大的并发数
}
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;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf; # 包含的子配置项
server {
listen 80 default_server; # 监听的端口
server_name _; # 配置域名,需要域名解析,没有的可以不配置,访问ip即可
location / {
root /usr/share/nginx/html; #服务默认启动目录(项目所在位置)
index index.html; # 默认访问文件
}
error_page 404 /404.html; # 404页面
location = /40x.html {
}
error_page 500 502 503 504 /50x.html; # 配置5xx页面
location = /50x.html {
}
}
}
Nginx启动、停止
启动:
nginx
停止:
nginx -s quit
//or
nginx -s stop
查看是否停止了服务:
ps aux | grep nginx
有这三条记录,证明nginx服务被开启了:
root 23810 0.6 0.0 120720 2316 ? Ss 16:00 0:00 nginx: master process nginx nginx 23811 0.0 0.0 133384 3584 ? S 16:00 0:00 nginx: worker process root 23860 0.0 0.0 116816 1052 pts/0 S+ 16:00 0:00 grep --color=auto nginx
每次修改完nginx配置文件,需要先停止Nginx服务,再启动。 如果上面的停止服务命令没有用,可以使用kill方法杀死进程:
killall nginx
自定义错误页
错误页包括404错误、5xx错误,其配置方法一样:
...
http {
...
server {
# 当用户访问一个不存在的页面时,显示404.html 页面
error_page 404 /404.html;
# 当服务器端出错时,即发生500 502等错误时,显示50x.html页面
error_page 500 502 503 504 /50x.html;
}
...
}
...
访问控制
nginx可以配置拒绝哪些ip可以访问我们的网站,这对于网站的安全还是很重要的。
http {
server {
location / {
allow 允许访问的ip地址;
deny all;
}
}
}
这里权限控制有一个优先级,写在前面的优先级高。如果先 deny all; 再allow ip;,那么allow ip 就会失效,因为先匹配了deny all。
如果允许所有用户可以访问image目录,只有内网ip可以访问admin目录,禁止所有用户访问php文件,则:
http {
location =/image {
allow all;
}
location =/admin {
allow 内网ip;
deny all;
}
location ~\.php$ {
deny all;
}
}
= 代表精确匹配,~代表正则匹配。
虚拟主机设置
我们只有一台主机,如果我们想放多个项目,提供多个web服务,让用户通过不同的端口号或者域名等访问不同的项目,就可以设置虚拟主机,不用再去购买一台服务器了。
基于端口号
Nginx可以监听多个端口,我们可以通过监听不同的端口号,来区分不同的网站。
http {
server { // 默认的
listen 80;
location / {
root /usr/share/nginx/html; # 项目1的目录
index index.html;
}
}
server {
listen 8001;
location / {
root /usr/share/nginx/html/8001html; # 项目2的目录
index index.html
}
}
}
这样就可以通过不同的端口号访问不同的项目了。
基于域名
域名需要自己买,然后将域名解析,方可使用。 在Nginx中是通过server_name字段配置域名的。server_name 域名。配置好之后就可以通过域名直接访问网站了。
基于ip
这里需要你的服务器支持多个ip,将server_name字段配置成ip地址即可。
反向代理设置
关于正向代理反向代理的区别可以去我的博客上学习:正向代理和反向代理 反向代理是通过proxy_pass字段配置:
server {
location / {
proxy_pass 代理的ip或域名
}
}
适配PC或移动设备
在这之前我理解的前端适配仅仅是前端通过媒体查询和栅格布局来完成,使得在不同的设备上都有一个良好的显示效果,但是这样会比较复杂,易用性也不好。所以可以将pc端与移动端的布局样式写分开,Nginx通过判断user-agent来决定展示哪个页面。
Nginx有内置变量$http_user_agent
server{
listen 80;
location / {
root /usr/share/nginx/pc;
if ($http_user_agent ~* '(Android|webOS|iPhone|iPad)') {
root /usr/share/nginx/mobile;
}
index index.html;
}
}
~*表示不区分大小写匹配,默认显示pc端页面,如果匹配到用户是移动端设备,就显示移动端页面。
Gzip压缩配置
http {
gzip on; # off
gzip_types text/plain application/javascript text/css;
}
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压缩。