freedombone-utils-web 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. #!/bin/bash
  2. #
  3. # .---. . .
  4. # | | |
  5. # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  6. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  7. # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  8. #
  9. # Freedom in the Cloud
  10. #
  11. # Web related functions
  12. #
  13. # License
  14. # =======
  15. #
  16. # Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
  17. #
  18. # This program is free software: you can redistribute it and/or modify
  19. # it under the terms of the GNU Affero General Public License as published by
  20. # the Free Software Foundation, either version 3 of the License, or
  21. # (at your option) any later version.
  22. #
  23. # This program is distributed in the hope that it will be useful,
  24. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  25. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  26. # GNU Affero General Public License for more details.
  27. #
  28. # You should have received a copy of the GNU Affero General Public License
  29. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  30. # default search engine for command line browser
  31. DEFAULT_SEARCH='https://searx.laquadrature.net'
  32. # This isn't used here, but is included for mirrors creation purposes
  33. LETSENCRYPT_REPO="https://github.com/letsencrypt/letsencrypt"
  34. # Whether Let's Encrypt is enabled for all sites
  35. LETSENCRYPT_ENABLED="no"
  36. LETSENCRYPT_SERVER='https://acme-v01.api.letsencrypt.org/directory'
  37. # list of encryption protocols
  38. SSL_PROTOCOLS="TLSv1 TLSv1.1 TLSv1.2"
  39. # list of ciphers to use. See bettercrypto.org recommendations
  40. SSL_CIPHERS="EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA"
  41. NGINX_ENSITE_REPO="https://github.com/perusio/nginx_ensite"
  42. NGINX_ENSITE_COMMIT='fa4d72ce1c0a490442c8474e9c8dc21ed52c93d0'
  43. # memory limit for php in MB
  44. MAX_PHP_MEMORY=64
  45. # logging level for Nginx
  46. WEBSERVER_LOG_LEVEL='warn'
  47. # test a domain name to see if it's valid
  48. function validate_domain_name {
  49. # count the number of dots in the domain name
  50. dots=${TEST_DOMAIN_NAME//[^.]}
  51. no_of_dots=${#dots}
  52. if (( $no_of_dots > 3 )); then
  53. TEST_DOMAIN_NAME=$"The domain $TEST_DOMAIN_NAME has too many subdomains. It should be of the type w.x.y.z, x.y.z or y.z"
  54. fi
  55. if (( $no_of_dots == 0 )); then
  56. TEST_DOMAIN_NAME=$"The domain $TEST_DOMAIN_NAME has no top level domain. It should be of the type w.x.y.z, x.y.z or y.z"
  57. fi
  58. }
  59. function nginx_disable_sniffing {
  60. domain_name=$1
  61. filename=/etc/nginx/sites-available/$domain_name
  62. echo ' add_header X-Frame-Options DENY;' >> $filename
  63. echo ' add_header X-Content-Type-Options nosniff;' >> $filename
  64. echo '' >> $filename
  65. }
  66. function nginx_limits {
  67. domain_name=$1
  68. max_body='20m'
  69. if [ $2 ]; then
  70. max_body=$2
  71. fi
  72. filename=/etc/nginx/sites-available/$domain_name
  73. echo " client_max_body_size ${max_body};" >> $filename
  74. echo ' client_body_buffer_size 128k;' >> $filename
  75. echo '' >> $filename
  76. echo ' limit_conn conn_limit_per_ip 10;' >> $filename
  77. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> $filename
  78. echo '' >> $filename
  79. }
  80. function nginx_http_redirect {
  81. # redirect port 80 to https
  82. domain_name=$1
  83. filename=/etc/nginx/sites-available/$domain_name
  84. echo 'server {' > $filename
  85. echo ' listen 80;' >> $filename
  86. echo ' listen [::]:80;' >> $filename
  87. echo " server_name ${domain_name};" >> $filename
  88. echo " root /var/www/${domain_name}/htdocs;" >> $filename
  89. echo ' access_log off;' >> $filename
  90. echo " error_log /var/log/nginx/${domain_name}_error.log $WEBSERVER_LOG_LEVEL;" >> $filename
  91. function_check nginx_limits
  92. nginx_limits $domain_name
  93. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> $filename
  94. echo '}' >> $filename
  95. echo '' >> $filename
  96. }
  97. function nginx_ssl {
  98. # creates the SSL/TLS section for a website
  99. domain_name=$1
  100. filename=/etc/nginx/sites-available/$domain_name
  101. echo ' ssl on;' >> $filename
  102. echo " ssl_certificate /etc/ssl/certs/${domain_name}.crt;" >> $filename
  103. echo " ssl_certificate_key /etc/ssl/private/${domain_name}.key;" >> $filename
  104. echo " ssl_dhparam /etc/ssl/certs/${domain_name}.dhparam;" >> $filename
  105. echo '' >> $filename
  106. echo ' ssl_session_timeout 60m;' >> $filename
  107. echo ' ssl_prefer_server_ciphers on;' >> $filename
  108. echo " ssl_protocols $SSL_PROTOCOLS;" >> $filename
  109. echo " ssl_ciphers '$SSL_CIPHERS';" >> $filename
  110. }
  111. # check an individual domain name
  112. function test_domain_name {
  113. if [ $1 ]; then
  114. TEST_DOMAIN_NAME=$1
  115. function_ckeck validate_domain_name
  116. validate_domain_name
  117. if [[ $TEST_DOMAIN_NAME != $1 ]]; then
  118. echo $TEST_DOMAIN_NAME
  119. exit 8528
  120. fi
  121. fi
  122. }
  123. # Checks whether certificates were generated for the given hostname
  124. function check_certificates {
  125. if [ ! $1 ]; then
  126. return
  127. fi
  128. USE_LETSENCRYPT='no'
  129. if [ $2 ]; then
  130. USE_LETSENCRYPT=$2
  131. fi
  132. if [[ $USE_LETSENCRYPT == 'no' ]]; then
  133. if [ ! -f /etc/ssl/private/$1.key ]; then
  134. echo $"Private certificate for $CHECK_HOSTNAME was not created"
  135. exit 63959
  136. fi
  137. if [ ! -f /etc/ssl/certs/$1.crt ]; then
  138. echo $"Public certificate for $CHECK_HOSTNAME was not created"
  139. exit 7679
  140. fi
  141. else
  142. if [ ! -f /etc/letsencrypt/live/${1}/privkey.pem ]; then
  143. echo $"Private certificate for $CHECK_HOSTNAME was not created"
  144. exit 6282
  145. fi
  146. if [ ! -f /etc/letsencrypt/live/${1}/fullchain.pem ]; then
  147. echo $"Public certificate for $CHECK_HOSTNAME was not created"
  148. exit 5328
  149. fi
  150. fi
  151. if [ ! -f /etc/ssl/certs/$1.dhparam ]; then
  152. echo $"Diffie–Hellman parameters for $CHECK_HOSTNAME were not created"
  153. exit 5989
  154. fi
  155. }
  156. function create_site_certificate {
  157. SITE_DOMAIN_NAME="$1"
  158. # if yes then only "valid" certs are allowed, not self-signed
  159. NO_SELF_SIGNED='no'
  160. if [ $2 ]; then
  161. NO_SELF_SIGNED="$2"
  162. fi
  163. if [[ $ONION_ONLY == "no" ]]; then
  164. if [ ! -f /etc/ssl/certs/$SITE_DOMAIN_NAME.dhparam ]; then
  165. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  166. ${PROJECT_NAME}-addcert -h $SITE_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  167. function_check check_certificates
  168. check_certificates $SITE_DOMAIN_NAME
  169. else
  170. ${PROJECT_NAME}-addcert -e $SITE_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  171. if [ ! "$?" = "0" ]; then
  172. if [[ $NO_SELF_SIGNED == 'no' ]]; then
  173. echo $"Lets Encrypt failed for $SITE_DOMAIN_NAME, so try making a self-signed cert"
  174. ${PROJECT_NAME}-addcert -h $SITE_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  175. function_check check_certificates
  176. check_certificates $SITE_DOMAIN_NAME
  177. else
  178. echo $"Lets Encrypt failed for $SITE_DOMAIN_NAME"
  179. exit 682529
  180. fi
  181. else
  182. function_check check_certificates
  183. check_certificates $SITE_DOMAIN_NAME 'yes'
  184. fi
  185. fi
  186. fi
  187. fi
  188. }
  189. # script to automatically renew any Let's Encrypt certificates
  190. function letsencrypt_renewals {
  191. if [[ $ONION_ONLY != "no" ]]; then
  192. return
  193. fi
  194. renewals_script=/etc/cron.monthly/letsencrypt
  195. renewals_retry_script=/etc/cron.daily/letsencrypt
  196. renewal_failure_msg=$'The certificate for $LETSENCRYPT_DOMAIN could not be renewed'
  197. renewal_email_title=$'${PROJECT_NAME} Lets Encrypt certificate renewal'
  198. # the main script tries to renew once per month
  199. echo '#!/bin/bash' > $renewals_script
  200. echo '' >> $renewals_script
  201. echo "PROJECT_NAME='${PROJECT_NAME}'" >> $renewals_script
  202. echo 'COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt' >> $renewals_script
  203. echo '' >> $renewals_script
  204. echo 'if [ -d /etc/letsencrypt ]; then' >> $renewals_script
  205. echo ' if [ -f ~/letsencrypt_failed ]; then' >> $renewals_script
  206. echo ' rm ~/letsencrypt_failed' >> $renewals_script
  207. echo ' fi' >> $renewals_script
  208. echo -n ' ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | ' >> $renewals_script
  209. echo -n "awk -F ':' '{print " >> $renewals_script
  210. echo -n '$2' >> $renewals_script
  211. echo "}')" >> $renewals_script
  212. echo ' ADMIN_EMAIL_ADDRESS=$ADMIN_USERNAME@$HOSTNAME' >> $renewals_script
  213. echo ' for d in /etc/letsencrypt/live/*/ ; do' >> $renewals_script
  214. echo -n ' LETSENCRYPT_DOMAIN=$(echo "$d" | ' >> $renewals_script
  215. echo -n "awk -F '/' '{print " >> $renewals_script
  216. echo -n '$5' >> $renewals_script
  217. echo "}')" >> $renewals_script
  218. echo ' if [ -f /etc/nginx/sites-available/$LETSENCRYPT_DOMAIN ]; then' >> $renewals_script
  219. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt' >> $renewals_script
  220. echo ' if [ ! "$?" = "0" ]; then' >> $renewals_script
  221. echo " echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt" >> $renewals_script
  222. echo ' echo "" >> ~/temp_renewletsencrypt.txt' >> $renewals_script
  223. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt' >> $renewals_script
  224. echo -n " cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" " >> $renewals_script
  225. echo '$ADMIN_EMAIL_ADDRESS' >> $renewals_script
  226. echo ' rm ~/temp_renewletsencrypt.txt' >> $renewals_script
  227. echo ' if [ ! -f ~/letsencrypt_failed ]; then' >> $renewals_script
  228. echo ' touch ~/letsencrypt_failed' >> $renewals_script
  229. echo ' fi' >> $renewals_script
  230. echo ' fi' >> $renewals_script
  231. echo ' fi' >> $renewals_script
  232. echo ' done' >> $renewals_script
  233. echo 'fi' >> $renewals_script
  234. chmod +x $renewals_script
  235. # a secondary script keeps trying to renew after a failure
  236. echo '#!/bin/bash' > $renewals_retry_script
  237. echo '' >> $renewals_retry_script
  238. echo "PROJECT_NAME='${PROJECT_NAME}'" >> $renewals_retry_script
  239. echo 'COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt' >> $renewals_retry_script
  240. echo '' >> $renewals_retry_script
  241. echo 'if [ -d /etc/letsencrypt ]; then' >> $renewals_retry_script
  242. echo ' if [ -f ~/letsencrypt_failed ]; then' >> $renewals_retry_script
  243. echo ' rm ~/letsencrypt_failed' >> $renewals_retry_script
  244. echo -n ' ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | ' >> $renewals_retry_script
  245. echo -n "awk -F ':' '{print " >> $renewals_retry_script
  246. echo -n '$2' >> $renewals_retry_script
  247. echo "}')" >> $renewals_retry_script
  248. echo ' ADMIN_EMAIL_ADDRESS=$ADMIN_USERNAME@$HOSTNAME' >> $renewals_retry_script
  249. echo ' for d in /etc/letsencrypt/live/*/ ; do' >> $renewals_retry_script
  250. echo -n ' LETSENCRYPT_DOMAIN=$(echo "$d" | ' >> $renewals_retry_script
  251. echo -n "awk -F '/' '{print " >> $renewals_retry_script
  252. echo -n '$5' >> $renewals_retry_script
  253. echo "}')" >> $renewals_retry_script
  254. echo ' if [ -f /etc/nginx/sites-available/$LETSENCRYPT_DOMAIN ]; then' >> $renewals_retry_script
  255. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt' >> $renewals_retry_script
  256. echo ' if [ ! "$?" = "0" ]; then' >> $renewals_retry_script
  257. echo " echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt" >> $renewals_retry_script
  258. echo ' echo "" >> ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  259. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  260. echo -n " cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" " >> $renewals_retry_script
  261. echo '$ADMIN_EMAIL_ADDRESS' >> $renewals_retry_script
  262. echo ' rm ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  263. echo ' if [ ! -f ~/letsencrypt_failed ]; then' >> $renewals_retry_script
  264. echo ' touch ~/letsencrypt_failed' >> $renewals_retry_script
  265. echo ' fi' >> $renewals_retry_script
  266. echo ' fi' >> $renewals_retry_script
  267. echo ' fi' >> $renewals_retry_script
  268. echo ' done' >> $renewals_retry_script
  269. echo ' fi' >> $renewals_retry_script
  270. echo 'fi' >> $renewals_retry_script
  271. chmod +x $renewals_retry_script
  272. }
  273. function configure_php {
  274. sed -i "s/memory_limit = 128M/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/fpm/php.ini
  275. sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php5/fpm/php.ini
  276. sed -i "s/memory_limit = -1/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/cli/php.ini
  277. sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 50M/g" /etc/php5/fpm/php.ini
  278. sed -i "s/post_max_size = 8M/post_max_size = 50M/g" /etc/php5/fpm/php.ini
  279. }
  280. function install_web_server_access_control {
  281. if [ ! -f /etc/pam.d/nginx ]; then
  282. echo '#%PAM-1.0' > /etc/pam.d/nginx
  283. echo '@include common-auth' >> /etc/pam.d/nginx
  284. echo '@include common-account' >> /etc/pam.d/nginx
  285. echo '@include common-session' >> /etc/pam.d/nginx
  286. fi
  287. }
  288. function install_dynamicdns {
  289. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  290. return
  291. fi
  292. if [[ $ONION_ONLY != "no" ]]; then
  293. return
  294. fi
  295. # update to the next commit
  296. function_check set_repo_commit
  297. set_repo_commit $INSTALL_DIR/inadyn "inadyn commit" "$INADYN_COMMIT" $INADYN_REPO
  298. if grep -Fxq "install_dynamicdns" $COMPLETION_FILE; then
  299. return
  300. fi
  301. # Here we compile from source because the current package
  302. # doesn't support https, which could result in passwords
  303. # being leaked
  304. # Debian version 1.99.4-1
  305. # https version 1.99.8
  306. apt-get -y install build-essential curl libgnutls28-dev automake1.11
  307. if [ ! -d $INSTALL_DIR/inadyn ]; then
  308. git_clone $INADYN_REPO $INSTALL_DIR/inadyn
  309. fi
  310. if [ ! -d $INSTALL_DIR/inadyn ]; then
  311. echo 'inadyn repo not cloned'
  312. echo -n | openssl s_client -showcerts -connect github.com:443 -CApath /etc/ssl/certs
  313. exit 6785
  314. fi
  315. cd $INSTALL_DIR/inadyn
  316. git checkout $INADYN_COMMIT -b $INADYN_COMMIT
  317. if ! grep -q "inadyn commit" $COMPLETION_FILE; then
  318. echo "inadyn commit:$INADYN_COMMIT" >> $COMPLETION_FILE
  319. else
  320. sed -i "s/inadyn commit.*/inadyn commit:$INADYN_COMMIT/g" $COMPLETION_FILE
  321. fi
  322. ./configure
  323. if [ ! "$?" = "0" ]; then
  324. exit 74890
  325. fi
  326. USE_OPENSSL=1 make
  327. if [ ! "$?" = "0" ]; then
  328. exit 74858
  329. fi
  330. make install
  331. if [ ! "$?" = "0" ]; then
  332. exit 3785
  333. fi
  334. # create an unprivileged user
  335. #useradd -r -s /bin/false debian-inadyn
  336. # create a configuration file
  337. echo 'background' > /etc/inadyn.conf
  338. echo 'verbose 1' >> /etc/inadyn.conf
  339. echo 'period 300' >> /etc/inadyn.conf
  340. echo 'startup-delay 60' >> /etc/inadyn.conf
  341. echo 'cache-dir /run/inadyn' >> /etc/inadyn.conf
  342. echo 'logfile /dev/null' >> /etc/inadyn.conf
  343. chmod 600 /etc/inadyn.conf
  344. echo '[Unit]' > /etc/systemd/system/inadyn.service
  345. echo 'Description=inadyn (DynDNS updater)' >> /etc/systemd/system/inadyn.service
  346. echo 'After=network.target' >> /etc/systemd/system/inadyn.service
  347. echo '' >> /etc/systemd/system/inadyn.service
  348. echo '[Service]' >> /etc/systemd/system/inadyn.service
  349. echo 'ExecStart=/usr/local/sbin/inadyn --config /etc/inadyn.conf' >> /etc/systemd/system/inadyn.service
  350. echo 'Restart=always' >> /etc/systemd/system/inadyn.service
  351. echo 'Type=forking' >> /etc/systemd/system/inadyn.service
  352. echo '' >> /etc/systemd/system/inadyn.service
  353. echo '[Install]' >> /etc/systemd/system/inadyn.service
  354. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/inadyn.service
  355. systemctl enable inadyn
  356. systemctl start inadyn
  357. systemctl daemon-reload
  358. echo 'install_dynamicdns' >> $COMPLETION_FILE
  359. }
  360. function install_web_server {
  361. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  362. return
  363. fi
  364. # update to the next commit
  365. function_check set_repo_commit
  366. set_repo_commit $INSTALL_DIR/nginx_ensite "Nginx-ensite commit" "$NGINX_ENSITE_COMMIT" $NGINX_ENSITE_REPO
  367. if grep -Fxq "install_web_server" $COMPLETION_FILE; then
  368. return
  369. fi
  370. # remove apache
  371. apt-get -y remove --purge apache2
  372. if [ -d /etc/apache2 ]; then
  373. rm -rf /etc/apache2
  374. fi
  375. # install nginx
  376. apt-get -y install nginx php5-fpm git
  377. # limit the number of php processes
  378. sed -i 's/; process.max =.*/process.max = 32/g' /etc/php5/fpm/php-fpm.conf
  379. #sed -i 's/;process_control_timeout =.*/process_control_timeout = 300/g' /etc/php5/fpm/php-fpm.conf
  380. if ! grep -q "pm.max_children" /etc/php5/fpm/php-fpm.conf; then
  381. echo 'pm.max_children = 10' >> /etc/php5/fpm/php-fpm.conf
  382. echo 'pm.start_servers = 2' >> /etc/php5/fpm/php-fpm.conf
  383. echo 'pm.min_spare_servers = 2' >> /etc/php5/fpm/php-fpm.conf
  384. echo 'pm.max_spare_servers = 5' >> /etc/php5/fpm/php-fpm.conf
  385. echo 'pm.max_requests = 50' >> /etc/php5/fpm/php-fpm.conf
  386. fi
  387. if [ ! -d /etc/nginx ]; then
  388. echo $"ERROR: nginx does not appear to have installed. $CHECK_MESSAGE"
  389. exit 51
  390. fi
  391. # Nginx settings
  392. echo 'user www-data;' > /etc/nginx/nginx.conf
  393. #echo "worker_processes; $CPU_CORES" >> /etc/nginx/nginx.conf
  394. echo 'pid /run/nginx.pid;' >> /etc/nginx/nginx.conf
  395. echo '' >> /etc/nginx/nginx.conf
  396. echo 'events {' >> /etc/nginx/nginx.conf
  397. echo ' worker_connections 50;' >> /etc/nginx/nginx.conf
  398. echo ' # multi_accept on;' >> /etc/nginx/nginx.conf
  399. echo '}' >> /etc/nginx/nginx.conf
  400. echo '' >> /etc/nginx/nginx.conf
  401. echo 'http {' >> /etc/nginx/nginx.conf
  402. echo ' # limit the number of connections per single IP' >> /etc/nginx/nginx.conf
  403. echo ' limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;' >> /etc/nginx/nginx.conf
  404. echo '' >> /etc/nginx/nginx.conf
  405. echo ' # limit the number of requests for a given session' >> /etc/nginx/nginx.conf
  406. echo ' limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=140r/s;' >> /etc/nginx/nginx.conf
  407. echo '' >> /etc/nginx/nginx.conf
  408. echo ' # if the request body size is more than the buffer size, then the entire (or partial) request body is written into a temporary file' >> /etc/nginx/nginx.conf
  409. echo ' client_body_buffer_size 128k;' >> /etc/nginx/nginx.conf
  410. echo '' >> /etc/nginx/nginx.conf
  411. echo ' # headerbuffer size for the request header from client, its set for testing purpose' >> /etc/nginx/nginx.conf
  412. echo ' client_header_buffer_size 3m;' >> /etc/nginx/nginx.conf
  413. echo '' >> /etc/nginx/nginx.conf
  414. echo ' # maximum number and size of buffers for large headers to read from client request' >> /etc/nginx/nginx.conf
  415. echo ' large_client_header_buffers 4 256k;' >> /etc/nginx/nginx.conf
  416. echo '' >> /etc/nginx/nginx.conf
  417. echo ' # read timeout for the request body from client, its set for testing purpose' >> /etc/nginx/nginx.conf
  418. echo ' client_body_timeout 3m;' >> /etc/nginx/nginx.conf
  419. echo '' >> /etc/nginx/nginx.conf
  420. echo ' # how long to wait for the client to send a request header, its set for testing purpose' >> /etc/nginx/nginx.conf
  421. echo ' client_header_timeout 3m;' >> /etc/nginx/nginx.conf
  422. echo '' >> /etc/nginx/nginx.conf
  423. echo ' ##' >> /etc/nginx/nginx.conf
  424. echo ' # Basic Settings' >> /etc/nginx/nginx.conf
  425. echo ' ##' >> /etc/nginx/nginx.conf
  426. echo '' >> /etc/nginx/nginx.conf
  427. echo ' sendfile on;' >> /etc/nginx/nginx.conf
  428. echo ' tcp_nopush on;' >> /etc/nginx/nginx.conf
  429. echo ' tcp_nodelay on;' >> /etc/nginx/nginx.conf
  430. echo ' keepalive_timeout 65;' >> /etc/nginx/nginx.conf
  431. echo ' types_hash_max_size 2048;' >> /etc/nginx/nginx.conf
  432. echo ' server_tokens off;' >> /etc/nginx/nginx.conf
  433. echo '' >> /etc/nginx/nginx.conf
  434. echo ' # server_names_hash_bucket_size 64;' >> /etc/nginx/nginx.conf
  435. echo ' # server_name_in_redirect off;' >> /etc/nginx/nginx.conf
  436. echo '' >> /etc/nginx/nginx.conf
  437. echo ' include /etc/nginx/mime.types;' >> /etc/nginx/nginx.conf
  438. echo ' default_type application/octet-stream;' >> /etc/nginx/nginx.conf
  439. echo '' >> /etc/nginx/nginx.conf
  440. echo ' ##' >> /etc/nginx/nginx.conf
  441. echo ' # Logging Settings' >> /etc/nginx/nginx.conf
  442. echo ' ##' >> /etc/nginx/nginx.conf
  443. echo '' >> /etc/nginx/nginx.conf
  444. echo ' access_log /var/log/nginx/access.log;' >> /etc/nginx/nginx.conf
  445. echo ' error_log /var/log/nginx/error.log;' >> /etc/nginx/nginx.conf
  446. echo '' >> /etc/nginx/nginx.conf
  447. echo ' ###' >> /etc/nginx/nginx.conf
  448. echo ' # Gzip Settings' >> /etc/nginx/nginx.conf
  449. echo ' ##' >> /etc/nginx/nginx.conf
  450. echo ' gzip on;' >> /etc/nginx/nginx.conf
  451. echo ' gzip_disable "msie6";' >> /etc/nginx/nginx.conf
  452. echo '' >> /etc/nginx/nginx.conf
  453. echo ' # gzip_vary on;' >> /etc/nginx/nginx.conf
  454. echo ' # gzip_proxied any;' >> /etc/nginx/nginx.conf
  455. echo ' # gzip_comp_level 6;' >> /etc/nginx/nginx.conf
  456. echo ' # gzip_buffers 16 8k;' >> /etc/nginx/nginx.conf
  457. echo ' # gzip_http_version 1.1;' >> /etc/nginx/nginx.conf
  458. echo ' # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;' >> /etc/nginx/nginx.conf
  459. echo '' >> /etc/nginx/nginx.conf
  460. echo ' ##' >> /etc/nginx/nginx.conf
  461. echo ' # Virtual Host Configs' >> /etc/nginx/nginx.conf
  462. echo ' ##' >> /etc/nginx/nginx.conf
  463. echo '' >> /etc/nginx/nginx.conf
  464. echo ' include /etc/nginx/conf.d/*.conf;' >> /etc/nginx/nginx.conf
  465. echo ' include /etc/nginx/sites-enabled/*;' >> /etc/nginx/nginx.conf
  466. echo '}' >> /etc/nginx/nginx.conf
  467. # install a script to easily enable and disable nginx virtual hosts
  468. if [ ! -d $INSTALL_DIR ]; then
  469. mkdir $INSTALL_DIR
  470. fi
  471. cd $INSTALL_DIR
  472. function_check git_clone
  473. git_clone $NGINX_ENSITE_REPO $INSTALL_DIR/nginx_ensite
  474. cd $INSTALL_DIR/nginx_ensite
  475. git checkout $NGINX_ENSITE_COMMIT -b $NGINX_ENSITE_COMMIT
  476. if ! grep -q "Nginx-ensite commit" $COMPLETION_FILE; then
  477. echo "Nginx-ensite commit:$NGINX_ENSITE_COMMIT" >> $COMPLETION_FILE
  478. else
  479. sed -i "s/Nginx-ensite commit.*/Nginx-ensite commit:$NGINX_ENSITE_COMMIT/g" $COMPLETION_FILE
  480. fi
  481. make install
  482. nginx_dissite default
  483. function_check configure_firewall_for_web_access
  484. configure_firewall_for_web_access
  485. echo 'install_web_server' >> $COMPLETION_FILE
  486. }
  487. function install_command_line_browser {
  488. if grep -Fxq "install_command_line_browser" $COMPLETION_FILE; then
  489. return
  490. fi
  491. apt-get -y install elinks
  492. # set the home page
  493. if ! grep -q "WWW_HOME" /home/$MY_USERNAME/.bashrc; then
  494. if ! grep -q 'control' /home/$MY_USERNAME/.bashrc; then
  495. echo "export WWW_HOME=$DEFAULT_SEARCH" >> /home/$MY_USERNAME/.bashrc
  496. else
  497. sed -i "/control/i export WWW_HOME=$DEFAULT_SEARCH" /home/$MY_USERNAME/.bashrc
  498. fi
  499. fi
  500. echo 'install_command_line_browser' >> $COMPLETION_FILE
  501. }
  502. # NOTE: deliberately no exit 0