zoukankan      html  css  js  c++  java
  • Nginx编译安装

    Nginx编译安装

    Linux 7为例子,前边OS的配置或者优化项比如关闭防火墙就忽略不写了。

    主要写Nginx的编译安装。

    官方下载网址:

    Nginx

    Tengine

    一般我们都需要先装pcre, zlib,ssl,pcre为了重写rewrite,zlib为了gzip压缩,ssl 功能需要openssl库。 

    可以使用yum安装,想使用最新版本的pcre,zlib以及ssl可以使用源码安装。

    源码官网下载:pcrepcrezlib

    ssl参考我另外的博客:Linux升级openssh过程

    不过为了方便这里示例是使用yum进行安装的。

    依赖包安装

    yum install -y gcc gcc-c++ make automake autoconf libtool pcre pcre-devel openssl-devel zlib zlib-devel openssl

    配置环境变量

    vi ~/.bash_profile
    export PATH=$PATH:/usr/local/nginx/sbin

    source生效或者重新开启新新会话生效。

    解压编译安装

    tar -zxvf nginx-1.20.1.tar.gz
    cd nginx-1.20.1
    ./configure --prefix=/usr/local/nginx 
    --conf-path=/usr/local/nginx/conf/nginx.conf 
    --with-http_gzip_static_module 
    --with-http_stub_status_module 
    --with-file-aio 
    --with-http_realip_module 
    --with-http_ssl_module
    make
    make install
    echo $?
    
    [root@dm8 soft]# tar -zxvf nginx-1.20.1.tar.gz 
    [root@dm8 soft]# cd nginx-1.20.1
    [root@dm8 nginx-1.20.1]# ./configure --prefix=/usr/local/nginx 
    > --conf-path=/usr/local/nginx/conf/nginx.conf 
    > --with-http_gzip_static_module 
    > --with-http_stub_status_module 
    > --with-file-aio 
    > --with-http_realip_module 
    > --with-http_ssl_module
    
    [root@dm8 nginx-1.20.1]# make
    [root@dm8 nginx-1.20.1]# make install
    [root@dm8 nginx-1.20.1]# echo $?

    依赖包都安装的话基本不会遇到问题。

    另外,如果开始pcre,zlib,ssl使用源码安装,则对应的需要的依赖包和configure使用如下:

    yum install -y gcc gcc-c++ make automake autoconf libtool
    
    ./configure --prefix=/usr/local/nginx 
    --sbin-path=/usr/local/nginx/sbin/nginx 
    --conf-path=/usr/local/nginx/conf/nginx.conf 
    --pid-path=/usr/local/nginx/logs/nginx.pid 
    --with-http_gzip_static_module 
    --with-http_stub_status_module 
    --with-file-aio 
    --with-http_realip_module 
    --with-http_ssl_module 
    --with-pcre=/soft/pcre-8.45 
    --with-zlib=/soft/zlib-1.2.11 
    --with-openssl=/soft/openssl-1.1.1k

    --with-pcre=/soft/pcre-8.45 指的是pcre-8.45的源码路径。

    --with-zlib=/soft/zlib-1.2.11指的是zlib-1.2.11的源码路径。

    --with-openssl=/soft/openssl-1.1.1k指的是openssl-1.1.1k的源码路径。

    建议使用/usr/local/src/目录代替/soft。

    配置开机自启

    Nginx官网选择NGINX Init Scripts启动脚本,根据OS类型为RedHat/CentOS选择Red Hat NGINX Init Script

     

    添加nginx启动脚本

      1 vi /etc/init.d/nginx
      2 #!/bin/sh
      3 #
      4 # nginx - this script starts and stops the nginx daemon
      5 #
      6 # chkconfig:   - 85 15
      7 # description:  NGINX is an HTTP(S) server, HTTP(S) reverse 
      8 #               proxy and IMAP/POP3 proxy server
      9 # processname: nginx
     10 # config:      /etc/nginx/nginx.conf
     11 # config:      /etc/sysconfig/nginx
     12 # pidfile:     /usr/local/nginx/logs/nginx.pid
     13 
     14 # Source function library.
     15 . /etc/rc.d/init.d/functions
     16 
     17 # Source networking configuration.
     18 . /etc/sysconfig/network
     19 
     20 # Check that networking is up.
     21 [ "$NETWORKING" = "no" ] && exit 0
     22 
     23 nginx="/usr/local/nginx/sbin/nginx"
     24 prog=$(basename $nginx)
     25 
     26 NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
     27 
     28 [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
     29 
     30 lockfile=/var/lock/subsys/nginx
     31 
     32 make_dirs() {
     33    # make required directories
     34    user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed 's/[^*]*--user=([^ ]*).*/1/g' -`
     35    if [ -n "$user" ]; then
     36       if [ -z "`grep $user /etc/passwd`" ]; then
     37          useradd -M -s /bin/nologin $user
     38       fi
     39       options=`$nginx -V 2>&1 | grep 'configure arguments:'`
     40       for opt in $options; do
     41           if [ `echo $opt | grep '.*-temp-path'` ]; then
     42               value=`echo $opt | cut -d "=" -f 2`
     43               if [ ! -d "$value" ]; then
     44                   # echo "creating" $value
     45                   mkdir -p $value && chown -R $user $value
     46               fi
     47           fi
     48        done
     49     fi
     50 }
     51 
     52 start() {
     53     [ -x $nginx ] || exit 5
     54     [ -f $NGINX_CONF_FILE ] || exit 6
     55     make_dirs
     56     echo -n $"Starting $prog: "
     57     daemon $nginx -c $NGINX_CONF_FILE
     58     retval=$?
     59     echo
     60     [ $retval -eq 0 ] && touch $lockfile
     61     return $retval
     62 }
     63 
     64 stop() {
     65     echo -n $"Stopping $prog: "
     66     killproc $prog -QUIT
     67     retval=$?
     68     echo
     69     [ $retval -eq 0 ] && rm -f $lockfile
     70     return $retval
     71 }
     72 
     73 restart() {
     74     configtest || return $?
     75     stop
     76     sleep 1
     77     start
     78 }
     79 
     80 reload() {
     81     configtest || return $?
     82     echo -n $"Reloading $prog: "
     83     killproc $prog -HUP
     84     retval=$?
     85     echo
     86 }
     87 
     88 force_reload() {
     89     restart
     90 }
     91 
     92 configtest() {
     93   $nginx -t -c $NGINX_CONF_FILE
     94 }
     95 
     96 rh_status() {
     97     status $prog
     98 }
     99 
    100 rh_status_q() {
    101     rh_status >/dev/null 2>&1
    102 }
    103 
    104 case "$1" in
    105     start)
    106         rh_status_q && exit 0
    107         $1
    108         ;;
    109     stop)
    110         rh_status_q || exit 0
    111         $1
    112         ;;
    113     restart|configtest)
    114         $1
    115         ;;
    116     reload)
    117         rh_status_q || exit 7
    118         $1
    119         ;;
    120     force-reload)
    121         force_reload
    122         ;;
    123     status)
    124         rh_status
    125         ;;
    126     condrestart|try-restart)
    127         rh_status_q || exit 0
    128             ;;
    129     *)
    130         echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
    131         exit 2
    132 esac

     说明:这段脚本分别修改了第12,23,26行。

    其中第12行为nginx.pid位置,虽然是#注释的,不过会影响启动时候pid的判定位置,导致卡住。

    在使用service nginx start的之后会卡住并生成/run/systemd/generator.late/nginx.service文件,该文件中PIDFile的值根据这第12行的位置来生成。

    比如如果不修改12行,默认是

    # pidfile:     /var/run/nginx.pid

    此时有如下问题

    [root@dm8 init.d]# service nginx start
    Starting nginx (via systemctl):  Warning: nginx.service changed on disk. Run 'systemctl daemon-reload' to reload units.
    卡住......

    使用systemctl看状态有:

    [root@dm8 ~]# systemctl status nginx
    ● nginx.service - SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server
       Loaded: loaded (/etc/rc.d/init.d/nginx; bad; vendor preset: disabled)
       Active: activating (start) since Fri 2021-08-27 06:17:14 EDT; 18s ago
         Docs: man:systemd-sysv-generator(8)
      Process: 1627 ExecStart=/etc/rc.d/init.d/nginx start (code=exited, status=0/SUCCESS)
       CGroup: /system.slice/nginx.service
               ├─1287 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
               └─1289 nginx: worker process
    
    Aug 27 06:17:14 dm8 systemd[1]: Starting SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server...
    Aug 27 06:17:14 dm8 systemd[1]: Can't open PID file /var/run/nginx.pid (yet?) after start: No such file or directory

    看最后一行的路径就有问题。

    并且有

    [root@dm8 ~]# cat /run/systemd/generator.late/nginx.service
    # Automatically generated by systemd-sysv-generator
    
    [Unit]
    Documentation=man:systemd-sysv-generator(8)
    SourcePath=/etc/rc.d/init.d/nginx
    Description=SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server
    
    [Service]
    Type=forking
    Restart=no
    TimeoutSec=5min
    IgnoreSIGPIPE=no
    KillMode=process
    GuessMainPID=no
    RemainAfterExit=no
    PIDFile=/var/run/nginx.pid
    ExecStart=/etc/rc.d/init.d/nginx start
    ExecStop=/etc/rc.d/init.d/nginx stop
    ExecReload=/etc/rc.d/init.d/nginx reload

    授权启动脚本

    chmod 755 /etc/init.d/nginx

    启动Nginx并设置开机启动

    确认当前Nginx没在运行。

    [root@dm8 init.d]# service nginx start
    Starting nginx (via systemctl):                            [  OK  ]

    此时,会有如下文件产生。

    [root@dm8 conf]# ll /run/systemd/generator.late/nginx.service 
    -rw-r--r--. 1 root root 510 Aug 27 07:04 /run/systemd/generator.late/nginx.service

    将之拷贝至如下目录。

    cp /run/systemd/generator.late/nginx.service /usr/lib/systemd/system/

    之后的/usr/lib/systemd/system/nginx.service内容如下(有修改)。

    [root@dm8 conf]# cat /usr/lib/systemd/system/nginx.service 
    # Automatically generated by systemd-sysv-generator
    
    [Unit]
    Documentation=man:systemd-sysv-generator(8)
    SourcePath=/etc/rc.d/init.d/nginx
    Description=SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server
    
    [Service]
    Type=forking
    Restart=no
    TimeoutSec=5min
    IgnoreSIGPIPE=no
    KillMode=process
    GuessMainPID=no
    ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
    RemainAfterExit=no
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStart=/etc/rc.d/init.d/nginx start
    ExecStop=/etc/rc.d/init.d/nginx stop
    ExecReload=/etc/rc.d/init.d/nginx reload
    ExecStartPost=/bin/sleep 0.1
    
    [Install]
    WantedBy=multi-user.target

    如果不添加

    ExecStartPost=/bin/sleep 0.1

    systemctl status nginx的话有如下问题,根据Systemd Error "systemd[1]: Failed to read PID from file /var/run/iscsid.pid: Invalid argument" (文档 ID 2335138.1)类似的情形,可以忽略:

    Aug 27 03:39:43 dm8 systemd[1]: Can't open PID file /usr/local/nginx/logs/nginx.pid (yet?) after start: No such file or directory
    或者
    Aug 27 10:15:51 dm8 systemd[1]: Failed to parse PID from file /usr/local/nginx/logs/nginx.pid: Invalid argument

    如果不添加

    [Install]
    WantedBy=multi-user.target

    则无法被enable自启动。

    另外的解决方法:Failed to parse PID from file

    也可以参考官网NGINX systemd service file做修改,正常不需要。

    重载且设置开机自启。

    [root@dm8 ~]# systemctl daemon-reload
    [root@dm8 ~]# systemctl enable nginx
    [root@dm8 ~]# systemctl restart nginx
    [root@dm8 ~]# systemctl status nginx

    另外也可以不需要/etc/init.d/nginx脚本(兼容Linux 6),直接参考NGINX systemd service file创建配置nginx.server。

    参考链接

    https://www.nginx.com/resources/wiki/start/topics/examples/initscripts/

    https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/

    https://www.kancloud.cn/tinywan/nginx_tutorial/753832

    https://www.nginx.cn/install

    https://www.cnblogs.com/skynet/p/4146083.html

    Systemd Error "systemd[1]: Failed to read PID from file /var/run/iscsid.pid: Invalid argument" (文档 ID 2335138.1)

  • 相关阅读:
    父子组件双向通讯
    高德地图采坑实践之文本标记点击事件左半边不生效(已解决)
    高德地图 location字段控制台显示 为字符串类型 实际为对象
    允许长单词、数字、URL换行到下一行
    python 格式化输出详解(占位符:%、format、f表达式)——上篇 理论篇
    python tkinter实现俄罗斯方块 基础版
    python递归三战:Sierpinski Triangle、Tower of Hanoi、Maze Exploring
    python(pygame)滑稽大战(类似飞机大战) 教程
    编辑器测试-TinyMCE
    封装cookie localStorage sessionStorage
  • 原文地址:https://www.cnblogs.com/PiscesCanon/p/15192082.html
Copyright © 2011-2022 走看看