Nginx 配置

515 阅读5分钟

普通安装方式

更改默认配置

vi /usr/local/nginx/conf/nginx.conf 改为:

user  root;
worker_processes  4;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
	worker_connections  2048;
}
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  120;
	#gzip  on;
	include ./conf.d/*.conf;
}

修改自定义配置

vi /usr/local/nginx/conf/conf.d/xxx.conf 改为:

server {
	listen       80;
	server_name  localhost;
	charset utf-8;
	location / {
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Host $http_host;
		proxy_set_header X-NginX-Proxy true;
		proxy_pass       http://localhost:8182;
	}
    location /source {
		# root的话,localhost /source是目录名,配置中/root/ 加上 /source 是完整路径,最后一级目录不配置
		root       /root/;
		# alias 别名:需要配置完整路径,localhost /source 中的/source可以和路径没有任何关系
		#alias      /root/source/;
		autoindex  on;
	}
	location /f {
		root /root/front;
		try_files $uri $uri/ /index.html;
	}
	location ~ ^/(WEB-INF)/ {
		deny all;
	}
	error_page  404              /404.html;
	location = /404.html {
		root   ./html;
	}

	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   ./html;
	}
}

Docker 安装方式

方式一:只做了解,不推荐使用

每次进入到 nginx 容器内部修改。适合改动少,简单使用的情况

进入 Nginx 容器内部

docker exec -it nginx /bin/bash
  • exec:命令代表进入到运行着的容器内部
  • -it:是 -i 与 -t两个参数合并写法,-i -t 标志着为我们指定的容器创建了TTY并捕捉了STDIN
  • nginx:是我们要进入的容器名字,也可以是 id
  • /bin/bash:指定了执行命令的shell

查看配置 Docker 容器内部配置文件

相关的nginx配置文件都在 /etc/nginx 目录下

cd /etc/nginx
ls -l

Snipaste_2021-03-18_22-23-36.png

Nginx 容器内的默认首页 html 文件目录为 /usr/share/nginx/html,日志文件位于 /var/log/nginx

Snipaste_2021-03-18_22-25-32.png

执行 exit 命令我们可以从容器内部退出。

将 Nginx 容器内部配置文件挂载到主机

将 Nginx 容器内部配置文件挂载到主机,之后就可以在主机对应目录修改即可。适合频繁修改,复杂使用的情况。

在主机下创建挂载目录

mkdir -p /nginx/{conf,html,logs}
# -p 是 --parents 的缩写 它创建直到给定目录的整个目录树。
# {conf,html,logs} 三个并列的文件夹

拷贝容器 nginx.confdefault.conf 到主机

docker ps 查看容器ID

docker cp ef:/etc/nginx/nginx.conf /nginx/conf 
dokcer cp ef:/etc/nginx/conf.d/default.conf /nginx/conf/conf.d

参数说明:

  • cp:命令代表复制
  • ef:是我们nginx容器的ID
  • /etc/nginx/nginx.conf:是容器内部nginx.conf 路径

修改 nginx.conf 文件

主要检查是否有 include /etc/nginx/conf.d/*.conf;

示例:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
	# 最主要检查是否有这个属性和路径是否正确
    include /etc/nginx/conf.d/*.conf;
}

修改 default.conf 文件

upstream xxxeserver{
	#ip_hash;
	server 192.168.1.101:8182 backup;
	server 192.168.1.102:8182;
}
server {
	listen       80;
	server_name  192.168.1.101;
	charset utf-8;
	location / {
		alias /home/ec2-user/hibate/ROOT/;
	}
	location /service/ {
		proxy_pass        http://xxxserver/;
		proxy_set_header    Host $host;
		proxy_set_header  X-Real-IP  $remote_addr;
		proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
		client_max_body_size  100m;
	}
	location /admin {
		alias /home/ec2-user/hibate/admin/;
		try_files $uri $uri/ /admin/index.html;
    }
	location /merchant {
		alias /home/ec2-user/hibate/merchant/;
		try_files $uri $uri/ /merchant/index.html;
	}
	location /source {
		alias /home/ec2-user/hibate/source/;
	}
	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   /usr/share/nginx/html;
	}
}

其他可选配置

禁止 ip 访问

__或者!@#等无效的域名,可以理解为其可以匹配任意域名,但是优先级最低,最常见的用法是用来设置默认的 server,即当一个请求的 Host 没有命中其他规则时,会采用默认 server 的配置。这里 return 404;正好能阻挡使用 ip 访问

server {
	listen 80 default;
	server_name _;
	return 404;
}

完整配置:

# 禁止使用 ip 访问
server {
	listen 80 default;
	server_name _;
	return 404;
}
server {
	listen       80;
	server_name  localhost;
	charset utf-8;
	location / {
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Host $http_host;
		proxy_set_header X-NginX-Proxy true;
		proxy_pass       http://localhost:8182;
	}
    location /source {
		# root的话,localhost /source是目录名,配置中/root/ 加上 /source 是完整路径,最后一级目录不配置
		root       /root/;
		# alias 别名:需要配置完整路径,localhost /source 中的/source可以和路径没有任何关系
		#alias      /root/source/;
		autoindex  on;
	}
	location /f {
		root /root/front;
		try_files $uri $uri/ /index.html;
	}
	location ~ ^/(WEB-INF)/ {
		deny all;
	}
	error_page  404              /404.html;
	location = /404.html {
		root   ./html;
	}

	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   ./html;
	}
}

80 自动跳转到 443

server {
	listen 80;
	server_name www.xxxx.com;
	rewrite ^(.*)$ https://${server_name}$1 permanent; 
}

备注: servername可以换成{server_name} 可以换成 host

完整配置:

# 80 自动跳转到 443
server {
	listen 80;
	server_name www.xxxx.com;
	rewrite ^(.*)$ https://${server_name}$1 permanent; 
}
server {
	listen              443 ssl;
	server_name         www.xxxx.cn;
	ssl_certificate     /home/server/cres/xxxx.pem;
	ssl_certificate_key /home/server/cres/xxxx.key;
	charset utf-8;
	location / {
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Host $http_host;
		proxy_set_header X-NginX-Proxy true;
		proxy_pass       http://localhost:8182;
	}
    location /source {
		# root的话,localhost /source是目录名,配置中/root/ 加上 /source 是完整路径,最后一级目录不配置
		root       /root/;
		# alias 别名:需要配置完整路径,localhost /source 中的/source可以和路径没有任何关系
		#alias      /root/source/;
		autoindex  on;
	}
	location /f {
		root /root/front;
		try_files $uri $uri/ /index.html;
	}
	location ~ ^/(WEB-INF)/ {
		deny all;
	}
	error_page  404              /404.html;
	location = /404.html {
		root   ./html;
	}

	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   ./html;
	}
}

upstream 负载均衡配置

  1. 加入 upstream 节点

    upstream xxxserver{
        server localhost:8182;
        server 192.168.1.101:8182;
    }
    
  2. 将 server 节点下的 location 节点中的 proxy_pass 配置为:http:// + upstream名称,即

    location / {
    	proxy_pass http://xxxserver; 
    }
    
  3. 负载均衡配置完毕。upstream 依照轮询(默认)方式进行负载

完整配置:

upstream xxxserver{
    server localhost:8182 backup;
    server 192.168.1.101:8182;
}
server {
    listen       80;
    server_name  192.168.1.101;
    charset utf-8;
    location / {
        alias /home/ec2-user/hibate/ROOT/;
        try_files $uri $uri/ /index.html;
    }
    location /service/ {
        proxy_pass        http://xxxserver/;
        proxy_set_header    Host $host;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size  100m;
    }
    location /admin {
        alias /home/ec2-user/hibate/admin/;
        try_files $uri $uri/ /admin/index.html;
    }
    location /merchant {
        alias /home/ec2-user/hibate/merchant/;
        try_files $uri $uri/ /merchant/index.html;
    }
    location /web {
        alias /home/ec2-user/hibate/web/;
        try_files $uri $uri/ /web/index.html;
    }
    location /source {
        alias /home/ec2-user/hibate/source/;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

upstream 其他轮训方式

weight 权重

upstream xxxserver{
    server localhost:8182 weight=5;
    server 192.168.1.101:8182 weight=10;
}

ip_hash 访问 ip

每一个请求按访问 ip 的 hash 结果分配。这样每一个访客固定访问一个后端服务器,能够解决 session 的问题

upstream xxxserver{
	ip_hash;
    server localhost:8182;
    server 192.168.1.101:8182;
}

fair

按后端服务器的响应时间来分配请求。响应时间短的优先分配。与 weight 分配策略相似。

upstream xserver{
    server localhost:8182;
    server 192.168.1.101:8182;
    fair;
}

url_hash

按访问 url 的 hash 结果来分配请求,使每一个 url 定向到同一个后端服务器。后端服务器为缓存时比较有效。注意:在 upstream 中加入 hash 语句。server 语句中不能写入 weight 等其他的参数,hash_method 是使用的 hash 算法。

upstream xxxserver{
    server localhost:8182;
    server 192.168.1.101;
	hash $request_uri;
	hash_method crc32;
}

upstream 每个设备设置状态值

down

表示单前的 server 临时不参与负载

weight

默认是 1,权重越大,负载越大

max_fails

设定 Nginx 与服务器通信的尝试失败的次数。在 fail_timeout 参数定义的时间段内,如果失败的次数达到此值,Nginx 就认为服务器不可用。在下一个 fail_timeout 时间段,服务器不会再被尝试。 失败的尝试次数默认是 1。设为 0 就会停止统计尝试次数,认为服务器是一直可用的。 你可以通过指令 proxy_next_upstream、 fastcgi_next_upstream 和 memcached_next_upstream 来配置什么是失败的尝试。 默认配置时,http_404 状态不被认为是失败的尝试。fail_timeout=*time* 设定

fail_timeout

失败时间段

upstream xxxserver{
    server localhost:8182 backup;
    server 192.168.1.101:8182 max_fails=3 fail_timeout=30s;
}

backup

其他全部的非 backup 机器 down 或者忙的时候,请求 backup 机器。所以这台机器压力会最轻

在 proxy_pass 中代理的 url 最后有无 / 结尾区别

在 location 中匹配的 url 最后有无 / 结尾,指的是模糊匹配与精确匹配的问题 在 proxy_pass 中代理的 url 最后有无/结尾,指的是在 proxy_pass 指定的 url 后要不要加上 location 匹配的 url 的问题 几种例子说明此问题 location 只判断是模糊匹配还是精确匹配

  1. 没有 "/" 结尾时,location /abc/def 可以匹配 /abc/defghi 的请求,也可以匹配 /abc/def/ghi ......
  2. 有 "/" 结尾时,location /abc/def/ 不能匹配 /abc/defghi 的请求,只能精确匹配 /abc/def/ghi 这样的请求 举例:

要访问的url:blog.com/proxy/login…

#情况1
location /proxy/ {
	proxy_pass http://myblog.com:8000/;
}
# proxy_pass的最终地址就是: http://myblog.com:8000/login.html  因为proxy_pass 以/跟结尾,代表绝对路径,所以不会加上location匹配的proxy

#情况2
location /proxy/ {
	proxy_pass http://myblog.com:8000;
}
#proxy_pass 代理到 http://myblog.com:8000/proxy/login.html

#情况3
location /proxy/ {
	proxy_pass http://myblog.com:8000/disquz/;
}
#proxy_pass 代理到http://myblog.com:8000/disquz/login.html

#情况4
location /proxy/ {
	proxy_pass http://myblog.com:8000/disquz;
}
#proxy_pass 代理到http://myblog.com:8000/disquzlogin.html