本文主要记录如何在 Linux 中安装 Nginx。

1. 下载 Nginx

官网链接:nginx: download

选择你需要的版本即可,这里我下载的是 1.18.0 版本的。

2. 上传并解压

下载下来后使用 ftp 工具将压缩包上传到服务器的指定目录下并解压:

# 切换到你刚才上传的 nginx 所在目录下
cd /usr/local/environment/nginx
# 解压
tar -zxvf nginx-1.18.0.tar.gz 

3. 安装 nginx 所需要的环境

# openssl 和 openssl-devel 是使用 nginx 配置 SSL 时需要用到的依赖
# 如果不需要配置 SSL 则可以不安装这两个依赖
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel

4. nginx 初始化

解压完成后还是无法启动的,我们下载的是源码,需要自己编译打包,生成一个 sbin 目录。

首先切换到我们解压出来的 nginx 目录中,并执行以下命令进行初始化:

cd /usr/local/env/nginx/nginx-1.18.0/
# --prefix 后面的路径是指定 sbin 目录生成的位置
# 如果需要支持 https 访问网站,则前面需要安装 openssl 和 openssl-devel 依赖
# 并在这里加上 --with-http_ssl_module 参数进行初始化
./configure --prefix=/usr/local/environment/nginx/nginx-1.18.0 --with-http_ssl_module
make
make install

如果一切顺利的话就会在你刚刚指定的路径下生成一个 sbin 目录,里面存放着一个名字叫做 nginx 的文件。这个文件就是 nginx 的启动文件。

5. 启动 nginx

进入到 sbin 目录下,使用指定 nginx 配置文件的方式启动:

cd /usr/local/env/nginx/nginx-1.18.0/sbin/
# -c 表示指定配置文件
./nginx -c /usr/local/env/nginx/nginx-1.18.0/conf/nginx.conf

上面启动可能会报没有 /usr/local/env/nginx/nginx-1.18.0/logs/access.log/usr/local/env/nginx/nginx-1.18.0/logs/error.log 的错。只需要自己手动创建以下这两个文件即可。

cd /usr/local/env/nginx/nginx-1.18.0/
mkdir logs
cd logs
touch access.log
touch error.log

然后再重新启动 nginx 应该就不会报错了。

nginx 默认的配置监听的是 80 端口,因此我们打开浏览器访问 http://服务器 IP,如果看见 Welcome to Nginx! 的欢迎页面则表示我们 Nginx 安装成功了。

6. 配置 SSL

首先需要准备 SSL 证书,可以自签也可以使用各云服务厂商提供的免费证书。我这里使用的是阿里云免费的 SSL 证书。

在阿里云下载 Nginx 用的证书后,解压出来会有两个文件,一个后缀名为 .key 和一个后缀名为 .pem 的文件。

6.1. 上传证书

cd /usr/local/env/nginx/nginx-1.18.0/conf
# 新建一个名字叫做 cert 的目录用于存放证书
mkdir cert

使用 ftp 将刚才下载的两个文件上传至刚建好的 cert 目录下,然后回到 conf 目录下,先备份一份默认的 nginx 配置文件,避免后续把配置文件改坏了没法恢复。

cp /usr/local/env/nginx/nginx-1.18.0/conf/nginx.conf /usr/local/env/nginx/nginx-1.18.0/conf/nginx.conf.bak

6.2. 修改 nginx.conf 文件

vim /usr/local/env/nginx/nginx-1.18.0/conf/nginx.conf

6.2.1. 配置 SSL 和反向代理

增加一个 server 段,如下,直接拷贝到配置文件末尾中:

server {
        listen 		 443 ssl;
        server_name  你的域名或者你的 ip 地址;
        ssl_certificate /usr/local/env/nginx/nginx-1.18.0/conf/cert/你的 pem 文件名字.pem;  
        ssl_certificate_key /usr/local/env/nginx/nginx-1.18.0/conf/cert/你的 key 文件名字.key; 
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
    
        # 代理路径
        location / {
            # web 网站程序存放目录
            root	html;
            index	index.html index.htm;
            # 如果需要配置反向代理,以 Java + SpringBoot 项目为例,跳转到 8088 端口
            proxy_pass	http://localhost:8088;
        }
        
        # 注意,SpringBoot 项目很有可能导致项目的静态资源(图片、css、js)被拦截
        # 因此还需要配置静态资源的反向代理
        # 这里的图片后缀自行添加、删除
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            # 解决反向代理无法访问图片的问题,和程序代理路径保持一致
            proxy_pass			http://localhost:8088;
            proxy_set_header	Host $host;
            proxy_set_header	X-Real-IP $remote_addr;
            proxy_set_header	X-Forwarded-For  $proxy_add_x_forwarded_for;
            # 过期时间自己视情况修改
            expires      30d;
        }
        location ~ .*\.(js|css)?$
        {
            # 解决反向代理无法访问 js,css 的问题,和程序代理路径保持一致
            proxy_pass			http://localhost:8088;
            proxy_set_header	Host $host;
            proxy_set_header	X-Real-IP $remote_addr;
            proxy_set_header	X-Forwarded-For  $proxy_add_x_forwarded_for;
            # 过期时间自己视情况修改
            expires      12h;
        }
}

然后回到 sbin 目录下指定配置文件重启 nginx:

cd /usr/local/env/nginx/nginx-1.18.0/sbin/
# 指定配置文件重启 nginx
./nginx -s reload -c /usr/local/env/nginx/nginx-1.18.0/conf/nginx.conf

然后打开浏览器输入 https://你的服务器 IP 或者域名,如果依旧可以看到欢迎页面则表示 SSL 配置成功了。

6.2.2. 配置 HTTP 跳转 HTTPS

继续编辑 nginx.conf 文件:

vim /usr/local/env/nginx/nginx-1.18.0/conf/nginx.conf

找到 server { listen 80 ......} 这一段配置文件,修改或新增如下的部分配置:

server {
        listen		80;
        server_name  你的域名或者 IP 地址;
        # 将所有 HTTP 请求通过 rewrite 指令重定向到 HTTPS
        rewrite ^(.*)$ https://$host$1;
}

然后保存配置文件和上面一样指定配置文件重新启动 nginx 即可。这样 http 开头的请求也会直接被重定向到 https 了。