搭建 lnmp 環境之 nginx 篇

張揚發表於2019-07-16

記錄一下自己搭建lnmp環境的過程,入了好多坑,浪費了好多時間,記錄一下。

一. 準備工作

1.1 建立目錄:

- mkdir lnmp
- mkdir -p lnmp/logs
- mkdir -p lnmp/server
- mkdir -p lnmp/tools
- mkdir -p lnmp/www

1.2 安裝 make 、gcc 環境等

安裝nginx需要先將官網下載的原始碼進行編譯,編譯依賴gcc環境,如果沒有gcc環境,需要安裝gcc

- yum -y install gcc automake autoconf libtool make
- yum install gcc gcc-c++ glibc

1.3 安裝 pcre 、zlib、openssl等庫

  • PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 相容的正規表示式庫。nginx的http模組使用pcre來解析正規表示式,所以需要在linux上安裝pcre庫。

  • zlib庫提供了很多種壓縮和解壓縮的方式,nginx使用zlib對http包的內容進行gzip,所以需要在linux上安裝zlib庫。

  • OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼演算法、常用的金鑰和證照封裝管理功能及SSL協議,並提供豐富的應用程式供測試或其它目的使用。nginx不僅支援http協議,還支援https(即在ssl協議上傳輸http),所以需要在linux安裝openssl庫。

- yum install -y pcre pcre-devel         #注:pcre-devel是使用pcre開發的一個二次開發庫。nginx也需要此庫。
- yum install -y zlib zlib-devel
- yum install -y openssl openssl-devel

1.4 為nginx新增使用者及組

ginx的工作程式需要以某一個使用者的許可權進行執行,為了伺服器安全,一般指定一個普通使用者許可權的賬號做為nginx的執行角色,根據個人習慣,這裡使用www使用者做為nginx工作程式的使用者,後續安裝的PHP也以www使用者做為工作程式使用者,依次執行以下命令以建立使用者及使用者組

- tar -zxvf nginx-1.17.1.tar.gz
- cd nginx-1.17.1

二. 編譯安裝nginx

將nginx-1.17.1.tar.gz拷貝至linux伺服器。

2.1 解壓:

- groupadd -r nginx
- useradd -r -g nginx nginx

2.2 配置引數:

./configure \
--prefix=/usr/local/lnmp/server/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/usr/local/lnmp/logs/nginx/error.log \
--http-log-path=/usr/local/lnmp/logs/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi

2.3 編譯安裝

- make && make install

2.4 啟動

#切換到安裝位置,也就是之前配置configure的
cd /usr/local/nginx

#啟動
#注:nginx.conf 是 nginx 的預設配置檔案。也可以使用 nginx -c 指定配置檔案啟動
sbin/nginx

#啟動失敗
按照提示建立對應client目錄

#啟動成功檢視nginx程式(master程式和worker程式)
ps -ef | grep nginx

錯誤:

1、nginx:[emerg] mkdir() "/var/temp/nginx/client" failed (2:No such file or directory)

- mkdir -p /var/temp/nginx/client

2、nginx: [error] open() "/usr/local/nginx/logs/nginx.pid"

- /usr/local/lnmp/server/nginx/sbin/nginx -c /usr/local/lnmp/server/nginx/conf/nginx.conf

3、nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)(新裝的系統 80埠未開放)

- firewall-cmd --zone=public --add-port=80/tcp --permanent  
- systemctl stop firewalld.service  
- systemctl start firewalld.service

三. 配置

本文配置的nginx支援多域名,每個域名的配置檔案單獨放在/usr/local/lnmp/server/nginx/conf/vhosts路徑下,使用vim命令開啟nginx.conf檔案,對其內容進行修改

user  www www;
worker_processes  2;

error_log  /usr/local/lnmp/logs/nginx/error.log crit;

pid        /usr/local/lnmp/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 65535;

events {
    use epoll;
    worker_connections  65535;
}

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

access_log  /usr/local/lnmp/logs/nginx/access.log  main;

server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;

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/x-javascript text/css application/xml;
gzip_vary on;

tcp_nodelay on;

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

log_format '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" "$http_x_forwarded_for"';

include /usr/local/lnmp/server/nginx/conf/vhosts/*.conf;
include /usr/local/lnmp/server/nginx/conf/proxy/*.conf;

上述配置中,引用了/alidata/server/nginx-1.12.2/conf/vhosts/目錄下所有字尾名是.conf的配置檔案,現在進入該目錄編寫一個預設配置檔案default.conf,其內容是

server {
    listen       80;
    server_name  localhost;
    index index.html;
    root /lnmp/www;
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires 30d;
    }
    location ~ .*\.(js|css)?$
    {
        expires 1h;
    }
    #偽靜態規則
    include /usr/local/lnmp/server/nginx/conf/rewrite/default.conf;
    access_log  /usr/local/lnmp/logs/nginx/access/default.log;
    error_log     /usr/local/lnmp/logs/nginx/error/default.log;
}

其中引入了一個/alidata/server/nginx-1.12.2/conf/rewrite/default.conf檔案,這個檔案是用來編寫rewrite規則的配置檔案,用來實現偽靜態,其內容是

rewrite ^(.*)-htm-(.*)$ $1.php?$2 last;
rewrite ^(.*)/simple/([a-z0-9\_]+\.html)$ $1/simple/index.php?$2 last;
rewrite ^(.*)/data/(.*)\.(htm|php)$ 404.html last;
rewrite ^(.*)/attachment/(.*)\.(htm|php)$ 404.html last;
rewrite ^(.*)/html/(.*)\.(htm|php)$ 404.html last;

四. 系統配置

1. 加入系統環境變數

使用vim命令開啟/etc/profile檔案,在檔案最末尾加上如下程式碼

export NGINX_HOME=/usr/local/lnmp/server/nginx
export PATH=$PATH:$NGINX_HOME/sbin
  • 儲存修改後,使用source命令重新載入配置檔案,命令如下
    source /etc/profile

2. 加入系統服務

  • 使用vim命令在/etc/init.d/目錄下建立一個nginx檔案,命令如下
    vim /etc/init.d/nginx

檔案內容如下

#!/bin/bash
# chkconfig: - 85 15
PATH=/usr/local/lnmp/server/nginx
DESC="nginx daemon"
NAME=nginx
DAEMON=$PATH/sbin/$NAME
CONFIGFILE=$PATH/$NAME.conf
PIDFILE=$PATH/logs/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
set -e
[ -x "$DAEMON" ] || exit 0
do_start() {
$DAEMON -c $CONFIGFILE || echo -n "nginx already running"
}
do_stop() {
$DAEMON -s stop || echo -n "nginx not running"
}
do_reload() {
$DAEMON -s reload || echo -n "nginx can't reload"
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
do_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
do_stop
echo "."
;;
reload|graceful)
echo -n "Reloading $DESC configuration..."
do_reload
echo "."
;;
restart)
echo -n "Restarting $DESC: $NAME"
do_stop
do_start
echo "."
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2
exit 3
;;
esac
exit 0

將上述檔案儲存後,一定要記得給其賦予可執行的許可權,具體命令如下

chmod +x /etc/init.d/nginx

3.開機自啟動

chkconfig --add nginx
chkconfig nginx on

或者

systemctl enable nginx

相關文章