目标

编译一个能运行 https 站点的 nginx 。

  • 程序目录:/usr/sbin
  • 配置目录:/etc/nginx
  • 日志目录:/var/log/nginx
  • pid路径:/run/nginx.pid
  • 临时文件路径: /tmp

系统环境

Ubuntu 18.04.5 LTS

源码地址

  1. nginx-1.19.2 http://nginx.org/download/nginx-1.19.2.tar.gz
  2. pcre-8.44 ftp://ftp.pcre.org/pub/pcre/pcre-8.44.zip
  3. zlib-1.2.11 http://www.zlib.net/zlib-1.2.11.tar.gz
  4. openssl-1.1.1g https://www.openssl.org/source/openssl-1.1.1g.tar.gz
有个pcre2,那个不支持,只能下载pcre。<br/>
openssl有一个3.0的版本,也不支持。

## 编译步骤
### 解压源码包
建立一个工作目录把以上源码包都下载到这个目录,然后解压。
zip 用 unzip,tar 的包用 tar -xf
本机结果如下:
nginxsources.png

切换到 nginx 目录

cd nginx-1.19.2

nginx 配置参考

./configure --help

--help

打印帮助信息

--prefix=PATH

设置安装路径前缀,后面一些文件的存放位置默认都是在 这个前缀下。

--sbin-path=PATH

nginx 程序的安装目录,一般是前缀下面的 sbin 目录

--modules-path=PATH

模块目录

--conf-path=PATH

nginx.conf 的目录

--error-log-path=PATH

默认错误日志目录,这个目录 nginx.conf 里面可以改。

--pid-path=PATH

进程文件目录

--lock-path=PATH

nginx.lock 的目录,这个文件是 nginx 启动的时候创建的

--user=USER

以哪个用户创建工作进程,一般是 nobody 或者 www

--group=GROUP

工作进程的用户组,一般也是 nobody 或者 www

--build=NAME

二进制文件名称,默认是 nginx

--builddir=DIR

编译后的文件放到哪里,一般不用设置

--with-select_module

一种轮询模式,这个不是很高级,一般不用

--without-select_module

不编译 select 模块

--with-poll_module

也是一种轮询模式,比 select 高级一点

--without-poll_module

不编译 poll 模块

--with-threads

启用线程池

--with-file-aio

启用 file AIO support

--with-http_ssl_module

这个是启用 https 的,默认不含编译的时候要加上

--with-http_v2_module

这个是 http/2 模块,默认不含,建议加上

--with-http_realip_module

获取用户真实 ip 的模块,如果客户从代理或者缓存过来的,这个可以获得客户的ip,而不是代理的ip。

--with-http_addition_module

向响应内容中追加内容,比如可以直接给网页最后加个js之类的。

--with-http_xslt_module

转换xml的

--with-http_xslt_module=dynamic

把这个模块编译成动态的,不要编译到核心里面

--with-http_image_filter_module

这个模块可以变换图像,比如旋转缩放什么的。

--with-http_image_filter_module=dynamic

编译成动态模块

--with-http_geoip_module

这个模块,可以实现通过ip地址定位的功能,可以用来禁止某个地区访问网站。

--with-http_geoip_module=dynamic

编译成动态

--with-http_sub_module

这个模块可以对网站内容做替换,比如直接把网页里面的aaa 变成 bbb

--with-http_dav_module

对 WebDav 协议的支持

--with-http_flv_module

为 flv 文件提供服务端伪流媒体支持

--with-http_mp4_module

这个是为 .mp4、.m4v、和.m4a为扩展名的文件,提供伪流媒体服务端支持。

--with-http_gunzip_module

给那些不支持gzip的客户端开启解压,一般现在浏览器都支持解压。这个模块一般不用。

--with-http_gzip_static_module

压缩之前查找同名的 *.gz 避免重复压缩。

--with-http_auth_request_module

