目录 start

  1. Nginx
    1. Nginx的安装
      1. 命令安装
      2. 编译安装
      3. Docker安装并做反向代理
    2. 命令使用
    3. 配置使用
      1. 本地静态文件Web服务器
        1. 反向代理多个服务
        2. 配置https
          1. certbot来配置Https
        3. 配置Websocket反向代理
      2. 防盗链
      3. 负载均衡
      4. 跨域问题的配置
        1. 静态服务器将后台反代理
  2. Nginx Plus
  3. 问题

目录 end|2019-10-19 17:04|


Nginx

Nginx的安装

命令安装

  • 安装sudo apt install nginx
  • 启动服务 sudo nginx或者sudo /etc/init.d/nginx start
  • 关闭 sudo nginx -s quit 或者 sudo /etc/init.d/nginx stop

编译安装

不建议使用这种方式进行安装,很容易出现兼容问题

  • 下载 nginx,pcre,zlib,openssl 的压缩包
  • 进入解压根目录(按实际情况配置)
    配置各个包
    1
    2
    3
    4
    5
    6
    7
    8
    ./configure --sbin-path=/usr/local/nginx/nginx \
    --conf-path=/usr/local/nginx/nginx.conf \
    --pid-path=/usr/local/nginx/nginx.pid \
    --with-http_stub_status_module \
    --with-http_ssl_module \
    --with-pcre=/home/kuang/pcre-8.20 \
    --with-openssl=/home/kuang/openssl \
    --with-zlib=/home/kuang/zlib-1.2.11

Docker安装并做反向代理

nginx hub 官方镜像

  • 运行命令创建容器运行 docker run --name youhuigo -d -p 80:80 -v /home/kuang/nginx/conf/:/etc/nginx/conf.d/:ro --link you:web nginx

conf 基础配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
upstream gitea {
server 127.0.0.1:6001;
}
server {
listen 80;
server_name git.kuangcp.top;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxt true;

proxy_pass http://gitea;
proxy_redirect off;
}
}

配置多域名反向代理 其实也就是多了 俩 upstream 监听80的server

命令使用

nginx -h 输出

1
2
3
4
5
6
7
8
9
10
11
12
13
nginx version: nginx/1.13.3
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: /usr/share/nginx/)
-c filename : set configuration file (default: /etc/nginx/nginx.conf)
-g directives : set global directives out of configuration file

  • -s signal
    • stop 停止
    • quit 退出
    • reopen 重新打开
    • reload 重载(修改配置文件常使用)
  • -t 测试配置
    • 使用 指定配置文件,或者默认配置文件 进行测试

配置使用

Official Doc

知乎专栏
nginx基本配置 | ngrok nginx docker本地搭建服务器

nginx 配置文件的语法是自己独有的语法, 比较像 shell, 里面有用到正则, 变量的概念

  • nginx -s reload 重新加载配置文件

本地静态文件Web服务器

参考 nginx配置静态文件服务器

1
2
3
4
5
6
7
8
9
10
11
server {
client_max_body_size 4G;
listen 80;
# server_name static.kcp; # 如果需要使用域名 则需要在host配置
root /home/mini/Sync;
location / {
autoindex on; # 显示索引
autoindex_exact_size on; # 显示大小
autoindex_localtime on; # 显示时间
}
}

若出现403错误, 将 /etc/nginx/nginx.conf 中第一行的 user nginx; 改成可访问静态文件目录的用户即可

  • 配置某文本文件浏览器直接打开 即 text/plain; 类型

    例: 浏览器直接查看 code 目录下所有源代码

    1
    2
    3
    4
    5
    6
    location /code/ {
    # All files in it
    location ~* {
    add_header Content-Type text/plain;
    }
    }

反向代理多个服务

  • 修改默认配置文件 /etc/nginx/nginx.conf
    • 更好的方式则是: 在 /etc/nginx/conf.d/下新建 *.conf 文件

配置反向代理

80端口上:/路径的请求转发到9991端口 /myth转发到7898端口

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
upstream one {
server 127.0.0.1:9991;
}
upstream two {
server 127.0.0.1:7898;
}

server {
listen 80;
server_name 1.1.1.1;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxt true;

proxy_pass http://one;
proxy_redirect off;
}

