官方下载地址
http://nginx.org/en/download.html
我选择安装 1.20.1

官方安装文档
http://nginx.org/en/docs/configure.html

问题和目标

  1. 之前服务器上都是直接 apt install nginx ,版本 1.14
  2. nginx 程序已包含 http_realip_module 模块,网站转发可以获取到客户端实际 IP
  3. 后来使用 nginx 的 Stream 模块作为 ssh/rdp 端口转发,无法转发客户端实际 IP ,内网服务器查看 log 看到的都是nginx转发服务器的内网地址
  4. 需要 stream_realip_module 模块支持
    所以,只能源码重新编译后,替换 apt install 的 nginx 程序
  5. 必须保持原来的配置和环境,不能简单粗暴的再装一个新的 nginx
  6. 练习可以随意折腾,实际环境务必一次成功!

练习环境 :

  1. 虚拟机 Ubuntu 20.04 Server
  2. 再找一个使用 apt install nginx 的同类服务器,用于对照、复制后续设置 文件

下载

  1. 下载链接

     $ wget http://103.78.124.87/2Q2W33852EB623DB3C4CBAA9755060B20190FB888DDA_unknown_EAA1233D75F40EFB2E8191E4E17424732014EC5C_7/nginx.org/download/nginx-1.20.1.tar.gz
    
  2. 解压
    $ tar -zxvf nginx-1.20.1
    $ cd nginx-1.20.1/
    $ ls

     auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  Makefile  man  objs  README  src
    

    其中, auto 目录存在许多自动脚本,暂时没有仔细研究

  3. 安装依赖

     sudo apt install openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev make
    

编译、安装

  1. 先使用最简单方式,不带任何多余模块

    初次练习,可能会多次重新编译、安装
    后续再增加各种模块

  2. ./configure --prefix=/opt/nginx

     ...Configuration summary+ using system PCRE library+ OpenSSL library is not used+ using system zlib library...nginx http uwsgi temporary files: "uwsgi_temp"nginx http scgi temporary files: "scgi_temp"
    
  3. $ sudo make
    $ sudo make install

    或者(注意后面的命令也要带上 sudo)
    $ sudo make && sudo make install

  4. 验证
    $ nginx -v

     nginx version: nginx/1.20.1
    

    $ nginx -t (实际需要 sudo)

     nginx: [alert] could not open error log file: open() "/opt/nginx/logs/error.log" failed (13: Permission denied)nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is ok2021/08/24 16:09:44 [emerg] 2146#0: open() "/opt/nginx/logs/nginx.pid" failed (13: Permission denied)nginx: configuration file /opt/nginx/conf/nginx.conf test failed
    

    $ cd /opt/nginx
    $ ls

     client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp
    

