nginx实践之安装nginx和根据host header转发到不同地址

Nginx也使用很多次,修改配置,调整参数等等。但是每次要使用的时候都是临时查,所以这次准备记录一下nginx的安装和配置调整过程,加深记忆和理解。

安装Nginx

这里我选择nginx 的源码安装方式,也就是下载源码手工编译安装。

1.安装依赖库

  • 安装gcc g++,nginx 源码进行编译,编译依赖 gcc 环境
  • 安装pcre pcre-devel #PCRE(Perl Compatible Regular Expressions) 是一个 Perl 库,包括 perl 兼容的正则表达式库。nginx 依赖 PCRE 库。
  • 安装zlib #zlib 适用于数据压缩的函式库,由 Jean-loup Gailly (负责 compression)和 Mark Adler (负责 decompression)开发。 nginx 依赖 zlib 库。
  • 安装OpenSSL #OpenSSL 是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。Nginx 也依赖 OpenSSL,需要在 Centos 安装此库。
1
2
3
4
yum install -y gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel

2.下载源码并解压

1
2
curl -O http://nginx.org/download/nginx-1.23.3.tar.gz
tar -zxvf nginx-1.23.3.tar.gz

curl

3.配置Nginx、编译、安装

nginx使用configure程序进行编译模块的配置,可以根据需求选择需要加载的模块,我这里是需要https模块,并且需要tcp转发所以需要https模块和stream模块等

1
2
3
4
5
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module  --with-stream --with-stream_ssl_module
make
make install
#创建软连接 随时可以找到nginx
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/

nginx-start
好了,到这里nginx 就安装完并且正常启动了。

nginx配置根据host header转发到不同地址

有时候nginx会有多个转发地址的需求,我们可以根据不同的请求参数来设定转发地址的路径,可以参考这篇文章:https://sites.psu.edu/jasonheffner/2015/06/19/nginx-use-different-backend-based-on-http-header/
我这里是需要配置两台http server,一个静态网页的:

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 8001;
server_name localhost;
location / {
root /data/sftp/my-sftp;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

这里相当于在8001端口开放了一个静态html网页的http server,然后实际http server转发的配置如下:
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
upstream remote{
server x.x.x.x:xx;
}
upstream local_another {
server 127.0.0.1:8001;
}
# map to different upstream backends based on header
map $http_host $pool {
default "remote";
xxx.com "local_another";
www.xxx.com "local_another";
}
server {
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
listen 443 ssl;
#ssl off;
ssl_certificate /root/ssl/server.pem;
ssl_certificate_key /root/ssl/server.key;
ssl_session_timeout 5m;
location / {
proxy_pass http://$pool;
#standard proxy settings
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

这里面最重要的配置是下面这个配置:
1
2
3
4
5
map $http_host $pool {
default "remote";
xxx.com "local_another";
www.xxx.com "local_another";
}

也就是根据http header host 来转发到不同的上游系统,默认转发到remote,如果host是xxx.com转发到local_another,也就是前面启动在8001端口的http server。
经过测试,这个配置也验证生效了, 果然nginx的配置还是很自由且简单的。