#编译安装 Nginx1.18.0
CentOS平台编译环境:
安装make:
yum -y install gcc automake autoconf libtool make
安装g++:
yum install gcc gcc-c++
sudo yum install libxslt*
sudo yum install libxml2*
sudo yum -y install gd-devel
sudo yum -y install perl-devel perl-ExtUtils-Embed
sudo yum -y install GeoIP GeoIP-devel GeoIP-data
Debian & ubuntu平台编译环境:
本文描述Nginx 的源码编译安装过程
apt-get install build-essential g++ gcc make libtool openssl libpcre3 libpcre3-dev openssl libssl-dev libperl-dev automake
apt-get install libgd2-xpm*
apt-get install libxslt*
apt-get install libxml2*
apt-get install libgeoip-dev
############## 一、安装OpenSSL ######################
下载地址 https://www.openssl.org/source/
//wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz
wget https://www.openssl.org/source/openssl-1.1.0k.tar.gz
tar zxvf openssl-1.1.0k.tar.gz
cd openssl-1.1.0h/
./config
make && sudo make install
################ 二、安装PCRE ########################
下载地址 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
//wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.42.tar.gz
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
tar zxvf pcre-8.43.tar.gz
./configure
make && sudo make install
################ 二、安装zlib ########################
wget https://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz
tar zxvf zlib-1.2.11.tar.gz
./configure
make && sudo make install
################ 三、安装Nginx ########################
下载Nginx源码包(stable version)
wget http://nginx.org/download/nginx-1.18.0.tar.gz
解压缩
tar zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0/
配置编译环境(--with-pcre、--with-openssl 的路径是源码路径,pcre、openssl的安装路径在/opt/local,但这里只需要源码路径)
./configure --prefix=/opt/nginx \
--with-select_module \
--with-poll_module \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-stream \
--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 \
--with-compat \
--with-pcre \
--with-pcre=../pcre-8.43 \
--with-zlib=../zlib-1.2.11 \
--with-openssl=../openssl-1.1.0k
make && sudo make install
#################### 四、服务管理方法 ###################
1.赋予普通用户操作权限
sudo chmod u+s /opt/nginx/sbin/nginx
chown root:nginx /opt/nginx/sbin/nginx
2.查看帮助
$ /opt/nginx/sbin/nginx -h
3.检查配置文件正确性
$ /opt/nginx/sbin/nginx -t
4.查看进程号
cat /opt/nginx/logs/nginx.pid
23214
ps -ef | grep "nginx: master process" | grep -v 'grep' | awk -F ' ' '{print $2}'
23214
5.重新加载配置
sudo kill -HUP `cat /opt/nginx/logs/nginx.pid`
6.停止nginx的两种方式:
(1)发送停止信号
/opt/local/nginx/sbin/nginx -s stop
处理完请求后,关闭进程
(2)kill -QUIT ` cat /opt/local/nginx/logs/nginx.pid `
前提
如果你通过其它方法将nginx执行路径改在其它地方,如 /opt/guiji/nginx/sbin/,那么你需要修正下面的脚本
停止
如果你的nginx正在运行,你可以通过如下命令停止
Init脚本
vi /etc/init.d/nginx
#! /bin/bash
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/opt/nginx/sbin/nginx
NAME=nginx
DESC=nginx
test -x $DAEMON || exit 0
# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
. /etc/default/nginx
fi
set -e
case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --pidfile /opt/guiji/nginx/$NAME.pid \
--exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --pidfile /opt/nginx/$NAME.pid \
--exec $DAEMON
echo "$NAME."
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --pidfile \
/opt/nginx/$NAME.pid --exec $DAEMON
sleep 1
start-stop-daemon --start --quiet --pidfile \
/opt/nginx/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
reload)
echo -n "Reloading $DESC configuration: "
start-stop-daemon --stop --signal HUP --quiet --pidfile /opt/nginx/$NAME.pid \
--exec $DAEMON
echo "$NAME."
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
当然你也可以通过附件下载脚本
执行
此脚本为shell命令,所以要先有可执行权限
chmod +x /etc/init.d/nginx
update-rc
脚本准备好后,我们把它加到默认运行级别
/usr/sbin/update-rc.d -f nginx defaults
开始,停止,重启
/etc/init.d/nginx start/etc/init.d/nginx stop
/etc/init.d/nginx restart
脚本在系统启动时会自动执行start操作
==================================================================================
普通用户在restart和reload nginx时,会报错:
nginx:[warn] the "user" directive makes sense only if the master processruns with super-user privileges, ignored in/opt/nginx/conf/nginx.conf:2
原因是:默认情况下linux的1024以下端口是只有root用户才有权限占用,解决方法如下:
方法一:
所有用户都可以运行(因为是755权限,文件所有者:root,组所有者:root)
chown root:root nginx
chmod 755 nginx
chmod u+s nginx
方法二:
仅 root 用户和 test 用户可以运行(因为是750权限,文件所有者:root,组所有者:test)
chown root:nginx nginx
chmod 750 nginx
chmod u+s nginx
chmod u+s 就是给某个程序的所有者以suid权限,可以像root用户一样操作。
Set uid, gid,sticky bit的三个权限的详细说明:
一个文件都有一个所有者, 表示该文件是谁创建的. 同时, 该文件还有一个组编号, 表示该文件所属的组, 一般为文件所有者所属的组.
如果是一个可执行文件, 那么在执行时, 一般该文件只拥有调用该文件的用户具有的权限. 而setuid, setgid 可以来改变这种设置.
setuid: 设置使文件在执行阶段具有文件所有者的权限. 典型的文件是 /usr/bin/passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权
限, 从而可以更改用户的密码.
setgid: 该权限只对目录有效. 目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组.
sticky bit: 该位可以理解为防删除位. 一个文件是否可以被某用户删除, 主要取决于
该文件所属的组是否对该用户具有写权限. 如果没有写权限, 则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件. 如果希望用户能够添加文件
但同时不能删除文件, 则可以对文件使用sticky bit位. 设置该位后, 就算用户对目录
具有写权限, 也不能删除该文件.
下面说一下如何操作这些标志:
操作这些标志与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作,
1) chmod u+s temp —为temp文件加上setuid标志. (setuid 只对文件有效)
chmod g+s tempdir —为tempdir目录加上setgid标志 (setgid 只对目录有效)
chmod o+t temp —为temp文件加上sticky标志 (sticky只对文件有效)
2) 采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如
4666, 2777等. 这一组八进制数字三位的意义如下,
abc
a - setuid位, 如果该位为1, 则表示设置setuid
b - setgid位, 如果该位为1, 则表示设置setgid
c - sticky位, 如果该位为1, 则表示设置sticky
设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如
rwsrw-r– 表示有setuid标志
rwxrwsrw- 表示有setgid标志
rwxrw-rwt 表示有sticky标志
那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s,t
==================================================================================
###CA根证书的生成:
生成CA私钥(.key)–>生成CA证书请求(.csr)–>自签名得到根证书(.crt)(CA给自已颁发的证书)。
# Generate CA private key (生成私钥)
openssl genrsa -out ca.key 2048
# Generate CSR (生成证书签发请求)
openssl req -new -key ca.key -out ca.csr
# Generate Self Signed certificate(生成CA根证书)
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt
#“KEY文件+CRT文件”转换为标准的PEM文件:
cat ca.key ca.crt > ca.pem
配置示例:
server {
listen 443 ssl;
server_name localhost;
ssl on;
ssl_certificate ca.pem;
ssl_certificate_key ca.key;
ssl_session_timeout 5m;
==============================================================================
###生成根证书
####a).生成根证书私钥(pem文件)
OpenSSL通常使用PEM(Privacy Enbanced Mail)格式来保存私钥,构建私钥的命令如下:
openssl genrsa -aes256 -out cakey.pem 2048
该命含义如下:
genrsa——使用RSA算法产生私钥
-aes256——使用256位密钥的AES算法对私钥进行加密
-out——输出文件的路径
2048——指定私钥长度
####b).生成根证书签发申请文件(csr文件)
使用上一步生成的私钥(pem文件),生成证书请求文件(csr文件):
openssl req -new -key cakey.pem -out ca.csr -subj \
"/C=CN/ST=jiangsu/L=nanjing/O=guiji/OU=guiji/CN=*.guiji.ai"
该命令含义如下:
req——执行证书签发命令
-new——新证书签发请求
-key——指定私钥路径
-out——输出的csr文件的路径
-subj——证书相关的用户信息(subject的缩写)
####c).自签发根证书(cer文件)
csr文件生成以后,可以将其发送给CA认证机构进行签发,当然,这里我们使用OpenSSL对该证书进行自签发:
openssl x509 -req -days 365 -sha1 -extensions v3_ca -signkey \
cakey.pem -in ca.csr -out ca.cer
该命令的含义如下:
x509——生成x509格式证书
-req——输入csr文件
-days——证书的有效期(天)
-sha1——证书摘要采用sha1算法
-extensions——按照openssl.cnf文件中配置的v3_ca项添加扩展
-signkey——签发证书的私钥
-in——要输入的csr文件
-out——输出的cer证书文件
==================================================================================
###NGINX加载动态模块:
load_module "modules/ngx_rtmp_module.so";
load_module "modules/ngx_stream_module.so";
==================================================================================
#Docker安装nginx1.18.0
docker pull nginx:stable-alpine
或
docker pull nginx:1.18.0-alpine
mkdir -p /opt/nginx/{conf,conf.d,html,logs}
docker run --name nginx -d -p 80:80 -v /opt/nginx/html:/usr/share/nginx/html -v /opt/nginx/conf.d:/etc/nginx/conf.d -v /opt/nginx/logs:/var/log/nginx nginx:stable-alpine