Nginx使用场景及相关配置
https://blog.csdn.net/qq_26012495/article/details/98367624
proxy_pass的url加不加“/”的问题:
https://www.cnblogs.com/kevingrace/p/6566119.html
正向代理:
https://blog.51cto.com/u_7603402/2422469
https://blog.csdn.net/k417699481/article/details/115672191?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.highlightwordscore&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.highlightwordscore
常用命令:
https://blog.csdn.net/cckavin/article/details/103739054
平滑安装nginx:
https://www.cnblogs.com/crysmile/p/9565048.html
1 基本配置介绍
1.1 配置文件结构
nginx的主配置文件是安装目录下conf文件夹下的nginx.conf,该配置文件的结构
... // 全局块
events { // events块
...
}
http { // http块
... // http全局块
server { // server块
... // server全局块
location [Pattern] { // location块
...
}
location [Pattern] {
...
}
}
server {
...
location [Pattern] {
...
}
location [Pattern] {
...
}
}
...
}
1.2 各配置块说明
结构名称 | 说明 |
---|---|
全局块 | 主要包括配置运行Nginx服务器的用户、允许生成的worker process数、日志存放路径、配置文件引入等;worker process值越大,支持的并发量越高。 |
events块 | 设置每个work process最大连接数等,该部分主要影响Nginx性能。 |
http块 | 包含http全局块、server块、server全局块、location块 |
– http全局块 | 包含日志定义、超时时间等 |
– server块 | 每个server块相当于一个虚拟主机 |
– server全局块 | 配置本虚拟机监听配置 |
– location块 | 基于Nginx接收到的请求,对其进行匹配处理、地址定向、数据缓存等 |
2 nginx常用命令
2.1常用命令
以下命令需要在nginx的安装目录的sbin文件夹下执行。
命令 | 说明 |
---|---|
验证配置是否正确 | ./nginx -t |
查看Nginx的详细的版本号 | ./nginx -V 或 ./nginx -v |
查看配置编译阶段的信息 | ./nginx -V |
启动命令 | ./nginx |
快速停止或关闭 | ./nginx -s stop |
正常停止或关闭 | ./nginx -s quit |
配置文件修改重装载命令 | ./nginx -s reload |
2.2 详解及示例
2.2.1 验证配置是否正确
在启动Nginx前可以使用 -t参数测试配置文件(nginx.conf)是否正确。
[root@test ~]# cd /usr/local/nginx/sbin/
[root@test sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@test sbin]#
使用 -q 参数可以不输出 error 级别以下的信息。
./nginx -t -q
2.2.2 查看Nginx的详细的版本号
[root@test sbin]# cd /usr/local/nginx/sbin/
[root@test sbin]# ./nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
configure arguments: --prefix=/usr/local/nginx
[root@test sbin]# ./nginx -v
nginx version: nginx/1.18.0
[root@test sbin]#
2.2.3 查看配置编译阶段的信息
[root@test sbin]# cd /usr/local/nginx/sbin/
[root@test sbin]# ./nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
configure arguments: --prefix=/usr/local/nginx
[root@test sbin]#
2.2.4 启动
[root@test sbin]# cd /usr/local/nginx/sbin/
[root@test sbin]# ./nginx
[root@test sbin]#
2.2.5 快速停止
-s stop命令会告诉Nginx向正在运行的Nginx master进程发送TERM信号量来快速的关闭Nginx服务。
[root@test sbin]# cd /usr/local/nginx/sbin/
[root@test sbin]# ./nginx -s stop
[root@test sbin]#
2.2.6 正常停止
-s quit命令会告诉Nginx正常处理完所有任务(关闭监听接口,停止接收新的链接,把当前的所有连接全部处理完)再停止进程。
[root@test sbin]# cd /usr/local/nginx/sbin/
[root@test sbin]# ./nginx -s quit
[root@test sbin]#
2.2.7 重载配置文件
-s reload参数会重新加载nginx.conf文件——先检查配置是否有误,如果没有就使用 quit命令停止服务,然后再重新启动。
[root@test sbin]# cd /usr/local/nginx/sbin/
[root@test sbin]# ./nginx -s reload
[root@test sbin]#
3 使用场景
3.1 HTTP服务器
3.1.1 功能
将服务器上的静态资源如html、css、js、jpg等,通过HTTP协议返回给浏览器客户端。可通过此方式部署前端项目。
3.1.2 配置方式
将静态资源文件上传到服务器,使用root指令或者alias指令指向文件所在位置;注意root指令于alias指令的区别:
对比项 | root | alias |
---|---|---|
语法 | root path | alias path |
配置段 | http、server、location、if | location |
默认值 | root html | |
处理结果 | root值 + location值 | alias值 |
必须“/”结束 | 否 | 是 |
3.1.3 示例
访问地址前缀为:http://test.com/
实际访问的服务器地址:/opt/h5/
server {
listen 8080(端口号);
server_name test.com(ip或者域名);
location / {
root /opt/h5;
}
}
访问地址前缀为:http://test.com/picture/
实际访问的服务器地址:/opt/h5/picture/
server {
listen 8080(端口号);
server_name test.com(ip或者域名);
location /picture {
root /opt/h5/;
}
}
访问地址前缀为:http://test.com/picture/
实际访问的服务器地址:/opt/h5/picture/
server {
listen 8080(端口号);
server_name test.com(ip或者域名);
location /picture {
alias /opt/h5/picture/;
}
}
3.2 反向代理
3.2.1 功能
在项目中,往往需要代理服务器接收外部网络的访问请求,将请求转发给内部服务器,并接收到的内部服务器返回的结果返回给请求的客户端。代理服务器和内部服务所在服务器可以是不同的服务器,也可以是同一个服务器,不同的端口。
3.2.2 配置方式
通过proxy_pass指令指向代理服务的地址,注意通过location来区分不同的服务。
注意:配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。
server {
listen 8080(端口号);
server_name test.com(ip或者域名);
location /test1 {
proxy_pass http://192.168.3.100:8081/;
}
}
3.2.3 示例
server {
listen 8080(端口号);
server_name test.com(ip或者域名);
# 请求地址 http://test.com/test1/
# 实际访问地址 http://192.168.3.100:8081/
location /test1 {
proxy_pass http://192.168.3.100:8081/;
}
# 请求地址 http://test.com/test2/
# 实际访问地址 http://192.168.3.100:8082/
location /test2 {
proxy_pass http://192.168.3.100:8082/;
}
# 请求地址 http://test.com/test3/
# 实际访问地址 http://192.168.3.101:8080/
location /test3 {
proxy_pass http://192.168.3.101:8080/;
}
# 请求地址 http://test.com/test3/
# 实际访问地址 http://192.168.3.101:8080/test4/
location /test4 {
proxy_pass http://192.168.3.101:8082;
}
}
3.3 负载均衡
3.3.1 功能
将访问的请求分摊到多个节点服务器上去执行。
3.3.2 配置方式
通过upstream块配置负载的服务器地址信息。
Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略,使用第三方策略需要安装第三方模块。
http {
server {
listen 80;
server_name test.com;
location /test {
# 下面配置的test与upstream后面的值对应,实际访问的服务地址为upstream中server的地址
proxy_pass http://test/;
}
}
upstream test {
server 192.168.3.100:8080 weight=1;
server 192.168.3.101:8080 weight=1;
}
}
3.3.3 示例
http {
server {
listen 80;
server_name test.com;
location /test {
proxy_pass http://test/;
}
location /test2 {
proxy_pass http://test2/;
}
}
# 轮询(默认)
upstream test {
server 192.168.3.100:8080;
server 192.168.3.101:8080;
}
# 权重 (权重分配的不同,分摊的请求比重就不同)
upstream test2 {
server 192.168.3.100:8082 weight=1;
server 192.168.3.101:8082 weight=1;
}
# 下边三种作为了解
#ip_hash
upstream test {
ip_hash;
server 192.168.3.100:8080;
server 192.168.3.101:8080;
}
#fair(第三方)
upstream test {
fair;
server 192.168.3.100:8080;
server 192.168.3.101:8080;
}
#url_hash(第三方)
upstream test {
hash $request_uri;
hash_method crc32;
server 192.168.3.100:8080;
server 192.168.3.101:8080;
}
3.4 正向代理
3.4.1 功能
客户端(PC)无法直接通过互联网或者内部局域网直接访问X资源(服务器),但是客户端能够直接访问一个代理服务器,而这个代理服务器能够访问到PC访问不了的X资源,于是我们先在PC上配置代理服务器的地址,PC把请求发送给代理服务器,让代理服务器去访问X资源,代理访问了X资源返回给PC,从而解决了无法访问的问题。
3.4.2 配置方式
server {
listen 8088;
resolver 114.114.114.114; #增加dns解析
location / {
proxy_pass http://$http_host$request_uri;
}
}
3.5 虚拟主机
3.5.1 功能
虚拟主机就是把一台物理服务器划分成多个”虚拟“的服务器,进而配置多个网站,这样可以实现只在一台服务器上安装一个nginx,达到运行多个网站的效果。
nginx下,一个server标签就是一个虚拟主机。
3.5.2 配置方式
3.5.2.1 基于端口的虚拟主机
多个虚拟主机的区分方式:端口号
访问方式:域名+端口号 或 ip地址+端口号
# 第一个虚拟主机
server {
listen 80;
server_name test.com;
location / {
root /home/test1;
}
}
# 第二个虚拟主机
server {
listen 8080;
server_name test.com;
location / {
root /home/test2;
}
}
3.5.2.2 基于域名的虚拟主机
多个虚拟主机的区分方式:域名
访问方式:域名
# 第一个虚拟主机
server {
listen 80;
server_name test.one.com;
location / {
root /home/test1;
}
}
# 第二个虚拟主机
server {
listen 80;
server_name test.two.com;
location / {
root /home/test2;
}
}
3.6 socket代理
3.6.1 功能介绍及平滑安装stream模块
该功能要使用nginx的ngx_stream_core_module模块,但是该模块在安装时不是默认构建的,需要在编译安装执行 ./configure时加上参数–with-stream。
3.6.1.1 查看是否安装stream模块
使用命令./nginx -V查看,如果在configure arguments后面没有出现–with-stream则说明没有安装此模块。
[root@test sbin]# cd /usr/local/nginx/sbin/
[root@test sbin]# ./nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
configure arguments: --prefix=/usr/local/nginx
[root@test sbin]#
3.6.1.2 平滑安装stream模块
# 找到nginx源码目录,如此处nginx源码目录为:/home/nginx/nginx-1.18.0,即为编译命令执行目录
cd /home/nginx/nginx-1.18.0
# 执行编译命令
./configure --prefix=/usr/local/nginx --with-stream
# 执行make,此处一定不能使用make install命令,执行该命令会将原有nginx目录进行覆盖
make
# 关掉nginx
cd /usr/local/nginx/sbin/
./nginx -s stop
# 备份原有nginx二进制文件。
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx-no-strem
# 复制新编译好的nginx二进制文件。从此处nginx源码目录为:/usr/local/nginx-1.13.4。即为编译命令执行目录。
cp /home/nginx/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/nginx
# 重新启动服务
cd /usr/local/nginx/sbin/
./nginx
# 可以通过./nginx -V命令查看以下模块是否安装成功
3.6.2 配置方式
在events和http同级除,添加stream模块。
stream {
# 日志格式
log_format steamlog '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
# 日志文件路径配置
access_log logs/stream-access.log steamlog;
# 错误日志路径配置
error_log logs/stream-error.log;
server {
# 监听端口
listen 46000;
# socket转发地址
proxy_pass 172.17.21.140:46000;
}
}