Skip to content

Nginx学习笔记

Nginx

官方文档:http://nginx.org/

中文文档:nginx 中文文档

目录信息

# Nginx配置文件
/etc/nginx/nginx.conf # nginx 主配置文件
/etc/nginx/nginx.conf.default

# 可执行程序文件
/usr/bin/nginx-upgrade
/usr/sbin/nginx

# nginx库文件
/usr/lib/systemd/system/nginx.service # 用于配置系统守护进程
/usr/lib64/nginx/modules # Nginx模块目录

# 帮助文档
/usr/share/doc/nginx-1.16.1
/usr/share/doc/nginx-1.16.1/CHANGES
/usr/share/doc/nginx-1.16.1/README
/usr/share/doc/nginx-1.16.1/README.dynamic
/usr/share/doc/nginx-1.16.1/UPGRADE-NOTES-1.6-to-1.10

# 静态资源目录
/usr/share/nginx/html/404.html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html

# 存放Nginx日志文件
/var/log/nginx
  1. /etc/nginx/conf.d/ 是子配置项存放处, /etc/nginx/nginx.conf 主配置文件会默认把这个文件夹中所有子配置项都引入;
  2. /usr/share/nginx/html/ 静态文件都放在这个文件夹,也可以根据你自己的习惯放在其他地方;

Nginx应用场景

使用场景

  1. 静态资源服务,通过本地文件系统提供服务;
  2. 反向代理服务,延伸出包括缓存、负载均衡等;
  3. API 服务, OpenResty

常用命令

# 开机配置
systemctl enable nginx # 开机自动启动
systemctl disable nginx # 关闭开机自动启动

# 启动Nginx
systemctl start nginx # 启动Nginx成功后,可以直接访问主机IP,此时会展示Nginx默认页面

# 停止Nginx
systemctl stop nginx

# 重启Nginx
systemctl restart nginx

# 重新加载Nginx
systemctl reload nginx

# 查看 Nginx 运行状态
systemctl status nginx

# 查看Nginx进程
ps -ef | grep nginx

# 杀死Nginx进程
kill -9 pid # 根据上面查看到的Nginx进程号,杀死Nginx进程,-9 表示强制结束进程

nginx -s reload  # 向主进程发送信号,重新加载配置文件,热重启
nginx -s reopen  # 重启 Nginx
nginx -s stop    # 快速关闭
nginx -s quit    # 等待工作进程处理完成后关闭
nginx -T         # 查看当前 Nginx 最终的配置
nginx -t         # 检查配置是否有问题

全局配置

nginx.conf

json
user nginx;
worker_processes 1; 	#worker_processes表示工作进程个数,值越大nginx处理能力越强
error_log /var/log/nginx/error.log warn; 	#记录错误日志信息
pid /var/run/nginx.pid; 	#记录nginx的进程信息
events {
 worker_connections 1024; #worker_connections值越大,nginx处理越强
}

Location路径映射

yaml
#1、精确匹配
location = /abc {
     #/abc/aaa/bb 不匹配
     #/abc/  不匹配
     #/Abc  不匹配
     #/abc  匹配
}
#2、通用匹配
location /abc {
    # 匹配所有以/abc开头的请求
    # /abc/abb/aacc 匹配
    # /abc/  匹配
    # /abc 匹配
    # /aaa/abc 不匹配
}
#3、正则匹配
location ~ /xxx{
     #匹配以/xxx开头的,并且区分大小写
}
location ~* /xxx{
     #匹配以/xxx开头的,并且不区分大小写
}
location ^~ /images/{
    #匹配以images开头
}
location ~* \.(gif|jpg|png)$ {
    #匹配以.gif|.jpg|.png结尾的请求的,而且不区分大小写
}
#4、全部匹配
location /{
    #匹配所有
}

虚拟主机

json
ports:
  - 8081:8081 #指定端口号的映射
  - 8082:8082 #指定端口号的映射

#vim /nginx/conf.d/default.conf
server {
    listen 8081;
    server_name localhost;
    location / {
        root	/usr/share/nginx/html-8081;
        index 	index.html index.htm;
    }
}
server {
    listen 8082;
    server_name localhost;
    location / {
        root /usr/share/nginx/html-8082;
        index index.html index.htm;
    }
}
#分别会访问/usr/share/nginx/html-8081(8082)下的index.html文件