原理:收到请求后,先将该请求hold住,生成子请求,子请求和该请求内容是相同的。通过反向代理技术把子请求传递给上游服务,根据上游服务的响应再来决定是否处理当前的请求。

功能:向上游的服务器转发请求,若上游服务器返回的响应码是2XX,则继续执行。若上游服务器返回的是401或者403,则将响应返回给客户端。

--with-http_random_index_module

随机主页

--with-http_secure_link_module

安全下载模块可以给服务器文件链接添加时间戳和校验码,从而保护服务器文件不被任意下载盗用。

--with-http_degradation_module

允许当剩余内存较低时对某些位置的请求返回 204 或 404 状态码。

--with-http_slice_module

分片模块。

--with-http_stub_status_module

监控服务状态。

以下 without 都是禁用的意思,只说明一下模块的作用

--without-http_charset_module

为响应头的"Content-Type"加字符集,就是那个 "Content-Type:text/html;charset:utf-8"

--without-http_gzip_module

gzip 压缩模块。

--without-http_ssi_module

Server Side Include ,服务端文件包含,貌似可以给网页中间插入内容。

--without-http_userid_module

为标示客户端设置合适的cookies。接受和设置的cookies能通过内嵌$uid_got 和 $uid_set变量获取,并记录到日志中。

--without-http_access_module

基于ip的访问控制,就是那个 deny 192.168.1.1;allow 192.168.1.0/24;

--without-http_auth_basic_module

基本验证模块,访问网页的时候提示输入一个用户名,密码。

--without-http_mirror_module

镜像流量,通过mirror模块,可以实现复制原始请求发送到一个特定的环境,同时Nginx会忽略这个复制的请求的返回值。这个可以用来做监控。

--without-http_autoindex_module

找不到主页的话自动生成目录列表。

--without-http_geo_module

模块创建变量,并根据客户端IP地址对变量赋值。

--without-http_map_module

map 指令

--without-http_split_clients_module

模块创建适用于A / B测试的变量,也称为分割测试。

--without-http_referer_module

处理referer的模块,可以用来防盗链

--without-http_rewrite_module

url 改写模块

--without-http_proxy_module

反向代理模块

--without-http_fastcgi_module

fastcgi 协议模块,处理 PHP 的时候要用

--without-http_uwsgi_module

uwsgi 协议

--without-http_scgi_module

scgi 协议

--without-http_grpc_module

gRPC:一个远程过程调用框架

--without-http_memcached_module

从 memcache 服务器获得响应。

--without-http_limit_conn_module

限制连接数

--without-http_limit_req_module

限制请求的处理速率,特别是单一的IP地址的请求的处理速率

--without-http_empty_gif_module

生成透明gif

--without-http_browser_module

识别浏览器

--without-http_upstream_hash_module

--without-http_upstream_ip_hash_module

--without-http_upstream_least_conn_module

--without-http_upstream_random_module

--without-http_upstream_keepalive_module

--without-http_upstream_zone_module

以上几个带 upstream 的是负载均衡用的

--with-http_perl_module

在Perl中实现位置和变量处理程序,并将Perl调用插入到SSI中。(有疑问)

--with-http_perl_module=dynamic

编译成动态模块

--with-perl_modules_path=PATH

动态模块的路径

--with-perl=PATH

perl程序的路径

--http-log-path=PATH

http 访问日志的路径

--http-client-body-temp-path=PATH

http 客户端请求的临时文件存放路径

--http-proxy-temp-path=PATH

http 代理的临时文件路径

--http-fastcgi-temp-path=PATH

--http-uwsgi-temp-path=PATH

--http-scgi-temp-path=PATH

以上几个都是设置临时路径的默认位置

--without-http

http 服务

--without-http-cache

HTTP 缓存服务

--with-mail

POP3/IMAP4/SMTP 代理模块

--with-mail=dynamic

编译成动态模块

--with-mail_ssl_module

邮件SSL认证模块

--without-mail_pop3_module

--without-mail_imap_module

