PHP是以fastcgi的方式結合Nginx的,能夠理解爲Nginx代理了PHP的fastcgi和LAMP不一樣的是,LNMP中提供web服務的是Nginxjavascript
在LNMP架構中PHP是做爲一個獨立的服務存在的,這個服務叫作php-fpmphp
Nginx直接處理靜態請求(支持的併發更高,速度比Apache快),動態請求轉發給php-fpm處理css
cd /usr/local/srchtml
wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gzjava
tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gznode
mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysqlmysql
cd /usr/local/mysqllinux
useradd -s /sbin/nologin mysqlnginx
mkdir -p /data/mysql #建立數據庫目錄,這個是數據庫喲web
chown -R mysql:mysql /data/mysql
./scripts/mysql_install_db --user=mysql --datadir=/data/mysql #初始化指定用戶和數據庫目錄
cp support-files/my-default.cnf /etc/my.cnf #拷貝配置文件並配置
vim /etc/my.cnf datadir=/data/mysql socket=/tmp/mysql.sock
cp support-files/mysql.server /etc/init.d/mysqld 將啓動腳本添加到系統配置文件中
chmod 755 /etc/init.d/mysqld
vim /etc/init.d/mysqld basedir=/usr/local/mysql datadir=/data/mysql 設定開機啓動MySQL: chkconfig --add mysqld chkconfig mysqld on 開機: service mysqld start /etc/init.d/mysqld start
PHP是以fastcgi的方式結合Nginx的,能夠理解爲Nginx代理了PHP的fastcgi和LAMP不一樣的是,LNMP中提供web服務的是Nginx
php的安裝有部分不一樣須要注意:須要開啓php-fpm服務
cd /usr/local/src/
wget http://cn2.php.net/distributions/php-5.6.30.tar.gz (下載源碼包)
tar zxvf php-5.6.30.tar.gz
useradd -s /sbin/nologin php-fpm
(該帳號用來運行php-fpm服務,由於在LNMP環境中,PHP是以一種服務的形式獨立存在的)
##進行編譯準備前準備生產makefile cd php-5.6.30 ./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --with-pear --with-curl --with-openssl --enable-fpm關鍵模塊若是不加不會有php-fpm執行文件生成 mysql相關模塊:若是mysql不在同一臺機器上也要指定模塊,或者直接安裝mysql不啓動 這裏缺乏不少包須要依次安裝後再make&&make install,基本上包含以下: yum install -y gcc yum install -y libxml2-devel yum install -y openssl-devel yum install -y libjpeg-turbo-devel yum list|grep libjpeg yum install -y libjpeg-turbo-devel yum list|grep png yum install -y libpng-devel yum install -y freetype-devel epel擴展源yum install -y epel-release yum install -y libmcrypt-deve make && make install 編譯和安裝 若是是小內存安裝,加上--disable-fileinfo能夠順利安裝
php-fpm相關命令:
/usr/local/php-fpm/bin/php -m 查看php開啓的程序
/usr/local/php-fpm/sbin/php-fpm -t 測試是否正確
將配置文件添加到php-fpm文件目錄cp php.ini-production /usr/local/php-fpm/etc/php.ini
vim /usr/local/php-fpm/etc/php-fpm.conf ###php-fpm主配置文件☆☆☆ [global] #定義全局參數 pid = /usr/local/php-fpm/var/run/php-fpm.pid error_log = /usr/local/php-fpm/var/log/php-fpm.log [www] listen = /tmp/php-fcgi.sock #監聽地址,也能夠寫:listen = 127.0.0.1::9000,本地監聽,也能夠監聽其餘IP:port #此處格式會影響配置Nginx和PHP結合時Nginx尋址PHP的路徑 listen.mode = 666 #當監聽的爲socket文件時該部分才生效,用於指定.sock文件的權限 user = php-fpm group = php-fpm #定義php-fpm服務的用戶 pm = dynamic pm.max_children = 50 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35 pm.max_requests = 500 rlimit_files = 1024 #以上部分爲進程相關信息 ###配置完記得-t檢測是否正確
配置啓動腳本
cd /usr/local/src/php-5.6.30
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm 添加啓動腳本到系統配置
chmod 755 /etc/init.d/php-fpm 更改文件權限
service php-fpm start
chkconfig --add php-fpm 添加到系統服務
chkconfig php-fpm on 開機啓動
cd /usr/local/src
wget http://nginx.org/download/nginx-1.12.1.tar.gz
tar zxf nginx-1.12.1.tar.gz
cd nginx-1.12.1
./configure --prefix=/usr/local/nginx ##能夠添加模塊,按需求進行配置,https等後加
make && make install
vim /etc/init.d/nginx #!/bin/bash # chkconfig: - 30 21 # description: http service. # Source Function Library . /etc/init.d/functions # Nginx Settings NGINX_SBIN="/usr/local/nginx/sbin/nginx" NGINX_CONF="/usr/local/nginx/conf/nginx.conf" NGINX_PID="/usr/local/nginx/logs/nginx.pid" RETVAL=0 prog="Nginx" start() { echo -n $"Starting $prog: " mkdir -p /dev/shm/nginx_temp daemon $NGINX_SBIN -c $NGINX_CONF RETVAL=$? echo return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p $NGINX_PID $NGINX_SBIN -TERM rm -rf /dev/shm/nginx_temp RETVAL=$? echo return $RETVAL } reload() { echo -n $"Reloading $prog: " killproc -p $NGINX_PID $NGINX_SBIN -HUP RETVAL=$? echo return $RETVAL } restart() { stop start } configtest() { $NGINX_SBIN -c $NGINX_CONF -t return 0 } case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) restart ;; configtest) configtest ;; *) echo $"Usage: $0 {start|stop|reload|restart|configtest}" RETVAL=1 esac exit $RETVAL
/usr/local/nginx/sbin/nginx -t #檢查錯誤
chmod 755 /etc/init.d/nginx #更改文件權限
chkconfig --add nginx #加入系統服務再設置開機啓動
chkconfig nginx on
cd /usr/local/nginx/conf/
mv nginx.conf nginx.conf.bak
vim /usr/local/nginx/conf/nginx.conf user nobody nobody; #定義啓動nginx的用戶 worker_processes 2; #定義子進程數目 error_log /usr/local/nginx/logs/nginx_error.log crit; pid /usr/local/nginx/logs/nginx.pid; worker_rlimit_nofile 51200; #指定Nginx最多可打開的文件數目 events { use epoll; worker_connections 6000; #進程最大鏈接數 } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 3526; server_names_hash_max_size 4096; log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]' ' $host "$request_uri" $status' ' "$http_referer" "$http_user_agent"'; sendfile on; tcp_nopush on; keepalive_timeout 30; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; connection_pool_size 256; client_header_buffer_size 1k; large_client_header_buffers 8 4k; request_pool_size 4k; output_buffers 4 32k; postpone_output 1460; client_max_body_size 10m; client_body_buffer_size 256k; client_body_temp_path /usr/local/nginx/client_body_temp; proxy_temp_path /usr/local/nginx/proxy_temp; fastcgi_temp_path /usr/local/nginx/fastcgi_temp; fastcgi_intercept_errors on; tcp_nodelay on; gzip on; gzip_min_length 1k; gzip_buffers 4 8k; gzip_comp_level 5; gzip_http_version 1.1; gzip_types text/plain application/x-javascript text/css text/htm application/xml; server { listen 80; server_name localhost; index index.html index.htm index.php; root /usr/local/nginx/html; location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/tmp/php-fcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; } } }
/usr/local/nginx/sbin/nginx -t #檢查錯誤
/etc/init.d/nginx start #啓動
測試php解析是否正常:
vim /usr/local/nginx/html/666.php <?php echo "這裏隨便寫,35天仍是放棄了該如何是好呢"; curl localhost/666.php顯示上面的語句表示成功
lnmp最多見爲502問題環境搭建完成後,一訪問網站直接提示「502 Bad Gateway」緣由大體兩種:
其一配置錯誤
在Nginx配置中location的php配置中,若是把fastcgi_pass(這是用來通訊的)後面指定的路徑配置錯了,那麼就會出現502錯誤,由於Nginx找不到php-fpm了,fastcgi _pass後面能夠跟socket也能夠跟IP+port,默認監聽地址爲:127.0.0.1:9000。
注意: 這裏用兩種形式均可以,可是兩個配置文件(Nginx和php-fpm)中的形式必定要統一,否則絕對502;若是用套接字形式的話,socket文件的路徑必定要對,否則也仍是502
其二資源耗盡
lnmp架構處理PHP時,是Nginx直接調取後端的php-fpm服務,若是Nginx的請求量偏高,而咱們又沒給php-fpm配置足夠的子進程數,那麼總有php-fpm資源耗盡的時候,一旦耗盡Nginx找不到php-fpm,此時也會致使502錯誤出現。解決辦法就是調整php-fpm.conf中的pm.max_children數值,使其增長。但也不能無限制增長,由於服務器的資源有限。4G內存機器若是隻跑php-fpm和Nginx,不跑MySQL服務,pm.max _children能夠設置爲150,儘可能不要超過該數值,8G內存設置爲300,以此類推。
其上未解決呢
在配置文件/usr/local/nginx/conf/nginx.conf中將crit改成debug,使其記錄最多的日誌內容,這樣方便咱們排查錯誤,可是配置更改完成後要記得將級別改回crit,避免日誌文件佔用太多磁盤空間。