location /myth{
proxy_pass http://two;
proxy_redirect off;
}
}

配置https

参考博客 nginx搭建https服务 | nginx http/2

自签发证书 命令运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
############ 证书颁发机构
# CA机构私钥
openssl genrsa -out ca.key 2048
# CA证书
openssl req -x509 -new -key ca.key -out ca.crt
############ 服务端
# 生成服务端私钥
openssl genrsa -out server.key 2048
# 生成服务端证书请求文件
openssl req -new -key server.key -out server.csr
# 使用CA证书生成服务端证书 关于sha256,默认使用的是sha1,在新版本的chrome中会被认为是不安全的,因为使用了过时的加密算法。
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
# 打包服务端的资料为pkcs12格式(非必要,只是换一种格式存储上一步生成的证书) 生成过程中,需要创建访问密码,请记录下来。
openssl pkcs12 -export -in server.crt -inkey server.key -out server.pkcs12

*.conf配置文件 配置HTTPS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
upstream youhui {
server 127.0.0.1:8888;
}
server {
listen 443;
server_name wx.jjyouhuigo.com;
# 主要就是添加了这一块
ssl on;
ssl_certificate /home/youhuigo/https/server.crt;
ssl_certificate_key /home/youhuigo/https/server.key;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxt true;
proxy_pass https://youhui;
proxy_redirect off;
}
}

certbot来配置Https

免费的网站, 并且现在支持泛域名了! 参考博客 | 参考博客
Nginx反向代理https

1
2
3
4
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto 进行安装 但是过程中会有一些设置,
./certbot-auto certonly --email kuangcp@aliyun.com --nginx -d wx.kuangcp.top 生成证书

SSL 接收到一个超出最大准许长度的记录 要在端口后加上SSL 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
32
upstream youhui {
server 127.0.0.1:8080;
}
upstream git{
server 127.0.0.1:55443;
}
server {
listen 80;
server_name git.kuangcp.top;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxt true;
proxy_pass http://git;
proxy_redirect off;
}
access_log /home/kuang/log/youhui.log;
}
server{
listen 443 ssl;
server_name wx.kuangcp.top
ssl on;
ssl_certificate /etc/letsencrypt/live/wx.kuangcp.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wx.kuangcp.top/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/wx.kuangcp.top/chain.pem;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
location / {
proxy_pass https://youhui;
}
access_log /home/kuang/log/https.log;
}

配置Websocket反向代理

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
# 配置连接的配置信息
map $http_upgrade $connection_upgrade{
default upgrade;
'' close;
}
upstream back_end {
server 127.0.0.1:8888;
}
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Nginx-Proxt true;

# 设置接收到的请求类型
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

proxy_pass http://back_end;
proxy_redirect off;
proxy_read_timeout 300s;
}
}

防盗链

负载均衡

Nginx 反向代理 负载均衡 虚拟主机配置

跨域问题的配置

需要被跨域访问的一端, 添加如下配置

1
2
3
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;

静态服务器将后台反代理

极大地省去了后台的配置!!
Nginx反向代理解决跨域问题 | nginx简易使用教程,使用nginx解决跨域问题

配置静态端

1
2
3
4
5
6
7
8
9
10
11
12
server {
client_max_body_size 4G;
listen 80; ## listen for ipv4; this line is default and implied
server_name view.kcp;
location /api/ {
# add_header 'Access-Control-Allow-Origin' '*';
proxy_pass http://127.0.0.1:8889;
}
location / {
root /home/kcp/IdeaProjects/Base/graduate/static;
}
}

  1. 将静态文件交由Nginx进行处理, 后台的服务统一用一个前缀和前台进行区分, 然后将服务端的真实host和ip或者域名配置进来
  2. 这样在于前端看来就是访问 view.kcp/api 而已, 实际上访问的是 127.0.0.1:8889/api

    由于我原先用了nginx反向代理tomcat, 配置一个修改本地host得到的域名, 然后填在这里就没用了, 所以最好使用真实IP或者外网可访问的域名


Nginx Plus

对标 F5 BIG-IP

5-reasons-switch-f5-big-ip-to-nginx-plus


问题

  • 文件上传报错 413
    • http{} 中添加 client_max_body_size 80M;