記錄一下自己搭建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