0%

Ubuntu 18.04下Nginx使用手记

  1. 安装
    1. apt安装
  2. 常用命令
    1. 启动服务
    2. 查看运行状态
    3. 重新加载服务
    4. 退出服务
  3. 服务器配置
    1. 查看和测试配置文件
    2. 设置配置文件
    3. 静态服务器配置
    4. 反向代理
      1. 代理域名
      2. 代理请求

参考资料:

Ubuntu 16.04安装Nginx

Ubuntu安装配置Nginx(一)——部署Web服务

安装

apt安装

推荐使用apt安装,在参考的博客中有一种手动安装的方式,看着挺麻烦,有机会再试吧。

1
2
sudo apt-get update
sudo apt-get install nginx

安装好的文件位置:

/usr/sbin/nginx:主程序

/etc/nginx:存放配置文件

/usr/share/nginx:存放静态文件(好像是旧版本用的)

/var/www/html:默认设置的静态文件目录

/var/log/nginx:存放日志

关于文件位置,其实从上面的根目录文件夹可以知道,Linux系统的配置文件一般放在/etc,日志一般放在/var/log,运行的程序一般放在/usr/sbin或者/usr/bin。

还有一个好处,创建好的文件由于放在/usr/sbin目录下,所以能直接在终端中使用nginx命令而无需指定路径。

常用命令

使用apt-get安装nginx后,会自动创建服务,会自动在/etc/init.d下新建服务脚本nginx,可以在终端中使用如下命令进行操作:

1
sudo service nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}

启动服务

通过系统服务命令启动:

1
sudo service nginx start

直接运行二进制启动:

1
sudo nginx

两种启动方式有所区别,前者使用服务命令启动,可以通过配套的命令service nginx status查看运行状态,后者直接定位到nginx的二进制文件运行,无法查看运行状态。

1
2
which nginx
# /usr/sbin/nginx

无论是哪种方式,都会创建/run/nginx.pid用来记录进程PID,但是会有个bug:

当使用二进制文件启动nginx后,再使用service nginx start启动,会提示启动失败,此时会自动删除/run/nginx.pid,尽管此时nginx仍在运行。退出的命令如:nginx -s stopservice nginx stop,都无法生效,此时只能找到nginx对应的进程PID,将其删除:

1
2
3
4
5
6
7
netstat -nap | grep nginx
#tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 31074/nginx: master
#unix 3 [ ] STREAM CONNECTED 18875659 31074/nginx: master
#unix 3 [ ] STREAM CONNECTED 18875660 31074/nginx: master
#unix 3 [ ] STREAM CONNECTED 18875661 31074/nginx: master
#unix 3 [ ] STREAM CONNECTED 18875662 31074/nginx: master
kill 31074

查看运行状态

只有通过命令service nginx start启动的服务可以查看运行状态,对应命令service nginx status

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
service nginx status
#● nginx.service - A high performance web server and a reverse proxy server
# Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
# Active: active (running) since Mon 2022-01-03 00:49:40 CST; 2min 25s ago
# Docs: man:nginx(8)
# Process: 31511 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=1/FAILURE)
# Process: 29998 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)
# Process: 31605 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
# Process: 31604 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
# Main PID: 31606 (nginx)
# Tasks: 3 (limit: 4915)
# CGroup: /system.slice/nginx.service
# ├─31606 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
# ├─31607 nginx: worker process
# └─31608 nginx: worker process
#
#Jan 03 00:49:40 cloud.nap.server systemd[1]: Starting A high performance web server and a reverse proxy server...
#Jan 03 00:49:40 cloud.nap.server systemd[1]: Started A high performance web server and a reverse proxy server.

直接运行nginx启动的服务无法查看运行状态。

重新加载服务

重新加载服务的命令依赖于/run/nginx.pid,无论是哪种方式启动的服务,只要该文件存在,都可以重新加载服务。

修改配置后重新加载时

1
2
3
sudo service nginx reload
sudo service nginx restart
sudo nginx -s reload
  • reloadrestart的区别:前者会在更新配置文件时检查,若配置文件语法出错则保持原先状态不变,不会导致服务中断;后者先执行stop后执行start,会造成服务中断,且不会对语法进行检查,若有错则直接导致启动失败;
  • reload操作可以通过服务service,也可以通过给命令nginx发送信号-s reload执行。

退出服务

退出服务的命令同样依赖于/run/nginx.pid,无论是哪种方式启动的服务,只要该文件存在,都可以通过以下命令退出服务。

直接停止,不管是否有请求没处理完:

1
2
sudo service nginx stop
sudo nginx -s stop

有序退出,等待请求处理完毕:

1
sudo nginx -s quit

服务器配置

查看和测试配置文件

查看并测试配置文件,主要检查语法错误

1
2
3
4
sudo nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

指定配置文件路径

1
2
3
4
sudo nginx -t -c /home/me/a.conf

nginx: [emerg] open() "/home/me/a.conf" failed (2: No such file or directory)
nginx: configuration file /home/me/a.conf test failed

设置配置文件

通过sudo service nginx start或者sudo nginx启动服务时,默认的配置文件为/etc/nginx/nginx.conf

如何修改呢?通过nginx命令启动时,修改方式为添加参数-c

1
sudo nginx -c /etc/nginx/nginx.conf

通过服务启动的话网上资料比较少,且不建议这么修改,最新版本nginx配置是由4个文件构成:

  1. conf.d:用户自己定义的conf配置文件
  2. sites-available:系统默认设置的配置文件
  3. sites-enabled:由sites-available中的配置文件转换生成
  4. nginx.conf:汇总以上三个配置文件的内容,同时配置我们所需要的参数

在部署需要的web服务时,我们可以拷贝sites-enabled中的default文件到conf.d并且修改名字为**.conf,然后进行配置。

nginx.conf中主要进行服务器的全局设置,关于http服务的部署被剥离出去,由其他三个文件夹决定。在nginx.conf中引入conf.dsites-enabled两个文件夹中的服务器配置,引入顺序如下所示:

1
2
3
4
5
http {
# 省略
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

也就是说,服务器配置的东西被写到了http字段下。观察文件夹发现,conf.d文件夹默认为空,sites-enabled文件夹中只有一个default文件,这里面写了基础的服务器配置,包括端口、首页、404页面。

如果在conf.d文件夹中添加服务器配置,那么也不会覆盖掉端口为80的服务端配置,如果要对默认的服务器配置进行修改,最好的办法是把default文件内容复制到另一个文本文件中,命名为xxx.conf放到conf.d中,然后在nginx.conf中把语句include /etc/nginx/sites-enabled/*;注释掉。

静态服务器配置

1
2
3
4
5
6
7
8
9
10
11
12
# Default server configuration
#
server {
# 监听端口
listen 80;

# 设置静态根目录
root /var/www/html;

# 列表:默认首页文件
index index.html index.htm index.nginx-debian.html;
}

关于index,类似于指定了一个页面入口。若不指定,只有通过192.168.0.1/index.html才能访问页面,直接通过192.168.0.1会提示403。

通过如上配置,可以在目录/var/www/html中放置任何html静态页面,并支持文件夹

反向代理

循序渐进nginx(一):介绍、安装、hello world、Location匹配

循序渐进nginx(二):反向代理、负载均衡、缓存服务、静态资源访问

代理域名

只需要加上server_name,即可代理域名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
server_name study.rsgis.whu.edu.cn;

# 设置长连接
keepalive_timeout 70;

location / {
proxy_pass_header server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://127.0.0.1:8088/;
}
}

代理请求

设置了一个静态文件夹,放在3303端口,用80端口的/app路由来代理这个端口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Default server configuration
server {
# 监听端口
listen 80;

# 设置静态根目录
root /var/www/html;

# 列表:默认首页文件
index index.html index.htm index.nginx-debian.html;

location /app/ {
proxy_pass http://localhost:3303/;
}
}

server {
listen 3303;
root /var/www/app;

index index.html;
}

locationproxy_pass设置的讲究

1
2
3
4
5
6
server {
listen 8080;
location /api/ {
proxy_pass http://localhost:8081/;
}
}

在lcoation都是location /api/时,proxy_pass不同,请求的资源也是不一样的:

proxy_pass 请求 转发结果
proxy_pass http://localhost:8081; hostname:8080/api/user/list http://locahost:8081/api/user/list
proxy_pass http://localhost:8081/; hostname:8080/api/user/list http://locahost:8081/user/list
proxy_pass http://localhost:8081/test; hostname:8080/api/user/list http://locahost:8081/testuser/list
proxy_pass http://localhost:8081/test/; hostname:8080/api/user/list http://locahost:8081/test/user/list