设置 nginx.service

  1. service 定义文件

    $ cd /lib/systemd/system

    从另一个 apt install nginx 的服务器中同样目录下 cp 过来

    $ sudo vim nginx.service

     # After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends# SIGKILL to all the remaining processes in the process group (KillMode=mixed).## nginx signals reference doc:# http://nginx.org/en/docs/control.html#[Unit]Description=A high performance web server and a reverse proxy serverDocumentation=man:nginx(8)After=network.target[Service]Type=forking# wzh 20210824PIDFile=/run/nginx.pid# PIDFile=/opt/nginx/logs/nginx.pidExecStartPre=/opt/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;'ExecStart=/opt/nginx/sbin/nginx -g 'daemon on; master_process on;'ExecReload=/opt/nginx/sbin/nginx -g 'daemon on; master_process on;'  -s reloadExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pidTimeoutStopSec=5KillMode=mixed# wzh 20210824ExecStartPost=/bin/sleep 0.1[Install]WantedBy=multi-user.target
    

    修改说明:

    1). /usr/sbin/nginx 修改为当前的 /opt/nginx/sbin/nginx 目录

    2). 增加一行 ExecStartPost=/bin/sleep 0.1
    给 start 服务加上延迟,以免 服务 status 读取 PID 错误

    3). 修改 PIDFile=/run/nginx.pid
    源码make install 之后 ,PIDFile=/opt/nginx/logs/nginx.pid(nginx -t 不加 sudo 就可以看到)
    为了和 apt 安装方式一致,改为/run/nginx.pid

    4). 对应需要修改 conf/nginx.conf 中的 pid

    $ cd /opt/nginx/conf
    $ vim nginx.conf

     ...#error_log  logs/error.log;#error_log  logs/error.log  notice;#error_log  logs/error.log  info;# wzh 20210824#pid        logs/nginx.pid;pid /run/nginx.pid;...
    
  2. service 启动脚本

    $ cd /etc/init.d

    同样从 apt方式 安装的服务器上 cp 过来这个 nginx 启动脚本

    $ sudo vim nginx

    文件内容太长,以下 2 处修改了路径

     ...    # wzh 20210824# PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin# DAEMON=/usr/sbin/nginxPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opr/nginx/sbinDAEMON=/opr/nginx/sbin/nginxNAME=nginxDESC=nginx...# Try to extract nginx pidfile# wzh 20210824 # PID=$(cat /etc/nginx/nginx.conf | grep -Ev '^\s*#' | awk 'BEGIN { RS="[;{}]" } { if ($1 == "pid") print $2 }' | head -n1)PID=$(cat /opt/nginx/conf/nginx.conf | grep -Ev '^\s*#' | awk 'BEGIN { RS="[;{}]" } { if ($1 == "pid") print $2 }' | head -n1)...
    

    修改为可执行
    $ sudo chmod 755 /etc/init.d/nginx

    重新加载 daemon 服务
    $ sudo systemctl daemon-reload

  3. 设置 nginx.service 开机启动

    $ sudo systemctl enable nginx.service

    $ sudo systemctl list-unit-files |grep nginx

     nginx.service                          enabled         enabled
    
  4. 测试

    $ sudo nginx -t

     nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is oknginx: configuration file /opt/nginx/conf/nginx.conf test is successful
    

    $ sudo service nginx status

    $ sudo service nginx restart

    $ sudo service nginx reload

遇到的问题

  1. Can’t open PID file /run/nginx.pid (yet?) after start: Operation not permitted

    $ sudo service nginx status

     ...Aug 24 14:42:58 ubuntu2004-202 systemd[1]: Starting A high performance web server and a reverse proxy server...Aug 24 14:42:58 ubuntu2004-202 systemd[1]: nginx.service: Can't open PID file /run/nginx.pid (yet?) after start: Operation not permitted...
    

    原因:

    源码make install 之后 ,PIDFile=/opt/nginx/logs/nginx.pid
    从 nginx -t 不加 sudo 就可以看到!

    解决方法:

    修改 /opt/nginx/conf/nginx.conf 和 /lib/systemd/system/nginx.service 一致!
    为了和 apt 安装方式一致,统一修改为 PIDFile=/run/nginx.pid

  2. Failed to parse PID from file /opt/nginx/logs/nginx.pid: Invalid argument

    $ sudo service nginx status

     ...Aug 24 16:15:28 ubuntu2004-202 systemd[1]: Starting A high performance web server and a reverse proxy server...Aug 24 16:15:28 ubuntu2004-202 systemd[1]: nginx.service: Failed to parse PID from file /opt/nginx/logs/nginx.pid: Invalid argumentAug 24 16:15:28 ubuntu2004-202 systemd[1]: Started A high performance web server and a reverse proxy server.
    

    原因:

    服务 start 会有延迟,立刻获取服务的 status 时, PID 文件可能还没有产生

    解决方法:

    修改 /lib/systemd/system/nginx.service ,加上
    ExecStartPost=/bin/sleep 0.1

