nginx入门
2023-07-06 23:56:44 14 举报
AI智能生成
Nginx是一款开源的高性能HTTP服务器和反向代理服务器,广泛应用于互联网领域。它具有轻量级、高效率、高并发等特点,可以作为网站服务器、负载均衡器、缓存服务器等使用。Nginx采用事件驱动模型,支持多种协议,如HTTP、HTTPS、SMTP等。通过配置文件,可以轻松实现对请求的分流、过滤、缓存等功能。学习Nginx,可以从安装配置、基本语法、常用功能模块等方面入手,逐步掌握其使用方法和技巧。
作者其他创作
大纲/内容
正/方向代理
正向代理
在客户端代理转发请求称为正向代理。例如VPN
反向代理
在服务器端代理转发请求称为反向代理。例如nginx
由于使用反向代理之后,后端服务无法获取用户的真实IP,所以,一般反向代理都会设置以下header信息。
常用变量的值:
$host:nginx主机IP,例如192.168.56.105
$http_host:nginx主机IP和端口,192.168.56.105:8001
$proxy_host:localhost:8088,proxy_pass里配置的主机名和端口
$remote_addr:用户的真实IP,即客户端IP
$host:nginx主机IP,例如192.168.56.105
$http_host:nginx主机IP和端口,192.168.56.105:8001
$proxy_host:localhost:8088,proxy_pass里配置的主机名和端口
$remote_addr:用户的真实IP,即客户端IP
nginx主机的ip
被代理对象服务器的ip
请求的访问ip
动静分离
server{
location / {
proxy_pass http://localhost:8080/;
}
location = /html/ie.html {
root /home/www/static;
}
location ^~ /fonts/ {
root /home/www/static;
}
location ~ \.(css|js|png|jpg|gif|ico) {
root /home/www/static;
}
location / {
proxy_pass http://localhost:8080/;
}
location = /html/ie.html {
root /home/www/static;
}
location ^~ /fonts/ {
root /home/www/static;
}
location ~ \.(css|js|png|jpg|gif|ico) {
root /home/www/static;
}
location 修饰符
● location可以使用修饰符或正则表达式
修饰符:
= 等于,严格匹配 ,匹配优先级最高。
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。优先级第二高。
~ 区分大小写
~* 不区分大小写
● 优先级
优先级从高到低依次为:。
1. 精确匹配(=)
2. 前缀匹配(^~)
3. 正则匹配(~和~*)
4. 不写
● location可以使用修饰符或正则表达式
修饰符:
= 等于,严格匹配 ,匹配优先级最高。
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。优先级第二高。
~ 区分大小写
~* 不区分大小写
● 优先级
优先级从高到低依次为:。
1. 精确匹配(=)
2. 前缀匹配(^~)
3. 正则匹配(~和~*)
4. 不写
nginx默认结构
include /etc/nginx/conf.d/*.conf;
配置文件位于 /etc/nginx/nginx.conf , 下列命令会引用/etc/nginx/conf.d目录下所有的.conf文件,这样可以保持主配置文件的简洁,同时配个多个.conf文件方便区分,增加可读性
http {
server{#虚拟主机
location {
listen 80;
server_name localhost;
}
location {
}
}
server{
}
}
server{#虚拟主机
location {
listen 80;
server_name localhost;
}
location {
}
}
server{
}
}
负载均衡
轮询机制
最小连接
ip-hash
客户端的 IP 地址将用作哈希键,来自同一个ip的请求会被转发到相同的服务器。
hash
随机
权重
upstream my-server {
server performance.server weight=3;
server app1.server;
server app2.server;
}如上所示,每 5 个新请求将按如下方式分布在应用程序实例中:3 个请求将定向到performance.server,一个请求将转到app1.server,另一个请求将转到app2.server
server performance.server weight=3;
server app1.server;
server app2.server;
}如上所示,每 5 个新请求将按如下方式分布在应用程序实例中:3 个请求将定向到performance.server,一个请求将转到app1.server,另一个请求将转到app2.server
TCP反向代理
stream
#HTTP代理
http {
server {
listen 8002;
proxy_pass http://localhost:8080/;
}
}
#TCP代理
stream {
server {
listen 13306;
proxy_pass localhost:3306;
}
}
http {
server {
listen 8002;
proxy_pass http://localhost:8080/;
}
}
#TCP代理
stream {
server {
listen 13306;
proxy_pass localhost:3306;
}
}
tcp负载均衡
stream {
upstream backend-mysql {
server localhost:3306;
server localhost:3307;
keepalive 8;
}
server {
listen 13306;
proxy_pass backend-mysql;
}
}
upstream backend-mysql {
server localhost:3306;
server localhost:3307;
keepalive 8;
}
server {
listen 13306;
proxy_pass backend-mysql;
}
}
keeplive
使用 keepalive 指令启用从 NGINX Plus 到上游服务器的保持活动连接,
定义在每个工作进程的缓存中保留的与上游服务器的空闲保持活动连接的最大数量。
当超过此数字时,将关闭最近最少使用的连接。如果没有 keepalives,您将增加更多的开销,并且连接和临时端口都效率低下。
现代 Web 浏览器通常会打开 6 到 8 个保持连接
定义在每个工作进程的缓存中保留的与上游服务器的空闲保持活动连接的最大数量。
当超过此数字时,将关闭最近最少使用的连接。如果没有 keepalives,您将增加更多的开销,并且连接和临时端口都效率低下。
现代 Web 浏览器通常会打开 6 到 8 个保持连接
nginx常用命令
nginx
#立即停止
nginx -s stop
#执行完当前请求再停止
nginx -s quit
#重新加载配置文件,相当于restart
nginx -s reload
#将日志写入一个新的文件
nginx -s reopen
#测试配置文件
nginx -t
#立即停止
nginx -s stop
#执行完当前请求再停止
nginx -s quit
#重新加载配置文件,相当于restart
nginx -s reload
#将日志写入一个新的文件
nginx -s reopen
#测试配置文件
nginx -t
缓存和缓冲
proxy_cache_path /var/cache/nginx/data keys_zone=mycache:10m;
server {
listen 8001;
server_name ruoyi.localhost;
location / {
#设置buffer
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_pass http://localhost:8088;
}
location ~ \.(js|css|png|jpg|gif|ico) {
#设置cache
proxy_cache mycache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_pass http://localhost:8088;
}
location = /html/ie.html {
proxy_cache mycache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_pass http://localhost:8088;
}
location ^~ /fonts/ {
proxy_cache mycache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_pass http://localhost:8088;
}
}
server {
listen 8001;
server_name ruoyi.localhost;
location / {
#设置buffer
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_pass http://localhost:8088;
}
location ~ \.(js|css|png|jpg|gif|ico) {
#设置cache
proxy_cache mycache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_pass http://localhost:8088;
}
location = /html/ie.html {
proxy_cache mycache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_pass http://localhost:8088;
}
location ^~ /fonts/ {
proxy_cache mycache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_pass http://localhost:8088;
}
}
注解:通过缓存的形式把静态文件,剥离出来,每次请求都不用直接打到服务器上去,和手动的动静分离不一样
缓存和缓冲的区别
缓冲
缓冲一般放在内存中,如果不适合放入内存(比如超过了指定大小),则会将响应写入磁盘临时文件中。
启用缓冲后,nginx先将后端的请求响应(response)放入缓冲区中,等到整个响应完成后,再发给客户端
启用缓冲后,nginx先将后端的请求响应(response)放入缓冲区中,等到整个响应完成后,再发给客户端
缓存
启用缓存后,nginx将响应保存在磁盘中,返回给客户端的数据首先从缓存中获取,这样子相同的请求不用每次都发送给后端服务器,减少到后端请求的数量
启用缓存,需要在http上下文中使用 proxy_cache_path 指令,定义缓存的本地文件目录,名称和大小。
缓存区可以被多个server共享,使用proxy_cache 指定使用哪个缓存区
缓存区可以被多个server共享,使用proxy_cache 指定使用哪个缓存区
静态网页
示例
server{
listen 8000;
server_name localhost;
location / {
root /home/AdminLTE-3.2.0;
index index.html index2.html index3.html;
}
}
listen 8000;
server_name localhost;
location / {
root /home/AdminLTE-3.2.0;
index index.html index2.html index3.html;
}
}
listen
监听可以配置成IP或端口或IP+端口
listen 127.0.0.1:8000;
listen 127.0.0.1;( 端口不写,默认80 )
listen 8000;
listen *:8000;
listen localhost:8000;
listen 127.0.0.1:8000;
listen 127.0.0.1;( 端口不写,默认80 )
listen 8000;
listen *:8000;
listen localhost:8000;
server_name
server_name主要用于区分,可以随便起。
也可以使用变量 $hostname 配置成主机名。
或者配置成域名: example.org www.example.org *.example.org
如果多个server的端口重复,那么根据域名或者主机名去匹配 server_name 进行选择。
下面的例子中:
curl http://localhost:80会访问/usr/share/nginx/html
curl http://nginx-dev:80会访问/home/AdminLTE-3.2.0
也可以使用变量 $hostname 配置成主机名。
或者配置成域名: example.org www.example.org *.example.org
如果多个server的端口重复,那么根据域名或者主机名去匹配 server_name 进行选择。
下面的例子中:
curl http://localhost:80会访问/usr/share/nginx/html
curl http://nginx-dev:80会访问/home/AdminLTE-3.2.0
# curl http://localhost:80 会访问这个
server {
listen 80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# curl http://nginx-dev:80 会访问这个
server{
listen 80;
server_name nginx-dev;#主机名
location / {
root /home/AdminLTE-3.2.0;
index index.html index2.html index3.html;
}
}
server {
listen 80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# curl http://nginx-dev:80 会访问这个
server{
listen 80;
server_name nginx-dev;#主机名
location / {
root /home/AdminLTE-3.2.0;
index index.html index2.html index3.html;
}
}
参考文献地址
https://www.processon.com/mindmap/6493a1b48890307130bd94fa
https配置
HTTPS 协议是由HTTP 加上TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护
生成证书
openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
配置ssl
server {
listen 443 ssl;
server_name ruoyi.https;
ssl_certificate /home/ssl/server.crt;
ssl_certificate_key /home/ssl/server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://localhost:8088;
}
}
listen 443 ssl;
server_name ruoyi.https;
ssl_certificate /home/ssl/server.crt;
ssl_certificate_key /home/ssl/server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://localhost:8088;
}
}
重写
return
转发
发向代理proxy_pass属于转发,浏览器的访问栏输入的地址不会发生变化。
重定向
return,rewrite属于重定向,在客户端进行。浏览器的访问栏输入的地址会发生变化
状态码
● 2xx 成功
● 3xx 表示重定向
○ 301 永久重定向
○ 302 临时重定向
● 4xx 请求地址出错
○ 403 拒绝请求
○ 404 请求找不到
● 5xx 服务器内部错误
● 3xx 表示重定向
○ 301 永久重定向
○ 302 临时重定向
● 4xx 请求地址出错
○ 403 拒绝请求
○ 404 请求找不到
● 5xx 服务器内部错误
rewrite
如果指定的正则表达式与请求 URI 匹配,
则 URI 将按照字符串中的指定进行更改。指令按其在配置文件中出现的先后顺序执行
则 URI 将按照字符串中的指定进行更改。指令按其在配置文件中出现的先后顺序执行
上面是使用该指令的示例 NGINX 重写规则。它匹配以字符串 /download 开头的 URL,然后在路径后面的某个位置包含 /media/ 或 /audio/ 目录。它将这些元素替换为 /mp3/,并添加相应的文件扩展名,.mp3 或 .ra。和 变量捕获未更改的路径元素。例如,/download/cdn-west/media/file1 变成了 /download/cdn-west/mp3/file1.mp3。如果文件名上有扩展名(如 .flv),则表达式会将其剥离,并将其替换为.mp3。
如果字符串包含新的请求参数,则以前的请求参数将追加到这些参数之后。如果不需要这样做,则在替换字符串的末尾放置一个问号可以避免附加它们,例如:replacement
如果字符串包含新的请求参数,则以前的请求参数将追加到这些参数之后。如果不需要这样做,则在替换字符串的末尾放置一个问号可以避免附加它们,例如:replacement
0 条评论
下一页