侦听端口

json
server {  
    # Standard HTTP Protocol 
    listen 80; 
    # Standard HTTPS Protocol 
    listen 443 ssl; 
    # For http2  
    listen 443 ssl http2; 
    # Listen on 80 using IPv6 
    listen [::]:80; 
    # Listen only on using IPv6 
    listen [::]:80 ipv6only=on;
}

访问日志

json
server { 
    # Relative or full path to log file 
    access_log /path/to/file.log;  
    # Turn 'on' or 'off'  
    access_log on;
}

域名

json
server {
    # Listen to yourdomain.com 
    server_name yourdomain.com;  
    # Listen to multiple domains  server_name yourdomain.com www.yourdomain.com; 
    # Listen to all domains
    server_name *.yourdomain.com; 
    # Listen to all top-level domains 
    server_name yourdomain.*; 
    # Listen to unspecified Hostnames (Listens to IP address itself) 
    server_name "";
}

静态资源

json
server {  
    listen 80;  
    server_name yourdomain.com;  
    location / {      
        root /path/to/website; 
    }
}

重定向

json
server { 
    listen 80;
    server_name www.yourdomain.com;
    return 301 http://yourdomain.com$request_uri;
}

server {
    listen 80; 
    server_name www.yourdomain.com; 
    location /redirect-url { 
    	return 301 http://otherdomain.com; 
    }
}

反向代理

json
server { 
    listen 80; 
    server_name yourdomain.com;
    #反向代理将请求转发给3000
    location / {  
    	proxy_pass http://0.0.0.0:3000; 
    }
}

负载均衡

json
负载均衡策略:
    backup:热备,等主服务器停止工作了,备份机才工作
    轮询:将客户端的请求轮流分配给不同的主机
    权重:可以设置多台服务器的接收百分比!
    ip_hash:基于客户端的ip进行服务器分配
    fair:根据服务器的请求时间来进行分配
    url_hash:基于请求的地址进行服务器分配
json
#vim /nginx/conf.d/default.conf

#1
upstream node_js { 
    #默认nginx采用的是轮询策略
    server 0.0.0.0:3000; 
    server 0.0.0.0:4000; 
    server 123.131.121.122;
    }
#2
upstream tomcats{
    server 192.168.127.130:8080;
    server 192.168.127.130:8081 backup; #热备
}
#3
upstream tomcats{
    server 192.168.127.130:8080 weight=2; #权重
    server 192.168.127.130:8081 weight=1;
}
#4
upstream tomcats{
    ip_hash; #ip_hash策略
    server 192.168.127.130:8080;
    server 192.168.127.130:8081; 
}

server {  
    listen 80; 
    server_name localhost;
    location / {    
    	proxy_pass http://node_js; 
    }
}

SSL 协议

json
server { 
    listen 443 ssl; 
    server_name yourdomain.com;
    ssl on; 
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/privatekey.pem; 
    ssl_stapling on;
    ssl_stapling_verify on; 
    ssl_trusted_certificate /path/to/fullchain.pem; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_session_timeout 1h;
    ssl_session_cache shared:SSL:50m;
    add_header Strict-Transport-Security max-age=15768000;
}
# Permanent Redirect for HTTP to HTTPS
server {  
    listen 80;  
    server_name yourdomain.com; 
    return 301 https://$host$request_uri;
}

动静分离

json
server{
    listen 80;
    server_name localhost;
    
    #代理动态资源
    location /{
        proxy_pass http://192.168.127.130:8080;
    }
     #静态资源配置
    location /html {
     	root /data;	#静态资源的路径
     	index index.html; #默认访问的资源
    }
    location /img {
     	root /data;
     	autoindex on;#以列表显示当前目录下的所有图片
    }
}

HTTPS