--without-mail_smtp_module

以上三个是邮箱要用的三个协议

--with-stream

TCP/UDP 代理支持

--with-stream=dynamic

编译成动态

--with-stream_ssl_module

--with-stream_realip_module

--with-stream_geoip_module

--with-stream_geoip_module=dynamic

--with-stream_ssl_preread_module

--without-stream_limit_conn_module

--without-stream_access_module

--without-stream_geo_module

--without-stream_map_module

--without-stream_split_clients_module

--without-stream_return_module

--without-stream_upstream_hash_module

--without-stream_upstream_least_conn_module

--without-stream_upstream_random_module

--without-stream_upstream_zone_module

以上几个steam的模块,是用来实现对tcp,udp 转发的支持

--with-google_perftools_module

google 的一个性能优化工具

--with-cpp_test_module

功能是测试程序中引用的头文件是否与C++兼容

--add-module=PATH

其他开发的模块目录

--add-dynamic-module=PATH

其他动态模块

--with-compat

dynamic modules compatibility

--with-cc=PATH

cc 的路径,cc 是一个c编译器。

--with-cpp=PATH

cpp 的路径,cpp 是c 预处理器

--with-cc-opt=OPTIONS

额外的 cc 的参数

--with-ld-opt=OPTIONS

额外的 ld 的参数,ld 是一个连接器

--with-cpu-opt=CPU

跨平台编译用的,可以填这些值:pentium, pentiumpro, pentium3, pentium4,athlon,opteron, sparc32, sparc64, ppc64

--without-pcre

不编译prce模块,这个模块rewrite要用,一般不会禁用

--with-pcre

--with-pcre=DIR

prce源码库的路径

--with-pcre-opt=OPTIONS

pcre 额外的编译参数

--with-pcre-jit

pcre JIT(即时编译) 支持,jit 编译出来的比一般的快。

--with-zlib=DIR

zlib 源码的目录

--with-zlib-opt=OPTIONS

zlib 额外的编译参数

--with-zlib-asm=CPU

为下面的cpu优化:pentium, pentiumpro

--with-libatomic

force libatomic_ops library usage

--with-libatomic=DIR

libatomic 这个库源码的目录

--with-openssl=DIR

OpenSSL 源码的目录

--with-openssl-opt=OPTIONS

编译参数

--with-debug

debug 支持,可以记录debug日志,研究用,正式环境一般不用。

编译参数举例


./configure \
--prefix=/usr \
--modules-path=/usr/lib/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/tmp/client_body_temp \
--http-proxy-temp-path=/tmp/proxy_temp \
--http-fastcgi-temp-path=/tmp/fastcgi_temp \
--http-uwsgi-temp-path=/tmp/uwscgi_temp \
--http-scgi-temp-path=/tmp/scgi_temp \
--pid-path=/run/nginx.pid \
--lock-path=/run/nginx.lock \
--user=www-data \
--group=www-data \
--with-zlib=../zlib-1.2.11 \
--with-pcre=../pcre-8.44 \
--with-openssl=../openssl-1.1.1g \
--with-http_v2_module \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_mp4_module 

配置摘要:
nginxconfigire.png

编译

make

安装

sudo make install

配置举例

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;
        listen       443 http2 ssl;
        server_name  yinux.app;
        ssl_certificate      ssl/yinux.app.crt;
        ssl_certificate_key  ssl/yinux.app.nopass.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        gzip on;
        gzip_buffers 32 4K;
        gzip_comp_level 6;
        gzip_min_length 100;
        gzip_types application/javascript text/css text/xml;
        gzip_disable "MSIE [1-6]\.";
        gzip_vary on;

        root /data/wwwroot/yinux.app;
        location / {
            index  index.php index.html index.htm;
        }

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

    }

}

配置成系统服务

/lib/systemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

启动

systemctl status nginx

开机自动启动

systemctl enable nginx

验证

访问 https://yinux.app 正常。


本文由 yang 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论