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
/etc/nginx/conf.d/
是子配置项存放处,/etc/nginx/nginx.conf
主配置文件会默认把这个文件夹中所有子配置项都引入;/usr/share/nginx/html/
静态文件都放在这个文件夹,也可以根据你自己的习惯放在其他地方;
Nginx应用场景
使用场景
- 静态资源服务,通过本地文件系统提供服务;
- 反向代理服务,延伸出包括缓存、负载均衡等;
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
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路径映射
#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 /{
#匹配所有
}
虚拟主机
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文件
侦听端口
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;
}
访问日志
server {
# Relative or full path to log file
access_log /path/to/file.log;
# Turn 'on' or 'off'
access_log on;
}
域名
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 "";
}
静态资源
server {
listen 80;
server_name yourdomain.com;
location / {
root /path/to/website;
}
}
重定向
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;
}
}
反向代理
server {
listen 80;
server_name yourdomain.com;
#反向代理将请求转发给3000
location / {
proxy_pass http://0.0.0.0:3000;
}
}
负载均衡
负载均衡策略:
backup:热备,等主服务器停止工作了,备份机才工作
轮询:将客户端的请求轮流分配给不同的主机
权重:可以设置多台服务器的接收百分比!
ip_hash:基于客户端的ip进行服务器分配
fair:根据服务器的请求时间来进行分配
url_hash:基于请求的地址进行服务器分配
#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 协议
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;
}
动静分离
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
工作流程
- 客户端(浏览器)访问
https://www.baidu.com
百度网站;- 百度服务器返回
HTTPS
使用的CA
证书;- 浏览器验证
CA
证书是否为合法证书;- 验证通过,证书合法,生成一串随机数并使用公钥(证书中提供的)进行加密;
- 发送公钥加密后的随机数给百度服务器;
- 百度服务器拿到密文,通过私钥进行解密,获取到随机数(公钥加密,私钥解密,反之也可以);
- 百度服务器把要发送给浏览器的内容,使用随机数进行加密后传输给浏览器;
- 此时浏览器可以使用随机数进行解密,获取到服务器的真实传输内容;
配置证书
下载证书压缩文件,里面有个 Nginx
文件夹,把 xxx.crt
和 xxx.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.com
对 dev.server.com
发起请求一定会出现跨域。
现在我们只需要启动一个 Nginx
服务器,将 server_name
设置为 fe.server.com
然后设置相应的 location
以拦截前端需要跨域的请求,最后将请求代理回 dev.server.com
。如下面的配置:
server {
listen 80;
server_name fe.server.com;
location / {
proxy_pass dev.server.com;
}
}
这样可以完美绕过浏览器的同源策略: fe.server.com
访问 Nginx
的 fe.server.com
属于同源访问,而 Nginx
对服务端转发的请求不会触发浏览器的同源策略。
gzip 压缩
GZIP
是规定的三种标准 HTTP
压缩格式之一。目前绝大多数的网站都在使用 GZIP
传输 HTML
、CSS
、 JavaScript
等资源文件。
对于文本文件, GZiP
的效果非常明显,开启后传输所需流量大约会降至 1/4~1/3
。
并不是每个浏览器都支持 gzip
的,如何知道客户端是否支持 gzip
呢,请求头中的 Accept-Encoding
来标识对压缩的支持。
启用 gzip
同时需要客户端和服务端的支持,如果客户端支持 gzip
的解析,那么只要服务端能够返回 gzip
的文件就可以启用 gzip
了,我们可以通过 Nginx
的配置来让服务端支持 gzip
。
respone
中 content-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;