Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现很好。

1. 安装nginx

nginx是最常用的反向代理代理服务器,现在就让nginx为我们做反向代理吧。我们可以通过centosyum安装,也可以自己编译安装,或者也可以通过本地rpm安装。如果对版本没有什么要求,还是推荐yum安装,很简单无需过多的配置。

1.1 yum安装nginx

1
2
3
4
5
6
7
8
9
#搜索nginx 两种方式都可行
yum search nginx --showduplicates
yum list nginx --showduplicates

#安装指定版本,不指定版本直接yum install -y nginx即可
yum install -y nginx-all-modules-1.16.1-3.el7.noarch

#查看nginx是否安装完成
nginx -v

1.2 rpm包安装nginx

yumnginx包一般跟随系统版本变化,有时候可能yum中没有我们想要的版本,我们可以使用rpm包进行安装。首先我们需要去网上下载一个rpm包(rpm包下载),找到我们想要的版本然后下载下来。例如下载 nginx-all-modules-1.16.1-3.el7 及相关安装依赖包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#以下是nginx全模块包及其依赖
#nginx-1.16.1-3.el7.x86_64.rpm
#nginx-all-modules-1.16.1-3.el7.noarch.rpm
#nginx-filesystem-1.16.1-3.el7.noarch.rpm
#nginx-mod-http-image-filter-1.16.1-3.el7.x86_64.rpm
#nginx-mod-http-perl-1.16.1-3.el7.x86_64.rpm
#nginx-mod-http-xslt-filter-1.16.1-3.el7.x86_64.rpm
#nginx-mod-mail-1.16.1-3.el7.x86_64.rpm
#nginx-mod-stream-1.16.1-3.el7.x86_64.rpm
#将上述安装包放入创建的nginx文件夹中
mkdir -p /opt/package/nginx

#进入nginx文件夹
cd /opt/package/nginx

#yum本地安装所有安装包
yum localinstall *

#查看nginx是否安装完成
nginx -v

1.3 手动编译安装nginx

首先我们先安装nginx的依赖。

1
2
3
4
5
6
7
yum install -y gcc-c++

yum install -y pcre pcre-devel

yum install -y zlib zlib-devel

yum install -y openssl openssl-devel

然后我们可以去nginx 官网下载安装包,将下载好的文件放到 /usr/local/nginx或者你想放置的目录

1.3.1 解压

1
2
#解压
tar zxf nginx-1.16.1.tar.gz

1.3.2 编译

1
2
3
4
5
6
#进入解压后的文件,编译安装 运行./configure
./configure #./configure --prefix=/usr/local/nginx

#编译并安装
make && make install
#编译安装之后出现make[1]: Leaving directory '/usr/local/nginx/nginx-1.16.1' 表示编译成功

1.3.3 测试启动nginx

1
2
3
4
5
6
7
8
9
10
11
12
#cd到刚才配置的安装目录/usr/loca/nginx/ 测试是否安装成功
./sbin/nginx -t

#启动nginx
cd /usr/local/nginx/sbin
./nginx

#查看nginx进程号
ps aux | grep nginx

#杀掉nginx
kill -9 <进程号>

1.3.4 配置nginx环境变量

1
2
#配置环境变量
vim /etc/profile
1
2
3
#配置nginx的环境变量
PATH=$PATH:/usr/local/nginx/sbin
export PATH
1
2
#生效
source /etc/profile

1.3.5 建立service启动文件

1
2
#建立服务文件,并进入编辑
vim /lib/systemd/system/nginx.service
1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
#PrivateTmp=True

[Install]
WantedBy=multi-user.target
1
2
#重载守护进程,使文件生效
systemctl daemon-reload

1.4 启动nginx

安装成功后,启动nginx,其实我们只需要执行最后一个命令即可完成对nginx的启动和设置自启。

1
2
3
4
5
6
7
8
9
10
11
#启动nginx
systemctl start nginx

#停止nginx
systemctl stop nginx

#nginx开启自启
systemctl enable nginx

#启动nginx并开启自启
systemctl enable nginx --now

2. 配置nginx

nginx的配置文件放在/etc/nginx/目录下,我们进入该目录,发现目录有很多文件,我们只需要关注nginx.conf文件即可。
nginx配置目录

我们打开nginx.conf文件,将里面的server{ }块注释掉,因为我们将要配置我们自己的server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#    server {
# listen 80;
# listen [::]:80;
# server_name _;
# root /usr/share/nginx/html;

# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# error_page 404 /404.html;
# location = /404.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }

现在我们先到/etc/nginx/con.d/目录中,新建domain.conf(替换你自己的域名或者其他你想要的名称),这将是我们建立的第一个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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#配置80端口
server {
listen 80 default_server; #默认服务器,如果http匹配不上都会到这里来
listen [::]:80 default_server;
server_name domain.com; #你的域名
root /usr/share/nginx/html; #nginx的静态文件目录

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

# certbot用来申请免费证书用
location ~ /.well-known {
root /usr/share/nginx;
allow all;
}

#将http转到https
rewrite ^(.*)$ https://$host$1 permanent;


}

#配置443端口
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name domain.com; #你的域名
root /usr/share/nginx/html; #nginx的静态文件目录

#这里是你的证书
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;

ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #TLS版本,我们可以都开启,也可以按需配置
ssl_session_cache shared:MozSSL:10m;
ssl_session_timeout 5m; #会话过期时间5分钟
ssl_session_tickets off; #会话票证,开启能节省TLS握手开销
ssl_ciphers HIGH:!aNULL:!MD5; #nginx初始加密
ssl_prefer_server_ciphers off; #如果开启,在TLS握手时启用服务器算法优先,由服务器选择适配算法而非客户端选择

#keepalive_timeout 60; #保持连接超时时间60分

# 包含其他的配置文件
include /etc/nginx/default.d/*.conf;

# 同样是certbot用来申请免费证书用
location ~ /.well-known {
root /usr/share/nginx;
allow all;
}


#这里可以配置自己的服务,让nginx反向代理你的服务


# 404页面
error_page 404 /404.html;
location = /40x.html {
}

# 服务器错误的页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

设置完domain.config后我们退出保存,现在就运行命令让nginx生效。

1
2
3
4
5
#检查nginx配置文件语法是否正确
nginx -t

#重载nginx,让配置文件生效
nginx -s reload

现在我们访问domain.com,应该会出现Welcome to CentOS页面,因为我们设置了nginx静态文件的目录,它会访问nginxindex.html文件
Welcome to CentOS

3. 防火墙放行

虽然我们已经将nginx的配置完成了,但我们依然需要配置[[防火墙]]才可以外部访问,如果是阿里云vps或腾讯云可以配置安全组以放行nginx 代理的80端口443端口

1
2
3
4
5
6
7
8
9
10
11
#开放80和443端口 
#zone=public代表公开空间 外部可访问
# --permanent表示永久有效
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent

#重载防火墙
firewall-cmd --reload

#查看开放的防火墙
firewall-cmd --zone=public --list-ports

4. 申请TLS证书

申请证书我们可以使用免费的certbot来进行申请,certbot使用的是Let's Encrypt。之前,我们已经给nginx配置了location ~ /.well-known的代理,certbot需要这个路径进行证书申请。

1
2
3
4
5
6
7
8
9
10
11
#先安装cerbot
yum install cerbot

#查看certbo的版本,也可以用来验证是否安装成功
certbot --version

#申请正式
#将xxx@email.com换成自己的邮箱
#将domain.com换成自己的域名
#-w /usr/share/nginx/指定的是nginx的文件目录,如果跟我一样自己装的nginx,无需更改
certbot certonly --webroot --agree-tos -v -t --email xxx@email.com -w /usr/share/nginx/ -d domain.com

如果出现Congratulations说明申请成功,同时会附上域名证书的路径,这个路径就是我们配置nginx证书位置填的路径。

1
2
/etc/letsencrypt/live/domain.com/fullchain.pem
/etc/letsencrypt/live/domain.com/privkey.pem
  • nginxssl_certificate配置fullchain.pem
  • nginxssl_certificate_key配置privkey.pem

5. 自动续签TLS证书

certbot申请的证书一般只有2-3个月的有效期,过了有效期就需要进行续签。那么怎么才能自动续签呢。我们可以使用cron定时任务来自动运行certbot进行续签。

1
2
#配置cron定时任务,以下命令打开cron的配置文件
crontab -e

添加一个cron定时任务

1
2
# 设置每天的0点钟进行续签, post-hook是续签完成之后操作的命令
0 0 * * * certbot renew --post-hook "/usr/sbin/nginx -s reload"

网上有些人说需要重启nginx,但我认为nginx -s reload重载命令就是为了重新生效配置文件,停止nginx意味着网站都不能打开了,一般在生产环境是不可能去停止nginx的。不过我还没有到续签的时候,所以也还没有成功过,如果有成功的经验,欢迎分享。 自动续签已经持续一年多,很稳定。