前置知识
什么是正向代理
是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端.
什么是反向代理
是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器
- 隐藏服务器真实IP
- 负载均衡
- 提高访问速度
- 提供安全保障
什么是负载均衡(使用多台服务器提供单一服务)
它的职责是将网络请求,或者其他形式的负载均摊到不同的机器上. 避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况
. 通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载. 在为高负载服务器分流的同时,还可以避免资源浪费.
- 动静分离:为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度.降低原来单个服务器的压力
Nginx配置文件
全局,events,http
nginx命令
nginx -v
查看nginx版本号
systemctl start nginx
:开启nginx
systemctl stop nginx
:停止nginx
systemctl status nginx
:查看状态
systemctl enable nginx
:开机启动
nginx -s reload
:重新启动nginx
全局快
全局块:从配置文件到events块之间的内容,主要会设置影响nginx服务器整体运行的配置指令
user
:运行用户,最好指定为root
worker_processes
:nginx服务器处理并发服务的关键配置,他的值越大,可以处理的并发也越多,但是会受到硬件,软件等设备的制约
error_log
:错误日志文件所在位置
pid
:pid文件所在的位置
events
events
:影响nginx与用户的网络连接
worker_connections
:nginx支持的最大的连接数是多少
使用epoll
模型提高性能
1 2 3 4
| events { use epoll; worker_connections 4096; }
|
使用ulimit -a
查看每个进程可以处理的文件数,配置文件里修改为大于1024,也会被限制,需要额外再命令行输ulimit -n <number>
去修改打开我呢见数限制
http
http全局快
http全局快配置的指令包括文件引入,MINE-TYPE定义,日志自定义,连接超时时间,单链请求数上限
log_format
:日志格式设定
access_log
:访问日志的位置
sendfile
:支持文件发送下载
tcp_nopush
:允许或禁止使用socke的TCP_CORK
的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
tcp_nodelay
:是否不将小包组成成大包,提高带宽利用率
keepalive_timeout
:连接保持的超时时间,单位秒(s)
types_hash_max_size:
用一个散列表来保存MIME type
与文件扩展名之间的映射,该参数就是指定该散列表桶的大小的.
gzip
:是否开启gzip压缩输出
include
:文件扩展名与文件类映射表
default_type
:默认文件类型
server
和虚拟主机有关,完全模拟硬件主机.每个http模块苦役包括多个server块,而每个server块就相当于一个虚拟主机
server全局快
最常见的配置就是本虚拟主机的监听配置和本虚拟主机的名称或IP配置
listen
:监听地址以及端口
server_name
:站点域名,可以有多个,用空格隔开
location
一个server块可以包含多个location块.主要用于nginx服务器接收到的请求字符串,对虚拟主机之外的字符串进行匹配,对特定的请求进行处理
/
:域名或者主机IP
root
:根目录位置
index
:默认的主页文件位置,会从根目录下寻找
1 2 3 4
| location / { root /opt/web/Jack-Zhang-1314.github.io; index index.html; }
|
如果设定/test
,那么root目录会改为/opt/web/Jack-Zhang-1314.github.io/test
主页文件会改为/opt/web/Jack-Zhang-1314.github.io/test/index.html
location = /uri
:= 开头表示精确匹配,只有完全匹配上才能生效.
location ^~ /uri
:^~ 开头对 URL 路径进行前缀匹配,并且在正则之前.
location ~ pattern
:~ 开头表示区分大小写的正则匹配.
location ~* pattern
:~* 开头表示不区分大小写的正则匹配.
location /uri
:不带任何修饰符,也表示前缀匹配,但是在正则匹配之后,如果没有正则命中,命中最长的规则.
location /
:通用匹配,任何未匹配到其它 location 的请求都会匹配到,相当于 switch 中的 default.
反向代理
通常将反向代理做为公网访问地址,web服务器是内网,即通过nginx配置外网访问web服务器内网
通过proxy_pass
来配置
1 2 3 4 5 6 7 8 9
| server { listen 80; server_name www.zhengqing520.com; location / { # 访问80端口后的所有路径都转发到 proxy_pass 配置的ip中 root /usr/share/nginx/html; index index.html index.htm; proxy_pass 127.0.0.1:8080; } }
|
server_name
服务器地址或绑定域名
proxy_pass
:配置反向代理的ip地址和端口号(url地址需加上http:// 或 https://
)
安装与配置
在线安装
在线安装的好处就是免去了很多麻烦的配置,自动启动,直接访问127.0.0.1:80
即可查看
编译安装
可安装任意版本nginx,可定制性强,缺点是麻烦
- 安装依赖(wsl2 ubuntu22.04)
1
| apt install -y make gcc g++ libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
|
- 下载nginx源码
1 2
| wget http://nginx.org/download/nginx-1.22.0.tar.gz tar -zxvf nginx-1.22.0.tar.gz && cd nginx-1.22.0
|
- 创建nginx用户,防止nginx运行权限过高
1
| useradd nginx -s /sbin/nologin -M
|
- 生成makefile文件
1 2 3 4 5 6 7
| ./configure \ --user=nginx \ --group=nginx \ --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-http_v2_module
|
- 编译安装
查看nginx以及模块是否安装成功
1
| /usr/local/nginx/sbin/nginx -v
|
启动与停止
启动
1
| /usr/local/nginx/sbin/nginx
|
测试配置文件是否有错误
1
| /usr/local/nginx/sbin/nginx -t
|
查看服务是否运行正常
停止
1 2 3 4 5 6 7
| # 默认停止方式 /usr/local/nginx/sbin/nginx -s quit # 默认强制停止方式 /usr/local/nginx/sbin/nginx -s stop # 通过 kill 命令停止(效果同强制停止) ps -ef | grep nginx kill -9 [pid]
|
重启(重新加载nginx.conf文件)
1
| /usr/local/nginx/sbin/nginx -s reload
|
使用 systemctl 设置开机启动
- 在系统服务目录里创建nginx.service文件
1
| nano /usr/lib/systemd/system/nginx.service
|
写入以下内容
1 2 3 4 5 6 7 8 9 10 11 12 13
| [Unit] # 服务的说明 Description=nginx After=network.target [Service] # 服务运行参数的设置 Type=forking # 后台运行 ExecStart=/usr/local/nginx/sbin/nginx # 运行命令 ExecReload=/usr/local/nginx/sbin/nginx -s reload # 重启命令 ExecStop=/usr/local/nginx/sbin/nginx -s quit # 停止命令 PrivateTmp=true # 给服务分配独立的临时空间 [Install] WantedBy=multi-user.target
|
- 启用自启服务
1
| systemctl enable nginx.service
|
以后可以用以下命令进行服务的停止与启动
1 2 3 4 5 6
| # 启动 systemctl start nginx # 停止 systemctl stop nginx # 重启 systemctl reload nginx
|
nginx运行目录
Nginx运行目录为/usr/local/nginx
,其目录结构如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| . ├── client_body_temp # 客户端内容临时文件 ├── conf │ ├── fastcgi.conf # 动态配置文件 │ ├── fastcgi.conf.default │ ├── fastcgi_params # 动态参数 │ ├── fastcgi_params.default │ ├── koi-utf │ ├── koi-win │ ├── mime.types │ ├── mime.types.default │ ├── nginx.conf # 默认主配置文件 │ ├── nginx.conf.default # 初始主配置文件 │ ├── scgi_params │ ├── scgi_params.default │ ├── uwsgi_params │ ├── uwsgi_params.default │ └── win-utf ├── fastcgi_temp ├── html # 默认站点目录 │ ├── 50x.html │ └── index.html ├── logs # 日志文件夹 │ ├── access.log # 访问日志 │ ├── error.log # 错误日志 │ └── nginx.pid # nginx pid文件 ├── proxy_temp ├── sbin │ └── nginx # 启动文件 ├── scgi_temp └── uwsgi_temp
|
nginx 配置
配置文件路径/usr/local/nginx/conf/nginx.conf
,是一个纯文本文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| user nobody; # Nginx运行的用户和用户组 worker_processes 1; # nginx进程数
# error日志的设置(语法: error_log/path/file level;level是日志的输出级别,取值范围是debug、info、notice、warn、error、crit、alert、emerg,从左至右级别依次增大) error_log logs/error.log; # 默认为error级别 #error_log logs/error.log notice; #error_log logs/error.log info;
pid logs/nginx.pid; # 进程文件
# 控制 Ng inx 处理连接的方式 events { worker_connections 1024; # 单个进程最大连接数(最大连接数=连接数*进程数) }
# HTTP块 http { include mime.types; default_type application/octet-stream;
#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 logs/access.log main;
sendfile on; #tcp_nopush on;
#keepalive_timeout 0; keepalive_timeout 65;
#gzip on; # 每一个 ”server {}" 代表一个虚拟主机,对应一个网站 server { listen 80; # 网站端口 server_name localhost; # 网站域名
#charset koi8-r; # 站点访问日志 access_log logs/host.access.log main;
# server 中对应目录级别的控制块,可以有多个 location / { root html; # 网站目录 index index.html index.htm; # 网站index文件 }
# 404 页面 error_page 404 /404.html;
# 出现50x错误时重定向到50x.html页面 # error_page 500 502 503 504 /50x.html; location = /50x.html { root 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; #}
# deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }
# HTTPS server # #server { # listen 443 ssl; # server_name localhost;
# ssl_certificate cert.pem; # ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on;
# location / { # root html; # index index.html index.htm; # } #}
}
|
关闭错误日志
当程序目录没有favicon.ico
文件时,错误日志里会循环出现以下错误
1
| open() "/usr/local/nginx/html/favicon.ico" failed (2: No such file or directory)
|
修改/usr/local/nginx/conf/nginx.conf
,关闭对favicon.ico
的日志记录
1 2 3 4
| location = /favicon.ico { log_not_found off; access_log off; }
|
多端口站点配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| server { listen 80; server_name localhost;
location / { root html; index index.html index.htm; } }
server { listen 81; server_name localhost;
location / { root /home/www/; index index.html index.htm; } }
|
端口复用配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| server { listen 80; server_name aaa.com;
location / { root /home/www/aaa.com; index index.html index.htm; } }
server { listen 80; server_name bbb.com;
location / { root /home/www/bbb.com; index index.html index.htm; } }
|
然后再把域名解析到服务器公网IP就能访问了
nginx反向代理配置
1 2 3 4 5 6 7 8 9 10 11 12
| server { listen 80; # 网站端口 server_name localhost; # 网站域名
#charset koi8-r; # 对应站点访问日志,默认打开 #access_log logs/host.access.log main;
location / { proxy_pass http://www.yuchaoit.cn/; } }
|
注意反代SSL站点需要使用证书
HTTPS
证书文件默认目录/usr/local/nginx/conf/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| server { listen 443 ssl; server_name localhost;
ssl_certificate cert.crt; ssl_certificate_key cert.key;
ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on;
location / { root html; index index.html index.htm; } }
|
设置HTTP跳转HTTPS
301 跳转
1 2 3 4 5 6 7
| server { listen 80; # 网站端口 server_name localhost; # 网站域名
return 301 https://127.0.0.1/;
}
|
利用meta的刷新作用将http跳转到https
此方法需要将80端口网站和443端口网站分开存放,舍弃80端口网站,不能跳转所有页面,局限性很大
- 在 index 文件里引入一个 meta 标签
1 2 3 4
| <!DOCTYPE html> <html> <meta http-equiv="refresh" content="0;url=https://127.0.0.1/"> </html>
|
- 将http的404的页面也重定向到https
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| server { listen 80; server_name localhost;
location / { root jump; index index.html index.htm; }
error_page 404 https://127.0.0.1;
# redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
}
|
文件服务器
一个简易的文件服务系统
1 2 3 4 5 6 7 8 9 10 11 12
| server { listen 80; server_name localhost;
location / { root html; index index.php; autoindex on; autoindex_exact_size off; autoindex_localtime on; } }
|
启用对PHP的支持
1 2 3 4 5 6 7 8 9 10 11
| location / { root html; index index.php index.html index.htm; # 增加 index.php,用于支持PHP文件作为默认页面 } location ~ \.php$ { # 匹配以“.php”结尾的请求,转给FastCGI(PHP)处理 root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; # 引人 FastCGI 的环境变量配置 }
|