快速开启 Nginx

一些重要的事

防止泄漏

记得设置 default_server,否则在删除对应的 conf 后可能导致不该出现的 server 暴露出来。

server {
  listen    80 default_server; # 在 listen 后追加,而非 server_name
  server_name  xxx.example.com example.com;
}

禁止 IP 访问

server {
  listen   80 default_server;
  listen   [::]:80 default_server;
  server_name  _;
  return 444;
}

安装 Nginx

虽然现在大部分时候都上 docker 了,但偶尔自己编译模块时手动安装还是比较方便的。

1. 检测源

首先需要检查当前源是否有 Nginx(CentOS示例),当没有的时候需要自己添加源。

yum list | grep nginx
# nginx.x86_64                             1:1.12.2-2.el7                  epel   
# nginx-all-modules.noarch                 1:1.12.2-2.el7                  epel   
# nginx-filesystem.noarch                  1:1.12.2-2.el7    

2. 更新 yum 源并安装

官网open in new window 中 Nginx 稳定版本已经是 1.20.1 ,而检测结果依然是 1.12.2修改open in new window yum 源来获取最新版。

更新 Nginx 的源在 CentOSUbuntu 中稍有不同,需要区别安装。

3. 编译安装

当需要添加一些第三方模块时就可以使用该形式,以下为 CentOS 7.6

下载

进入官网open in new window获取对应的版本下载链接。

wget http://nginx.org/download/nginx-1.20.1.tar.gz

tar -zxvf nginx-1.20.1.tar.gz # 解压
ll nginx-1.20.1 # 验证
cp -r nginx-1.20.1/contrib/vim/* ~/.vim # 拷贝 vim 配置
vim nginx-1.20.1/conf/nginx.conf # 验证

配置

./configure --help | less # 查看帮助
./configure --prefix=/home/shanyuhai/nginx # 指定目录

# 可能会缺乏依赖(解决方案)
yum install -y httpd-devel pcre perl pcre-devel zlib zlib-devel GeoIP GeoIP-devel # 重新执行,当然也可以先使用 yum 安装自动获取一遍依赖(暂不清楚是否会导致负面影响)

# 结果如下
# creating objs/Makefile # 新增目录

# nginx path prefix: "/home/shanyuhai/nginx"
# nginx binary file: "/home/shanyuhai/nginx/sbin/nginx"
# nginx modules path: "/home/shanyuhai/nginx/modules"
# nginx configuration prefix: "/home/shanyuhai/nginx/conf"
# nginx configuration file: "/home/shanyuhai/nginx/conf/nginx.conf"
# nginx pid file: "/home/shanyuhai/nginx/logs/nginx.pid"
# nginx error log file: "/home/shanyuhai/nginx/logs/error.log"
# nginx http access log file: "/home/shanyuhai/nginx/logs/access.log"
# nginx http client request body temporary files: "client_body_temp"
# nginx http proxy temporary files: "proxy_temp"
# nginx http fastcgi temporary files: "fastcgi_temp"
# nginx http uwsgi temporary files: "uwsgi_temp"
# nginx http scgi temporary files: "scgi_temp"

ll objs # 查看稍后 make 的内容
make # 编译
ll objs # 验证
make install # 安装

/home/shanyuhai/nginx/sbin/nginx -V # 验证

必须知道的基本操作

启用安全组

在一顿操作之后,明明本地可以访问,为啥外网访问不了?可能是你忘记开放云服务器的安全组了。

操作流程:

登录 > 控制台 > 云服务器ECS(左侧) > 安全组 > 配置规则 > 添加安全组规则 > 填充内容 > 确定

进程与端口

# 进程
# ps 是 Process Status 的简写,可以通过 ps 来查看对应的进程
ps -ef | grep nginx
# 端口
# netstat 是 net status 的简写, 可以查看有哪些端口正在被占用
netstat -lntup

启动

# 直接启动
nginx
# systemctl 启动
systemctl start nginx.service
# 开机自启
systemctl enable nginx.service

停止

# normal quit
nginx -s quit
# force stop
nginx -s stop
# systemctl
systemctl stop nginx.service

# kill pid
killall nginx
## 或
kill -9 pid

重启

# normal
nginx -s reload
# systemctl
systemctl restart nginx.service

内置变量

Nginx 提供了丰富的内置变量open in new window,如果引入了其他模块还会有对应模块的变量。

variablemoduledescription
$args请求参数
$uri当前请求的 uri,不带参数
$request_uri请求的 uri,带完整参数
$host请求报文的 host 首部
$hostnamengx_http_core_moduleNginx 服务运行在主机的主机名
$remote_addrngx_stream_core_module客户端 IP
$remote_portngx_stream_core_module客户端端口
$request_filename用户请求中的 uri 经过本地 rootalias 映射后的本地文件路径。可将其加入 log 中研究 rootalias
$server_addrngx_stream_core_module服务器 IP
$server_portngx_stream_core_module服务求端口
$server_protocol服务器的 HTTP 协议版本,例 HTTP/1.0HTTP/1.1
$scheme请求中的协议,例 httphttps

指定 module 时基本上都有 ngx_http_core_module

参考资料

  1. Nginxopen in new window
  2. 《精通Nginx》:Dimitri Aivaliotis 著