源码安装 nginx 并设置为 service相关推荐

  1. linux access源码,从零开始学习Linux:Day04 源码安装Nginx 。acess/status/referer

    从零开始学习Linux:Day04 源码安装Nginx .acess/status/referer 常见web服务器有IIS,apche,nginx,tomcat,tengine等等,现在nginx使 ...

  2. linux源码安装nginx

    任务目标:源码安装nginx,作为web服务修改配置文件,让配置生效,验证配置 首先要去官网nginx.org下载一个tar包: tar xvf 解包 进入到解包出来的目录,对configure进行配 ...

  3. 源码安装nginx以及平滑升级

    源码安装nginx以及平滑升级 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 欢迎加入:高级运维工程师之路 598432640 这个博客不方便上传软件包,我给大家把软件包放到百度云 ...

  4. mysql安装 张宴_Linux_centos5 源码安装Nginx + mysql + apache + php的方法,主要依照的是张宴的一篇博文 - phpStudy...

    centos5 源码安装Nginx + mysql + apache + php的方法 主要依照的是张宴的一篇博文<http://blog.s135.com/post/366/>,安装的软 ...

  5. 基于centos5.8源码安装nginx之LNMP

    LNMP 指的是什么呢,这里可以"望文生义",其是linux  NGINX  Mysql  PHP的组合.每一种工具的安装都有其特长来吸引我们去使用它,对此就要了解其组合的各个工具 ...

  6. 源码安装nginx 1.23.1

    先看看仓库们 yum list nginx* 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile bas ...

  7. linux 源码安装 Nginx

    1.安装前环境准备 安装make: # yum -y install gcc automake autoconf libtool make 安装g++: # yum install gcc gcc-c ...

  8. linux下源码安装nginx

    LNMP模式 后续继续更新,先搭建nginx 安装环境gcc gcc-c++ 2 下载源码包解压 配置第一个报错 安装openssl openssl-devel yum -y install open ...

  9. 源码包nginx 配置php,源码安装Nginx和PHP

    1.安装编译环境 yum -yinstall gcc gcc-c++ automake autoconf libtool make glibc yum -y install libmcrypt-dev ...

  10. 测试CSDN的博客功能好不好用——YUM安装Nginx或源码安装Nginx

    yum安装 # 安装openssl1.0.2只需要使用Ali的base库,如下 [root@CentOs1612 /etc]# cat <<EOF > /etc/yum.repos. ...

最新文章

  1. 西湖大学鞠峰组:环境宏病毒组学分析思路与常用工具
  2. mysql5.6.37驱动_MySql (mysql-5.6.37) 在Windows的安装及使用
  3. linux shell中的各种括号的使用方法
  4. C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move
  5. 洛谷 P1494 [国家集训队]小Z的袜子
  6. Hystix熔断解决雪崩问题
  7. 高并发Redis缓存如何设计
  8. 三位数流水码的生成(000·····009··00A····00Z····ZZZ)
  9. Linux从用户层到内核层系列 - GNU系列之glibc介绍
  10. 查看电脑卸载mysql是否干净_如何把Mysql卸载干净(亲测有效)
  11. compute的c语言用法,词汇精选:compute的用法和辨析
  12. php生产环境配置,PHP生产环境配置 - osc_ifi9q17t的个人空间 - OSCHINA - 中文开源技术交流社区...
  13. java rrd_java利用rrd4j做服务监控的图片
  14. matlab教程黄金分割,Matlab程序设计在黄金分割法教学中的应用
  15. 暨南大学21考研计算机上岸吐槽贴经验贴流水账
  16. vue项目手机端适配
  17. Udacity Sparkify项目
  18. 需求调研过程管理小议
  19. 5G工业路由器出炉带来了哪些影响
  20. facetime 来电提醒_FaceTime应该比这更好

热门文章

  1. spring-data-slor 通配符的匹配很全面, 但无法找到元素 'solr:solr-server' 的声明。
  2. JAVA之列表集合ArrayList
  3. STM32(5)——通用定时器基本定时器
  4. 分享小知识:善用Group By排序
  5. 同一页面中加载两个相同的控件,结果只能出来一个,这是为什么
  6. 《大道至简》最后两章读后感
  7. DRILLNET 2.0------第八章 预防碰撞分析模型
  8. ((ios开发学习笔记 十二))Nib加载的方式实现自定义TableView
  9. jqgrid点击搜索无法重置参数问题
  10. Java实用知识记录 —— 截止到Java8