普通安装方式
更改默认配置
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
Nginx 容器内的默认首页 html 文件目录为 /usr/share/nginx/html,日志文件位于 /var/log/nginx
执行 exit 命令我们可以从容器内部退出。
将 Nginx 容器内部配置文件挂载到主机
将 Nginx 容器内部配置文件挂载到主机,之后就可以在主机对应目录修改即可。适合频繁修改,复杂使用的情况。
在主机下创建挂载目录
mkdir -p /nginx/{conf,html,logs}
# -p 是 --parents 的缩写 它创建直到给定目录的整个目录树。
# {conf,html,logs} 三个并列的文件夹
拷贝容器 nginx.conf 和 default.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;
}
备注: 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 负载均衡配置
-
加入 upstream 节点
upstream xxxserver{ server localhost:8182; server 192.168.1.101:8182; } -
将 server 节点下的 location 节点中的 proxy_pass 配置为:http:// + upstream名称,即
location / { proxy_pass http://xxxserver; } -
负载均衡配置完毕。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 只判断是模糊匹配还是精确匹配
- 没有 "/" 结尾时,location /abc/def 可以匹配 /abc/defghi 的请求,也可以匹配 /abc/def/ghi ......
- 有 "/" 结尾时,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