工作流程
  1. 客户端(浏览器)访问 https://www.baidu.com 百度网站;
  2. 百度服务器返回 HTTPS 使用的 CA 证书;
  3. 浏览器验证 CA 证书是否为合法证书;
  4. 验证通过,证书合法,生成一串随机数并使用公钥(证书中提供的)进行加密;
  5. 发送公钥加密后的随机数给百度服务器;
  6. 百度服务器拿到密文,通过私钥进行解密,获取到随机数(公钥加密,私钥解密,反之也可以);
  7. 百度服务器把要发送给浏览器的内容,使用随机数进行加密后传输给浏览器;
  8. 此时浏览器可以使用随机数进行解密,获取到服务器的真实传输内容;
配置证书

下载证书压缩文件,里面有个 Nginx 文件夹,把 xxx.crtxxx.key 文件拷贝到服务器目录,再进行配置:

server {
  listen 443 ssl http2 default_server;   # SSL 访问端口号为 443
  server_name lion.club;         # 填写绑定证书的域名(我这里是随便写的)
  ssl_certificate /etc/nginx/https/lion.club_bundle.crt;   # 证书地址
  ssl_certificate_key /etc/nginx/https/lion.club.key;      # 私钥地址
  ssl_session_timeout 10m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 支持ssl协议版本,默认为后三个,主流版本是[TLSv1.2]

  location / {
    root         /usr/share/nginx/html;
    index        index.html index.htm;
  }
}

如此配置后就能正常访问 HTTPS 版的网站

跨域 CORS

例如:

  • 前端 server 的域名为: fe.server.com
  • 后端服务的域名为: dev.server.com

现在我在 fe.server.comdev.server.com 发起请求一定会出现跨域。

现在我们只需要启动一个 Nginx 服务器,将 server_name 设置为 fe.server.com 然后设置相应的 location 以拦截前端需要跨域的请求,最后将请求代理回 dev.server.com 。如下面的配置:

nginx
server { 
    listen      80; 
    server_name  fe.server.com; 
    location / {  
        proxy_pass dev.server.com; 
    }
}

这样可以完美绕过浏览器的同源策略: fe.server.com 访问 Nginxfe.server.com 属于同源访问,而 Nginx 对服务端转发的请求不会触发浏览器的同源策略。

gzip 压缩

GZIP 是规定的三种标准 HTTP 压缩格式之一。目前绝大多数的网站都在使用 GZIP 传输 HTMLCSSJavaScript 等资源文件。

对于文本文件, GZiP 的效果非常明显,开启后传输所需流量大约会降至 1/4~1/3

并不是每个浏览器都支持 gzip 的,如何知道客户端是否支持 gzip 呢,请求头中的 Accept-Encoding 来标识对压缩的支持。

启用 gzip 同时需要客户端和服务端的支持,如果客户端支持 gzip 的解析,那么只要服务端能够返回 gzip 的文件就可以启用 gzip 了,我们可以通过 Nginx 的配置来让服务端支持 gzip

responecontent-encoding:gzip ,指服务端开启了 gzip 的压缩方式

/etc/nginx/conf.d/ 文件夹中新建配置文件 gzip.conf

# # 默认off,是否开启gzip
gzip on;
# 要采用 gzip 压缩的 MIME 文件类型,其中 text/html 被系统强制启用;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

# ---- 以上两个参数开启就可以支持Gzip压缩了 ---- #

# 默认 off,该模块启用后,Nginx 首先检查是否存在请求静态文件的 gz 结尾的文件,如果有则直接返回该 .gz 文件内容;
gzip_static on;

# 默认 off,nginx做为反向代理时启用,用于设置启用或禁用从代理服务器上收到相应内容 gzip 压缩;
gzip_proxied any;

# 用于在响应消息头中添加 Vary:Accept-Encoding,使代理服务器根据请求头中的 Accept-Encoding 识别是否启用 gzip 压缩;
gzip_vary on;

# gzip 压缩比,压缩级别是 1-9,1 压缩级别最低,9 最高,级别越高压缩率越大,压缩时间越长,建议 4-6;
gzip_comp_level 6;

# 获取多少内存用于缓存压缩结果,16 8k 表示以 8k*16 为单位获得;
gzip_buffers 16 8k;

# 允许压缩的页面最小字节数,页面字节数从header头中的 Content-Length 中进行获取。默认值是 0,不管页面多大都压缩。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大;
# gzip_min_length 1k;

# 默认 1.1,启用 gzip 所需的 HTTP 最低版本;
gzip_http_version 1.1;

Last updated: