如何正确的安装和使用Nginx

382 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

安装

使用官方推荐的repo方式安装,也可以使用docker。

基于docker安装

搜索看下官方提供的镜像:

# 搜索
[root@localhost ~]# docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        17735     [OK]       
linuxserver/nginx                                 An Nginx container, brought to you by LinuxS…   181                  
bitnami/nginx                                     Bitnami nginx Docker Image                      143                  [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   67                   
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   22                   [OK]
rancher/nginx-ingress-controller                                                                  11                   
ibmcom/nginx-ingress-controller                   Docker Image for IBM Cloud Private-CE (Commu…   4                    
bitnami/nginx-ldap-auth-daemon                                                                    3    

# 拉取
[root@localhost ~]# docker pull nginx

# 运行
[root@localhost ~]# docker run -d -p 80:80  \
              -p 443:443  \
 --name nginxweb \
 -v /opt/docker/nginx/html:/usr/share/nginx/html \
 -v /opt/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
 -v /opt/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
 -v /opt/docker/nginx/logs:/var/log/nginx \
 nginx 

这样就可以了,配置文件和部署目录也已经挂载到本地 /opt/目录下。

基于repo安装

# 准备
sudo yum install yum-utils -y
# 设置repo
vim /etc/yum.repos.d/nginx.repo
# 输入以下内容------------------
    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true

    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
# 输入以上内容------------------

# 执行安装
sudo yum install nginx 

默认nginx repo会安装稳定版本,如果想改为最新版本,可使用:
sudo yum-config-manager --enable nginx-mainline

查看安装详情

版本及基本信息

nginx -V

  • 默认主配置文件:--conf-path=/etc/nginx/nginx.conf
  • 实际server配置文件:/etc/nginx/conf.d/default.conf,可以创建多个server配置文件并导入主配置文件即可

安装详情

执行rpm -ql nginx,输出以下内容:

[root@localhost ~]# rpm -ql nginx
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
# 这里是主配置文件中,include引入的server配置块内容,也就是我们日常配置的主要文件
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/mime.types
/etc/nginx/modules
# 主配置文件,这里只包含http配置块,server配置块在另外一个地方,采用include引入
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.21.4
/usr/share/doc/nginx-1.21.4/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
# 部署时,静态文件存放的位置
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx

进一步查看真正的nginx.conf文件在哪里?

执行vim /etc/nginx/nginx.conf 查看配置:

这种http指令块和server指令块分离的好处,可以单独配置多个server,且不会因为某个新手员工犯错导致其他服务不可用的风险

image.png

基本使用

Nginx有一个主进程和几个工作进程。主进程的主要目的是读取和评估配置,并维护工作进程。工作进程实际处理请求。

nginx使用基于事件的模型和依赖于os的机制来有效地在worker进程之间分发请求。工作进程的数量在配置文件中定义,可以根据给定的配置而固定,也可以根据可用的CPU核数自动调整。

常用指令

  • stop — 快速关闭,不安全
  • quit — 安全关闭,会等待执行完当前的请求
  • reload — 重新加载配置文件,如果配置文件正确,会启动新的work进程,并尝试关闭旧进程,旧进程收到通知不再接受新请求,并执行完当前请求后关闭
  • reopen —重新打开日志文件

以上命令需在运行nginx的同一个用户下执行。

可以直接发送信号给nginx进程:

# 其中1628是pid
kill -s QUIT 1628

通过 ps -ax | grep nginx 可以获取Nginx所有进程。

关于reload

nginx主进程收到指令后,会检查nginx.conf配置文件是否正确,如果有错误,依然使用原来配置,新配置文件不生效。
如果没问题,会向工作进程work-processes发送关闭的信号,工作进程收到信号后,会首先停止接受新的请求,并把当前请求处理完,最后关闭自己。

基本配置

server{
  listen 8080;
  server_name localhost;
  # 如果在子节点不配置root,则该配置生效
  root /www; 
  
  location / {
    # 该配置文件生效,就近员原则
     root /data/www;
  }
  
  # 匹配的路径越详细越生效,即越长越生效
  # root和alias区别是:alias会把匹配的部分去掉,root会直接拼接到后面
  location /images/ {
    # 访问localhost:8080/images/banner.jpg时,实际会到/data/images/banner.jpg查找
    root /data;
    #  访问localhost:8080/images/banner.jpg时,实际会到/data/images/banner.jpg查找
    #alias /data/images;
  }
  
  # 正则前缀有一个 ~,优先级最高
  location ~ .(gif|jpg|png)$ {
    # 访问localhost:8080/images/a.gif时,会到/data/images/a.gif查找
    root /data;
    # 浏览器30天内再次访问图片时,直接访问浏览器缓存(f12看response-header中的expires,但会被cache-control:max-age覆盖),不再请求nginx
    expires 30d;
  }
}

server_name

根据请求中的Host判断。

服务名中的 * 号,只能出现在 server_name 的开头或结尾,并且以 . 与其他部分隔开,不能出现在中间或者替代部分单词。

匹配顺序

  1. 完全匹配的名字
  2. 以*开头的名字
  3. 以*结尾的名字
  4. 其他正在表达式

如果相同的匹配到多个,则按照上下顺序,采用第一个。
按照以上顺序,查找性能越来越慢,所以要尽可能配置为具体的服务器名。

一个配置案例

user  nginx;
worker_processes  2;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    tcp_nopush     on;
    keepalive_timeout  65;
    gzip  on;
	gzip_min_length 1k;
	gzip_buffers 4 16k;
	gzip_http_version 1.0;
	gzip_comp_level 2;
	gzip_types text/plain application/javascript application/css  text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
	gzip_vary off;
	gzip_disable "MSIE [1-6]\.";
    server {
        listen       8036;
        server_name  192.168.10.101;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location ~/group[1-3]/M00 {
            ngx_fastdfs_module;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    upstream rhpwServer{
	server 192.168.10.101  max_fails=3;
    }
    upstream sewage{
        server 192.168.10.101  max_fails=3;
    }
    server {
        listen       5001;
        server_name  localhost;
        location / {
            root   /home/projs/proj02/web/dist;
            index  index.html index.htm;
        }
        location ^~ /proj02/ {
	    proxy_pass http://localhost; 
	    proxy_set_header Host $host:8099;
            proxy_redirect off ; 
	    proxy_set_header X-Real-IP $remote_addr; 
	    proxy_set_header REMOTE-HOST $remote_addr; 
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
	    client_max_body_size 100m; 
	    client_body_buffer_size 256K;
	    proxy_connect_timeout 90; 
	    proxy_send_timeout 90; 
	    proxy_read_timeout 90; 
	    proxy_buffer_size 4k; 
	    proxy_buffers 4 32k; 
	    proxy_busy_buffers_size 64k;
	    proxy_temp_file_write_size 64k;
	    proxy_next_upstream error timeout invalid_header http_503; 
	    proxy_max_temp_file_size 128m; 
        }
    }

    server{
        listen       7001;
        server_name  192.168.10.101;
        location / {
            root   /home/proj2/proj01/app/dist;
            index  index.html index.htm;
        }
    }
   server{
        listen       3000;
        server_name  192.168.10.101;
        location / {
            root   /home/projs/proj01/web/dist;
            try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }
        location ^~ /proj01/ {
            proxy_pass http://localhost;
            proxy_set_header Host $host:8099;
            proxy_redirect off ;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size 100m;
            client_body_buffer_size 256K;
            proxy_connect_timeout 90;
            proxy_send_timeout 90;
            proxy_read_timeout 90;
            proxy_buffer_size 4k;
            proxy_buffers 4 32k;
            proxy_busy_buffers_size 64k;
            proxy_temp_file_write_size 64k;
            proxy_next_upstream error timeout invalid_header http_503;
            proxy_max_temp_file_size 128m;
        }
    }
}